1. 程式人生 > >view變化監聽器ViewTreeObserver介紹

view變化監聽器ViewTreeObserver介紹

A view tree observer is used to register listeners that canbe notified of global changes in the view tree. Such global eventsinclude, but are not limited to, layout of the whole tree,beginning of the drawing pass, touch mode change.... AViewTreeObserver should never be instantiated by applications as itis provided by the views hierarchy. Refer toView.getViewTreeObserver()

for moreinformation.

從上面的描述中,不難看出,ViewTreeObserver是用來幫助我們監聽某些View的某些變化的。

在 ViewTreeObserver 中,包含了以下幾個介面:

interfaceViewTreeObserver.OnGlobalFocusChangeListener

interfaceViewTreeObserver.OnGlobalLayoutListener

interface ViewTreeObserver.OnPreDrawListener

interfaceViewTreeObserver.OnScrollChangedListener

interfaceViewTreeObserver.OnTouchModeChangeListener

本文將測試除 ViewTreeObserver.OnScrollChangedListener外的四個介面

1.    建立一個 Android Project ,修改 main.xml 使之如下:

<? xml version = "1.0" encoding = "utf-8" ?>

< LinearLayout xmlns:android= "http://schemas.android.com/apk/res/android"

android:id = "@+id/full_screen"

   android:orientation= "vertical"

   android:layout_width= "fill_parent"

   android:layout_height= "fill_parent"

>  

   

   < TextView

                  android:id = "@+id/tv_show"

           android:layout_width= "fill_parent"

           android:layout_height= "wrap_content"

           android:text = ""

           android:textSize = "32px"

           android:textColor = "#FFFF00"

   />

   

   < EditText

   android:id = "@+id/ed_enter1"

   android:layout_width= "fill_parent"

           android:layout_height= "wrap_content"

           android:text = ""

        />

        

   < EditText

   android:id = "@+id/ed_enter2"

   android:layout_width= "fill_parent"

           android:layout_height= "wrap_content"

           android:text = ""

        />

        

        < TextView

                  android:id = "@+id/tv_display"

           android:layout_width= "fill_parent"

           android:layout_height= "wrap_content"

           android:text = ""

   />

   

        < Button

                  android:id = "@+id/button"

           android:layout_width= "fill_parent"

           android:layout_height= "wrap_content"

           android:text = "OK"

   />    

</ LinearLayout >

注意:給 layout 增加一個 id : full_screen

2.    Activity 對應的 Java 程式碼如下:

public class ControlViewTreeObserver extends Activity

implements

OnClickListener,

ViewTreeObserver.OnTouchModeChangeListener,          // 用於監聽 Touch 和非 Touch 模式的轉換

ViewTreeObserver.OnGlobalLayoutListener,                     // 用於監聽佈局之類的變化,比如某個空間消失了

ViewTreeObserver.OnPreDrawListener,                              // 用於在螢幕上畫 View 之前,要做什麼額外的工作

ViewTreeObserver.OnGlobalFocusChangeListener         // 用於監聽焦點的變化

