導航:首頁 > 操作系統 > android判斷view可見

android判斷view可見

發布時間:2023-04-14 19:59:26

android 怎麼確定view可見

setcontentview(view1); view1.addview(view2); 1.對於控制事件今天我們只處理按鍵事件onKeyDown, 2.刷新view的方法這里主要有 invalidate(int l,int t,int r,int b) 刷新局部,四個參數分別為左、上、右、下 整個view刷新 invalidate() 刷新一個矩形區域invalidate(Rect dirty) 刷新一個特性DrawableinvalidateDrawable(Drawable drawable) 執行invalidate類的方法團敗將會設置view為無效,最終導致onDraw方法蘆或跡被重新調用。 今天的view比較簡單,大家如果在線程中刷新,除了使用handler方式外,可以在Thread中直接使用postInvalidate方法來實現。 3. 繪制View主要是onDraw()中通過形參canvas來處理,相關的繪制主要有drawRect、drawLine、drawPath等等。 view方法內部還陪並重寫了很多介面,其回調方法可以幫助我們判斷出view的位置和大小,比如onMeasure(int, int) Called to determine the size requirements for this view and all of its children。 、onLayout(boolean, int, int, int, int) Called when this view should assign a size and position to all of its children 和onSizeChanged(int, int, int, int) Called when the size of this view has changed。 具體的作用,大家可以用Logcat獲取當view變化時每個形參的變動。

Ⅱ Android中怎麼去判斷點擊事件中的View

監聽事件里就有個View參數在的,要獲取具體的什麼內容的話,採用其中的api就可以了

Ⅲ Android 判斷一個View是可以點擊的

需要隱藏時,設置View的物搭visible,後面根據visible判斷
or
你這樣就算View被別的View擋住了,也陸螞激是有可能獲取到點擊事件或者說被用戶看到的。所以這不是根本解決之道。不知道你是想測早襪什麼東西。為何要把沒有顯示在最上層的View給過濾掉

Ⅳ Android 在當前WebView打開頁面,判斷是否有