{

        private TextView tv_show ;

   private ViewTreeObserver vto ;

   private View all ;

   

   private EditText ed1 ;

   private EditText ed2 ;   

   private TextView tv_display ;

   private Button button ;

   private boolean btnClicked ;

   

   @Override

   public void onCreate(Bundle savedInstanceState)

   {

       super .onCreate(savedInstanceState);

       setContentView(R.layout. main );

       

       tv_show = (TextView) this .findViewById(R.id. tv_show );

       all = this .findViewById(R.id. full_screen );                                 // 得到整個螢幕物件 , 因為頂層 layout 的 width 和 height 都是 fill_parent

       vto = (ViewTreeObserver) all .getViewTreeObserver();         // 通過 getViewTreeObserver 獲得 ViewTreeObserver 物件

       

       tv_display = (TextView) this .findViewById(R.id. tv_display );

       ed1 = (EditText) this .findViewById(R.id. ed_enter1 );

       ed2 = (EditText) this .findViewById(R.id. ed_enter2 );

       button = (Button) this .findViewById(R.id. button );

       button .setOnClickListener( this );

       

       vto .addOnTouchModeChangeListener( this );                         // 增加對應的 Listener

       vto .addOnGlobalFocusChangeListener(this );                       // 增加對應的 Listener

       vto .addOnPreDrawListener( this );                                              // 增加對應的 Listener

       vto .addOnGlobalLayoutListener( this );                                     // 增加對應的 Listener

   }

 

   // onTouchModeChanged 是介面 ViewTreeObserver.OnTouchModeChangeListener

   // 中定義的方法。

        @Override

        public void onTouchModeChanged( boolean isInTouchMode)

        {

                  if (isInTouchMode) tv_show .setText( "In touch mode" );

                  else tv_show .setText( "Not in touch mode" );

        }

 

        // onGlobalLayout 是介面 ViewTreeObserver.OnGlobalLayoutListener

        // 中定義的方法。

        // Callback method to be invokedwhen the global layout state or the

        // visibility of views within the view treechanges

        @Override

        public void onGlobalLayout()

        {

                  if ( btnClicked )

                  {

                           if (! ed2 .isShown())

                                    ed1 .setText( " 第二個 EditText 不見了 " );

                           else

                                    ed1 .setText( " 第二個 EditText 出來了 " );

                  }

        }

 

        // onPreDraw 是介面 ViewTreeObserver.OnPreDrawListener

       // 中定義的方法。

        @Override

        public boolean onPreDraw()

        {

                  // 在螢幕上畫出 ed1 控制元件之間 , 給它增加一個提示 , 並改變其字型大小

                  ed1 .setHint( " 在 onPreDraw 方法中增加一個提示資訊 " );

                  ed1 .setTextSize(( float ) 20.0);

                  

                  //return false;   // Return true to proceed with the current drawing pass, or falseto cancel.

                  return true ;       // 如果此處不返回 true , 則整個介面不能完整顯示。

        }                                            

 

        // onGlobalFocusChanged 是介面 ViewTreeObserver.OnGlobalFocusChangeListener

        // 中定義的方法。

        // 焦點發生變化時,會觸發這個方法的執行

        @Override

        public void onGlobalFocusChanged(View oldFocus, ViewnewFocus)

        {

                  if (oldFocus != null && newFocus!= null )

                  {

                           tv_display .setText( "Focus /nFROM:/t" + oldFocus.toString() + "/n    TO:/t" + newFocus.toString());

                  }

        }

 

        @Override

        public void onClick(View v)

        {

                  // 改變 ed2 的可見性 , 會觸發 onGlobalLayout 方法的執行

                  btnClicked = true ;

                  if (v.getId() == R.id. button )

                  {

                           if ( ed2 .isShown())

                                    ed2 .setVisibility(View. INVISIBLE );

                           else

                                    ed2 .setVisibility(View. VISIBLE );

                  }

        }

}
 

3.    執行結果:

 

可以看到第一個 EditText 中存在字型發生了變化的提示資訊,這種效果是在 onPreDraw() 方法中實現的。

用滑鼠點選螢幕上的第二個 EditText ,

 

有兩個變化:

一個是有 Not in touch mode 變成了 In touch mode ,二是顯示了焦點變化方面的資訊。它們分別是 onTouchModeChanged 和 onGlobalFocusChanged 這兩個方法所輸出的資訊。

如果用模擬器右邊的鍵盤進行操作,將交掉移動到第一個 EditText ,則又會回到 Not in touch mode 的狀態。

點選 OK 按鈕,改變第二個 EditText 的可見性:

第一個 EditText 中的內容是在 onGlobalLayout 方法中設定的。

相關推薦

view變化監聽器ViewTreeObserver介紹

A view tree observer is used to register listeners that canbe notified of global changes in the view tree. Such global eventsinclude, but are not limited

Android view變化監聽器 ViewTreeObserver( oncreate獲取view資訊)

ViewTreeObserver public final class ViewTreeObserver extends Object java.lang.Object android.view.ViewTreeObserver

View.ViewTreeObserver介紹

1  /**註冊一個回撥函式,當在一個檢視樹中的焦點狀態發生改變時呼叫這個回撥函式。 2   * 引數 listener 將要被新增的回撥函式 3   *異常 IllegalStateException 如果isAlive() 返回false 4   */ 5  public

JavaWeb監聽器簡單介紹及一個登陸監聽案例

版權宣告:本文為博主原創文章,未經博主允許不得轉載。https://blog.csdn.net/qq_38720976/article/details/84474950 監聽器基本概念   JavaWeb中的監聽器是Servlet規範中定義的一種特殊類,它用於監聽web應用程式中的Servl

View&五大布局介紹

自動換行只需要將 singleLine屬性設定為false 即可; 一下是textview的所有屬性:        android:autoLink設定是否當文字為URL連結/email/電話號碼/map時,文字顯示為可點選的連結。可選值(none/web/email/phone/map/all)