WebViewClient() { @Override public void onPageFinished(WebView view, String url) { //頁面載入完成伏前後載入下面的javascript,修改頁面中所有用target="_blank"標升汪記的url(在url前加標記為吵廳仔「newtab」) view.loadUrl("javascript: var allLinks

Ⅳ Android寶典|View必考知識點總結

我們知道,Activity 是在 ActivityThread 的 performLaunchActivity 中進行創建的,在創建完成之後就會調用其 attach 方法,它是先於 onCreate、onStart、onResume 等生命周期函數的,因此將 attach 方法作為這篇文章主線的開頭:

attach() 方法就是 new 一個 PhoneWindow 並且關聯 WindowManager。

接下來就到了 onCreate 方法:

這一步就是把我們的布局文件解析成 View 塞到 DecorView 的一個 id 為 R.id.content 的 ContentView 中,DecorView 本身是一個 FrameLayout,它還承載了 StatusBar、NavigationBar 。

然後在 handleResumeActivity 中,通過 WindowManager 的 addView 方法把 DecorView 添加進去,實際實現是 WindowManagerImpl 的 addView 方法,它裡面再通過 WindowManagerGlobal 的實例去 addView 的,在它裡面就會 new 一個 ViewRootImpl,也就是說最後是把 DecorView 傳給了 ViewRootImpl 的 setView 方法。ViewRootImpl 是 DecorView 的管理者,它負責 View 樹的測量、布局、繪制,以及通過 Choreographer 來控制 View 的刷新。

WMS 是所有 Window 窗口的管理員,負責 Window 的添加和刪除、Surface 的管理和事件派發等等,因此每一個 Activity 中的 PhoneWindow 對象如果需要顯示等操作,就必須要與 WMS 交互才能進行。

在 ViewRootImpl 的 setView 方法中,會調用 requestLayout,並且通過 WindowSession 的 addToDisplay 與 WMS 進行交互。WMS 會為每一個 Window 關聯一個 WindowStatus。

SurfaceFlinger 主要是進行 Layer 的合成和渲染。

在 WindowStatus 中,會創建 SurfaceSession,SurfaceSession 會在 Native 層構造一個 SurfaceComposerClient 對象,它是應用程序與 SurfaceFlinger 溝通的橋梁。

經過步驟四和步驟五之後,ViewRootImpl 與 WMS、SurfaceFlinger 都已經建立起連接,但此時 View 還沒顯示出來,我們知道,所有的 UI 最終都要通過 Surface 來顯示,那麼 Surface 是什麼時候創建的呢?

這就要回到前面所說的 ViewRootImpl 的 requestLayout 方法了,首先會 checkThread 檢查是否是主線程,然後調用 scheleTraversals 方法,scheleTraversals 方法會先設置同步屏障,然後通過 Choreographer 類在下一幀到來時去執行 doTraversal 方法。簡單來說,Choreographer 內部會接受來自 SurfaceFlinger 發出的 Vsync 垂直同步信號,這個信號周期一般是 16ms 左右。doTraversal 方法首先會先移除同步屏障,然後 performTraversals 真正進行 View 的繪制流程,即調用 performMeasure、performLayout、performDraw。不過在它們之前,會先調用 relayoutWindow 通過 WindowSession 與 WMS 進行交互,即把 Java 層創建的 Surface 與 Native 層的 Surface 關聯起來。

接下來就是正式繪制 View 了,從 performTraversals 開始,Measure、Layout、Draw 三步走。

第一步是獲取 DecorView 的寬高的 MeasureSpec 然後執行 performMeasure 流程。MeasureSpec 簡單來說就是一個 int 值,高 2 位表示測量模式,低 30 位用來表示大小。策略模式有三種,EXACTLY、AT_MOST、UNSPECIFIED。EXACTLY 對應為 match_parent 和具體數值的情況,表示父容器已經確定 View 的大小;AT_MOST 對應 wrap_content,表示父容器規定 View 最大隻能是 SpecSize;UNSPECIFIED 表示不限定測量模式,父容器不對 View 做任何限制,這種適用於系統內部。接著說,performMeasure 中會去調用 DecorView 的 measure 方法,這個是 View 裡面的方法並且是 final 的,它裡面會把參數透傳給 onMeasure 方法,這個方法是可以重寫的,也就是我們可以干預 View 的測量過程。在 onMeasure 中,會通過 getDefaultSize 獲取到寬高的默認值,然後調用 setMeasureDimension 將獲取的值進行設置。在 getDefaultSize 中,無論是 EXACTLY 還是 AT_MOST,都會返回 MeasureSpec 中的大小,這個 SpecSize 就是測量後的最終結果。至於 UNSPECIFIED 的情況,則會返回一個建議的最小值,這個值和子元素設置的最小值以及它的背景大小有關。從這個默認實現來看,如果我們自定義一個 View 不重寫它的 onMeasure 方法,那麼 warp_content 和 match_parent 一樣。所以 DecorView 重寫了 onMeasure 函數,它本身是一個 FrameLayout,所以最後也會調用到 FrameLayout 的 onMeasure 函數,作為一個 ViewGroup,都會遍歷子 View 並調用子 View 的 measure 方法。這樣便實現了層層遞歸調用到了每個子 View 的 onMeasure 方法進行測量。

第二步是執行 performLayout 的流程,也就是調用到 DecorView 的 layout 方法,也就是 View 裡面的方法,如果 View 大小發生變化,則會回調 onSizeChanged 方法,如果 View 狀態發生變化,則會回調 onLayout 方法,這個方法在 View 中是空實現,因此需要看 DecorView 的父容器 FrameLayout 的 onLayout 方法,這個方法就是遍歷子 View 調用其 layout 方法進行布局,子 View 的 layout 方法被調用的時候,它的 onLayout 方法又會被調用,這樣就布局完了所有的 View。

第三步就是 performDraw 方法了,裡面會調用 drawSoftware 方法,這個方法需要先通過 mSurface lockCanvas 獲取一個 Canvas 對象,作為參數傳給 DecorView 的 draw 方法。這個方法調用的是 View 的 draw 方法,先繪制 View 背景,然後繪制 View 的內容,如果有子 View 則會調用子 View 的 draw 方法,層層遞歸調用,最終完成繪制。

完成這三步之後,會在 ActivityThread 的 handleResumeActivity 最後調用 Activity 的 makeVisible,這個方法就是將 DecorView 設置為可見狀態。

https://juejin.im/post/5c67c1e16fb9a04a05403549

https://juejin.im/post/5bf16ff5f265da6141712acc

Ⅵ Android開發中如何檢測View的可見性

if(view.getVisibility()==View.VISIBLE){
說明指盯view可李逗纖見
}
if(view.getVisibility()==View.INVISIBLE){
說明view不可哪仿見
}

Ⅶ android判斷recycleview是否有沒有顯示

int aa[] = ((StaggeredGridLayoutManager)getLayoutManager()).findFirstVisibleItemPositions(null);

//達到這個叢差首橋條件就說明滑到了頂部
if(getChildAt(0).getY()==0f&&aa[0]=0)

(2)下面這個是線性布局管理器,的使用方法,得到第一個可視Item的位置,滲芹皮Item要完全可見才會有效,因此返回的參數為0說明已經到達頂部
linearLayoutManager.();

Ⅷ Android中怎麼去判斷點擊事件中的View

(1)綁定Adapter,那你需要判定View組件的子Item嗎?分別注冊AdapterView.onItemclickListener不就可以了,裡面的參數回調可御乎仔以區分點擊的是那一個鎮汪子Item;
(2)如果不需要區分子Item,給這兩個View組件分別注冊View.onClickListener就可以了;或頃亮者讓Activity實現View.onClickListener介面,在給這兩個View組件注冊監聽,然後在onClick方法里寫個switch語句,就可以按照case R.id.xxx 這樣做你想做的處理了。

Ⅸ Android 如何判斷一個View重繪或載入完成

1、view重繪時回調(即監聽函數,當view重繪完成蔽仿自動動用,需要向view的觀察者添塌粗加監聽器)。格式:

view.getViewTreeObserver().addOnDrawListener(new OnDrawListener() {

@Override

public void onDraw() {

// TODO Auto-generated method stub

}

});

2、view載入完成時回調(當view載入完成自動動用,需要向view的觀察者添加監聽器)。格式:

view.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {

@Override

public void onGlobalLayout() {

// TODO Auto-generated method stub

}

});

(9)android判斷view可見擴展閱讀:

兩種方式刷新:

1、主線程可以直接調用Invalidate()方法刷新

2、子線程可以直接調用postInvalidate()方法刷新。

API的描述 : Invalidatethe whole view. If the view is visible, onDraw(Canvas) will be called at somepoint in the future. This must be called from a UI thread. To call from anon-UI thread, call postInvalidate().。

API的描述譯文:當Invalidate()被調宏衫纖用的時候,View的OnDraw()就會被調用,Invalidate()必須是在UI線程中被調用,如果在新線程中更新視圖的就調用postInvalidate()。

Ⅹ android windowmanager 判斷是否有某個view

用橡芹IsWindow()判斷窗口句柄是否有效。u
用IsWindowVisible()判激悄斷梁鉛畢窗口是否可見。

所以這個判斷條件可以這么寫:
if (!IsWindow(hwnd) || !IsWindowVisible(hwnd)) {
// 你的代碼
}

閱讀全文

與android判斷view可見相關的資料

熱點內容
pr怎麼壓縮文件大小 瀏覽:859
查看oracle字元集命令 瀏覽:175
鋰電池增加密度 瀏覽:657
linux用戶密碼忘記 瀏覽:240
gb壓縮天然氣 瀏覽:633
圖片拼接不壓縮app 瀏覽:668
我的世界如何編程 瀏覽:84
vue反編譯代碼有問題 瀏覽:948
linuxshell字元串連接字元串 瀏覽:51
androidviewpager刷新 瀏覽:438
python編程計算平均分 瀏覽:678
加密數字貨幣市值查詢 瀏覽:692
時尚商圈app怎麼樣 瀏覽:584
stacklesspython教程 瀏覽:138
用命令行禁用135埠 瀏覽:212
linux防火牆編程 瀏覽:627
pdf閱讀器刪除 瀏覽:979
考研人如何緩解壓力 瀏覽:822
買電暖壺哪個app便宜 瀏覽:505
洛克王國忘記伺服器了怎麼辦 瀏覽:782