Android View非常用屬性介紹

android:addStatesFromChildren (ViewGroup屬性) 當設定為true的時候,子控制元件可以獲取焦點的控制元件(比如EditText)獲取焦點的時候,呼叫addStatesFromChildren屬性的View的背景也隨著變化。 官方說

用C#實現MVC(Model View Control)模式介紹

益處     在我們的開發專案中使用MVC(Model-View-Control)模式的益處是,可以完全降低業務層和應用表示層的相互影響。此外,我們會有完全獨立的物件來操作表示層。MVC在我們專案中提供的這種物件和層之間的獨立,將使我們的維護變得更簡單使我們的程式碼重用變得

獲取View組件寬度以及ViewTreeObserver

listener urn () mod server spec style 改變 實例 View寬高測量方法: 測量方法有三種,如下: 1)(直接在onCreate()執行) int w = View.MeasureSpec.makeMeasureSpec(0,View.

【Android界面實現】View Animation 使用介紹

ref 轉載 HA ceshi 很多 ons 伸縮 ets 時間設置 ? ? 轉載請註明出處:http://blog.csdn.net/zhaokaiqiang19

View Merge 在安全控制上的變化,是 BUG 還是增強 ?

作者簡單介紹 黃瑋(Fuyuncat) 資深 Oracle DBA,致力於資料庫底層技術的研究。其作品獲得廣大同行的高度評價。 個人站點 www.HelloDBA.com 什麼是 View Merge

Aras學習筆記(16)- Aras官方專案Tree Grid View Sample原理介紹

官方專案Tree Grid View Sample是以PackageDefinition為例實現的,介紹原理前先說明下PackageDefinition的組成結構。   PackageDefinition結構分為PackageDefinition、PackageGroup和PackageElem

Android的基本元件和View和ViewGroup介紹

Android的基本元件 1.1 Activity 1.1.1 Activity代表手機的一個螢幕 1.1.2 一個Android程式由多個Activity組成,即:一個Android程式由多屏內容組成 1.1.3 Activity相當於一個展板,本身

七、View.js介紹

檢視,是使用者視覺上在裝置上看到的一頁內容,也是由View.js驅動的單頁應用的頁面區塊載體。 如下所示,ID為"view1"和"view2"的兩個DOM元素,便是兩個檢視的佈局骨架: <!DOCTYPE HTML> <html> <head

九、View.js介紹

當使用View.js構建的應用程式同時包含多個檢視時,任何情況下都只有一個檢視是可以被使用者看到的。這個當前被使用者看到的檢視,就是活動檢視。 任何情況下,活動檢視都只會有一個,而且活動檢視會隨使用者瀏覽位置的變更而發生變化。 開發者可以通過API:View.getAct

Android EditText屬性介紹及監聽內容變化

目錄 輸入相關: 顯示相關: 特殊功能 監聽EditText內容變化的兩種方式 EditText繼承關係:EditText  < TextView < View 輸入相關: 設定只接受某些字元 android:digits="123ab

十九、HTML5單頁框架View.js介紹 - 檢視跳轉(一)

檢視跳轉,是指使用者看到的介面切換為另一個介面的過程,亦即活動檢視轉移的過程。(同一時刻,只有一個檢視處於活動狀態。) 檢視跳轉時,View.js將自動調整位址列中的hash部分,使其始終反映出當前的活動檢視ID。如: http://wzhsoft.com/index.htm

Android之---ButterKnife-View注入框架(簡單介紹和在Studio中安裝)

ButterKnife-View注入框架(簡單介紹和在Studio中安裝) 1.簡單介紹 Butter Knife使用簡單介紹 作為一名Android開發,是不是經常厭煩了大量的findViewById以及setOnClickListener程式碼,而

UIView 子view跟隨父view動態變化

- (void)viewDidLoad { [super viewDidLoad]; CGRect frame = [[UIScreen mainScreen] bounds

UIView子view隨父view同步變化

一般情況下,當對父view做動畫時,我們希望得到父view內所有的子檢視跟隨著同步發生變化, 即如下的效果(注:黑色正方形為父view1,白色正方形為view1的子view2):

Android自定義View完美實現指示器位置隨進度變化的IndicateProgressView

該文章同步釋出在公眾號”LinminTech”上,請在本文最後掃碼關注,獲取更多精彩Android開發文章。 效果圖 需求 在平時開發過程中,UI經常要求實現如上圖所示的ProgressBar,但是Android系統自帶的ProgressBar