<form id="dlljd"></form>
        <address id="dlljd"><address id="dlljd"><listing id="dlljd"></listing></address></address>

        <em id="dlljd"><form id="dlljd"></form></em>

          <address id="dlljd"></address>
            <noframes id="dlljd">

              聯系我們 - 廣告服務 - 聯系電話:
              您的當前位置: > 關注 > > 正文

              Android中LayoutParams是什么?Android中LayoutParams總結和用法

              來源:CSDN 時間:2022-12-08 15:16:05

              日積月累第三周第四天。又是忙碌的一天,昨天看了兩集老羅的Android 視頻教程,感覺講的很基礎。繼續堅持一天一集視頻。今天上班接觸了一下Android 的LayoutParams今天加以整理和梳理。

              先查看一下API 中是如何介紹的,以搜索太多了。就挑一個ViewGroup.LayoutParams 看一下吧。

              http://developer.android.com/reference/android/view/ViewGroup.LayoutParams.html


              (資料圖片)

              LayoutParams are used by views to tell their parents how they want to be laid out. See ViewGroup Layout Attributesfor a list of all child view attributes that this class supports.

              The base LayoutParams class just describes how big the view wants to be for both width and height. For each dimension, it can specify one of:

              FILL_PARENT (renamed MATCH_PARENT in API Level 8 and higher), which means that the view wants to be as big as its parent (minus padding)WRAP_CONTENT, which means that the view wants to be just big enough to enclose its content (plus padding)an exact number There are subclasses of LayoutParams for different subclasses of ViewGroup. For example, AbsoluteLayout has its own subclass of LayoutParams which adds an X and Y value.

              Developer Guides

              For more information about creating user interface layouts, read the XML Layouts developer guide.

              我在這里看了一篇別人博客對于LayoutParams的解釋,我覺的很到位,所以就繼續拿來主義。

              其實這個LayoutParams類是用于child view(子視圖) 向 parent view(父視圖)傳達自己的意愿的一個東西(孩子想變成什么樣向其父親說明)其實子視圖父視圖可以簡單理解成 一個LinearLayout 和 這個LinearLayout里邊一個 TextView 的關系 TextView 就算LinearLayout的子視圖 child view 。需要注意的是LayoutParams只是ViewGroup的一個內部類這里邊這個也就是ViewGroup里邊這個LayoutParams類是 base class 基類實際上每個不同的ViewGroup都有自己的LayoutParams子類 比如LinearLayout 也有自己的 LayoutParams 大家打開源碼看幾眼就知道了 myeclipse 怎么查看源碼 請看http://byandby.iteye.com/blog/814277 下邊來個例子

              Java代碼 :       //創建一個線性布局          private LinearLayout mLayout;             mLayout = (LinearLayout) findViewById(R.id.layout);            //現在我要往mLayout里邊添加一個TextView         //你可能會想直接在布局文件里邊配置不就O 了 那是 但是這里為了說明問題我們用代碼實現         TextView textView = new TextView(Activity01.this);                 textView.setText("Text View " );              //這里請不要困惑這里是設置 這個textView的布局 FILL_PARENT WRAP_CONTENT 和在xml文件里邊設置是一樣的如       //在xml里邊怎么配置高寬大家都會的。     //第一個參數為寬的設置,第二個參數為高的設置。              LinearLayout.LayoutParams p = new LinearLayout.LayoutParams(                         LinearLayout.LayoutParams.FILL_PARENT,                         LinearLayout.LayoutParams.WRAP_CONTENT                 );                 //調用addView()方法增加一個TextView到線性布局中              mLayout.addView(textView, p);                //比較簡單的一個例子

              如果還不能理解下邊在來一段直白的說明: LayoutParams繼承于Android.View.ViewGroup.LayoutParams. LayoutParams相當于一個Layout的信息包,它封裝了Layout的位置、高、寬等信息。假設在屏幕上一塊區域是由一個Layout占領的,如果將一個View添加到一個Layout中,最好告訴Layout用戶期望的布局方式,也就是將一個認可的layoutParams傳遞進去。 可以這樣去形容LayoutParams,在象棋的棋盤上,每個棋子都占據一個位置,也就是每個棋子都有一個位置的信息,如這個棋子在4行4列,這里的“4行4列”就是棋子的LayoutParams。 但LayoutParams類也只是簡單的描述了寬高,寬和高都可以設置成三種值: 1,一個確定的值; 2,FILL_PARENT,即填滿(和父容器一樣大?。? 3,WRAP_CONTENT,即包裹住組件就好。

              關于setLayoutParams報錯

              在繼承BaseAdapter的時候,用getView返回View的時候,用代碼控制布局,需要用到View.setLayoutParams,但是報錯了,報的是類型轉換錯誤,經過研究,發現,這里不能使用ViewGroup.LayoutParams而必須使用對應父View的LayoutParams類型。如:某View被LinearLayout包含,則該View的setLayoutParams參數類型必須是LinearLayout.LayoutParams。原因在于LinearLayout(或其他繼承自ViewGroup的layout,如:RelativeLayout)在進行遞歸布局的時候,LinearLayout會獲取子View的LayoutParams,并強制轉換成LinearLayout.LayoutParams,如

              1 LinearLayout.LayoutParams lp  =  (LinearLayout.LayoutParams) child.getLayoutParams();

              或者是如下定義:

              1 LayoutParams lp  =  (LayoutParams) child.getLayoutParams();

              以轉換成內部類型LinearLayout.LayoutParams。

              自己測試運行的時候報空指針,原因為child.getLayoutParams();這里沒有獲得到子控件所在的布局,查看代碼發現parent.addView(child);應該寫在上面,之后child才能getLayoutParams();

              點擊PopupWindow 外部區域消失 //view 是自定義的點擊PopupWindow 樣式 pop = new PopupWindow(view, ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);                 pop.setBackgroundDrawable(new BitmapDrawable());                 pop.setOutsideTouchable(true); pop = new PopupWindow(view, ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);                 pop.setBackgroundDrawable(new BitmapDrawable());                 pop.setOutsideTouchable(true); 上面兩句位置不能顛倒,不然無效!(經本機測試 不知道別人如何)必須設置backgroundDrawable()

              WindowManager.LayoutParams 是 WindowManager 接口的嵌套類;繼承于 ViewGroup.LayoutParams 。          它的內容十分豐富。其實WindowManager.java的主要內容就是由這個類定義構成。下面來分析一下這個類:          定義          public static class WindowManager.LayoutParams extends ViewGroup.LayoutParams implements Parcelable          繼承關系         java.lang.Object         android.view.ViewGroup.LayoutParams         android.view.WindowManager.LayoutParams         繼承來的屬性與常量         從ViewManager.LayoutParams 繼承來的屬性:         android:layout_height         Specifies the basic height of the view.         android:layout_width         Specifies the basic width of the view.         從ViewManager.LayoutParams繼承的常量:         FILL_PARENT         WRAP_CONTENT         MATCH_PARENT         兩個變量:         width         height         屬性及可用的常量定義        1. public int x;        如果忽略gravity屬性,那么它表示窗口的絕對X位置。        什么是gravity屬性呢?簡單地說,就是窗口如何??俊?       當設置了 Gravity.LEFT 或 Gravity.RIGHT 之后,x值就表示到特定邊的距離。        2. public int y;        如果忽略gravity屬性,那么它表示窗口的絕對Y位置。        當設置了 Gravity.TOP 或 Gravity.BOTTOM 之后,y值就表示到特定邊的距離。        3. public float horizontalWeight;        public float verticalWeight;        在縱/橫向上,為關聯的view預留了多少擴展空間(像素)。如果是0,那么此view不能被拉伸。        其他情況下,擴展空間(像素)將被widget所均分。        4. public int type;         窗口類型。         有3種主要類型:         Applicationwindows:         取值在 FIRST_APPLICATION_WINDOW 和 LAST_APPLICATION_WINDOW 之間。         是通常的、頂層的應用程序窗口。必須將 token 設置成 activity 的 token 。        Sub_windows:         取值在 FIRST_SUB_WINDOW 和 LAST_SUB_WINDOW 之間。         與頂層窗口相關聯,token 必須設置為它所附著的宿主窗口的 token。         Systemwindows:         取值在 FIRST_SYSTEM_WINDOW 和 LAST_SYSTEM_WINDOW 之間。         用于特定的系統功能。它不能用于應用程序,使用時需要特殊權限。         下面定義了 type 的取值:

              //應用程序窗口。 public static final int FIRST_APPLICATION_WINDOW = 1;  //所有程序窗口的“基地”窗口,其他應用程序窗口都顯示在它上面。  public static final int TYPE_BASE_APPLICATION =1; //普通應用功能程序窗口。token必須設置為Activity的token,以指出該窗口屬誰。 public static final int TYPE_APPLICATION = 2; //用于應用程序啟動時所顯示的窗口。應用本身不要使用這種類型。 //它用于讓系統顯示些信息,直到應用程序可以開啟自己的窗口。  public static final int TYPE_APPLICATION_STARTING = 3;  //應用程序窗口結束。 public static final int LAST_APPLICATION_WINDOW = 99; //子窗口。子窗口的Z序和坐標空間都依賴于他們的宿主窗口。 public static final int FIRST_SUB_WINDOW = 1000; //面板窗口,顯示于宿主窗口上層。 public static final int TYPE_APPLICATION_PANEL = FIRST_SUB_WINDOW; //媒體窗口,例如視頻。顯示于宿主窗口下層。 public static final int TYPE_APPLICATION_MEDIA = FIRST_SUB_WINDOW+1; //應用程序窗口的子面板。顯示于所有面板窗口的上層。(GUI的一般規律,越“子”越靠上) public static final int TYPE_APPLICATION_SUB_PANEL = FIRST_SUB_WINDOW +2; //對話框。類似于面板窗口,繪制類似于頂層窗口,而不是宿主的子窗口。 public static final int TYPE_APPLICATION_ATTACHED_DIALOG = FIRST_SUB_WINDOW +3; //媒體信息。顯示在媒體層和程序窗口之間,需要實現透明(半透明)效果。(例如顯示字幕) public static final int TYPE_APPLICATION_MEDIA_OVERLAY = FIRST_SUB_WINDOW +4; //子窗口結束。( End of types of sub-windows ) public static final int LAST_SUB_WINDOW = 1999; //系統窗口。非應用程序創建。 public static final int FIRST_SYSTEM_WINDOW = 2000; //狀態欄。只能有一個狀態欄;它位于屏幕頂端,其他窗口都位于它下方。 public static final int TYPE_STATUS_BAR = FIRST_SYSTEM_WINDOW; //搜索欄。只能有一個搜索欄;它位于屏幕上方。 public static final int TYPE_SEARCH_BAR = FIRST_SYSTEM_WINDOW+1; //電話窗口。它用于電話交互(特別是呼入)。它置于所有應用程序之上,狀態欄之下。 public static final int TYPE_PHONE = FIRST_SYSTEM_WINDOW+2; //系統提示。它總是出現在應用程序窗口之上。 public static final int TYPE_SYSTEM_ALERT = FIRST_SYSTEM_WINDOW +3; //鎖屏窗口。 public static final int TYPE_KEYGUARD = FIRST_SYSTEM_WINDOW +4; //信息窗口。用于顯示toast。 public static final int TYPE_TOAST = FIRST_SYSTEM_WINDOW +5; //系統頂層窗口。顯示在其他一切內容之上。此窗口不能獲得輸入焦點,否則影響鎖屏。 public static final int TYPE_SYSTEM_OVERLAY = FIRST_SYSTEM_WINDOW +6; //電話優先,當鎖屏時顯示。此窗口不能獲得輸入焦點,否則影響鎖屏。 public static final int TYPE_PRIORITY_PHONE = FIRST_SYSTEM_WINDOW +7; //系統對話框。(例如音量調節框)。 public static final int TYPE_SYSTEM_DIALOG = FIRST_SYSTEM_WINDOW +8; //鎖屏時顯示的對話框。 public static final int TYPE_KEYGUARD_DIALOG = FIRST_SYSTEM_WINDOW +9; //系統內部錯誤提示,顯示于所有內容之上。 public static final int TYPE_SYSTEM_ERROR = FIRST_SYSTEM_WINDOW +10; //內部輸入法窗口,顯示于普通UI之上。應用程序可重新布局以免被此窗口覆蓋。 public static final int TYPE_INPUT_METHOD = FIRST_SYSTEM_WINDOW +11; //內部輸入法對話框,顯示于當前輸入法窗口之上。 public static final int TYPE_INPUT_METHOD_DIALOG= FIRST_SYSTEM_WINDOW +12; //墻紙窗口。 public static final int TYPE_WALLPAPER = FIRST_SYSTEM_WINDOW +13; //狀態欄的滑動面板。 public static final int TYPE_STATUS_BAR_PANEL = FIRST_SYSTEM_WINDOW +14; //系統窗口結束。 public static final int LAST_SYSTEM_WINDOW = 2999;  5. public int memoryType;        指出窗口所使用的內存緩沖類型。默認為 NORMAL 。        下面定義了 memoryType 的取值:        窗口緩沖位于主內存。        public static final int MEMORY_TYPE_NORMAL = 0;        窗口緩沖位于可以被DMA訪問,或者硬件加速的內存區域。        public static final int MEMORY_TYPE_HARDWARE = 1;        窗口緩沖位于可被圖形加速器訪問的區域。        public static final int MEMORY_TYPE_GPU = 2;        窗口緩沖不擁有自己的緩沖區,不能被鎖定。緩沖區由本地方法提供。        public static final int MEMORY_TYPE_PUSH_BUFFERS = 3;        6.  public int flags;        行為選項/旗標,默認為 none .下面定義了 flags 的取值:

              //窗口之后的內容變暗。 public static final int FLAG_DIM_BEHIND = 0x00000002; //窗口之后的內容變模糊。 public static final int FLAG_BLUR_BEHIND = 0x00000004;  不許獲得焦點。 不能獲得按鍵輸入焦點,所以不能向它發送按鍵或按鈕事件。那些時間將發送給它后面的可以獲得焦點的窗口。此選項還會設置FLAG_NOT_TOUCH_MODAL選項。設置此選項,意味著窗口不能與軟輸入法進行交互,所以它的Z序獨立于任何活動的輸入法(換句話說,它可以全屏顯示,如果需要的話,可覆蓋輸入法窗口)。要修改這一行為,可參考FLAG_ALT_FOCUSALBE_IM選項。 public static final int FLAG_NOT_FOCUSABLE = 0x00000008; //不接受觸摸屏事件。 public static final int FLAG_NOT_TOUCHABLE = 0x00000010; 當窗口可以獲得焦點(沒有設置 FLAG_NOT_FOCUSALBE 選項)時,仍然將窗口范圍之外的點設備事件(鼠標、觸摸屏)發送給后面的窗口處理。否則它將獨占所有的點設備事件,而不管它們是不是發生在窗口范圍內。 public static final int FLAG_NOT_TOUCH_MODAL = 0x00000020; 如果設置了這個標志,當設備休眠時,點擊觸摸屏,設備將收到這個第一觸摸事件。 通常第一觸摸事件被系統所消耗,用戶不會看到他們點擊屏幕有什么反應。 public static final int FLAG_TOUCHABLE_WHEN_WAKING = 0x00000040; 當此窗口為用戶可見時,保持設備常開,并保持亮度不變。 public static final int FLAG_KEEP_SCREEN_ON = 0x00000080; 窗口占滿整個屏幕,忽略周圍的裝飾邊框(例如狀態欄)。此窗口需考慮到裝飾邊框的內容。 public static final int FLAG_LAYOUT_IN_SCREEN =0x00000100; 允許窗口擴展到屏幕之外。 public static final int FLAG_LAYOUT_NO_LIMITS =0x00000200; 窗口顯示時,隱藏所有的屏幕裝飾(例如狀態條)。使窗口占用整個顯示區域。 public static final int FLAG_FULLSCREEN = 0x00000400; 此選項將覆蓋FLAG_FULLSCREEN選項,并強制屏幕裝飾(如狀態條)彈出。 public static final int FLAG_FORCE_NOT_FULLSCREEN =0x00000800; 抖動。指 對半透明的顯示方法。又稱“點透”。圖形處理較差的設備往往用“點透”替代Alpha混合。 public static final int FLAG_DITHER = 0x00001000; //不允許屏幕截圖。 public static final int FLAG_SECURE = 0x00002000; //一種特殊模式,布局參數用于指示顯示比例。 public static final int FLAG_SCALED = 0x00004000; //當屏幕有可能貼著臉時,這一選項可防止面頰對屏幕造成誤操作。 public static final int FLAG_IGNORE_CHEEK_PRESSES = 0x00008000; //當請求布局時,你的窗口可能出現在狀態欄的上面或下面,從而造成遮擋。當設置這一選項后,窗口管理器將確保窗口內容不會被裝飾條(狀態欄)蓋住。 public static final int FLAG_LAYOUT_INSET_DECOR = 0x00010000; //反轉FLAG_NOT_FOCUSABLE選項。 //如果同時設置了FLAG_NOT_FOCUSABLE選項和本選項,窗口將能夠與輸入法交互,允許輸入法窗口覆蓋; 如果FLAG_NOT_FOCUSABLE沒有設置而設置了本選項,窗口不能與輸入法交互,可以覆蓋輸入法窗口。 public static final int FLAG_ALT_FOCUSABLE_IM = 0x00020000; //如果你設置了FLAG_NOT_TOUCH_MODAL,那么當觸屏事件發生在窗口之外事,可以通過設置此標志接收到一個MotionEvent.ACTION_OUTSIDE事件。注意,你不會收到完整的down/move/up事件,只有第一次down事件時可以收到ACTION_OUTSIDE。 public static final int FLAG_WATCH_OUTSIDE_TOUCH = 0x00040000; //當屏幕鎖定時,窗口可以被看到。這使得應用程序窗口優先于鎖屏界面??膳浜螰LAG_KEEP_SCREEN_ON選項點亮屏幕并直接顯示在鎖屏界面之前。可使用FLAG_DISMISS_KEYGUARD選項直接解除非加鎖的鎖屏狀態。此選項只用于最頂層的全屏幕窗口。 public static final int FLAG_SHOW_WHEN_LOCKED = 0x00080000; //請求系統墻紙顯示在你的窗口后面。窗口必須是半透明的。 public static final int FLAG_SHOW_WALLPAPER = 0x00100000; //窗口一旦顯示出來,系統將點亮屏幕,正如用戶喚醒設備那樣。 public static final int FLAG_TURN_SCREEN_ON = 0x00200000; //解除鎖屏。只有鎖屏界面不是加密的才能解鎖。如果鎖屏界面是加密的,那么用戶解鎖之后才能看到此窗口,除非設置了FLAG_SHOW_WHEN_LOCKED選項。 public static final int FLAG_DISMISS_KEYGUARD = 0x00400000; //鎖屏界面淡出時,繼續運行它的動畫。 public static final int FLAG_KEEP_SURFACE_WHILE_ANIMATING =0x10000000; //以原始尺寸顯示窗口。用于在兼容模式下運行程序。 public static final int FLAG_COMPATIBLE_WINDOW = 0x20000000; //用于系統對話框。設置此選項的窗口將無條件獲得焦點。 public static final int FLAG_SYSTEM_ERROR = 0x40000000;       7. public int softInputMode;        軟輸入法模式選項:以下選項與 softInputMode 有關:

              //軟輸入區域是否可見。 public static final int SOFT_INPUT_MASK_STATE = 0x0f; //未指定狀態。 public static final int SOFT_INPUT_STATE_UNSPECIFIED = 0; //不要修改軟輸入法區域的狀態。 public static final int SOFT_INPUT_STATE_UNCHANGED = 1; //隱藏輸入法區域(當用戶進入窗口時)。 public static final int SOFT_INPUT_STATE_HIDDEN = 2; //當窗口獲得焦點時,隱藏輸入法區域。 public static final int SOFT_INPUT_STATE_ALWAYS_HIDDEN = 3; //顯示輸入法區域(當用戶進入窗口時)。 public static final int SOFT_INPUT_STATE_VISIBLE = 4; //當窗口獲得焦點時,顯示輸入法區域。 public static final int SOFT_INPUT_STATE_ALWAYS_VISIBLE = 5; //窗口應當主動調整,以適應軟輸入窗口。 public static final int SOFT_INPUT_MASK_ADJUST = 0xf0; //未指定狀態,系統將根據窗口內容嘗試選擇一個輸入法樣式。 public static final int SOFT_INPUT_ADJUST_UNSPECIFIED = 0x00; //當輸入法顯示時,允許窗口重新計算尺寸,使內容不被輸入法所覆蓋。 //不可與SOFT_INPUT_ADJUSP_PAN混合使用,如果兩個都沒有設置,系統將根據窗口內容自動設置一個選項。 public static final int SOFT_INPUT_ADJUST_RESIZE = 0x10; //輸入法顯示時平移窗口。它不需要處理尺寸變化,框架能夠移動窗口以確保輸入焦點可見。 //不可與SOFT_INPUT_ADJUST_RESIZE混合使用;如果兩個都沒設置,系統將根據窗口內容自動設置一個選項。 public static final int SOFT_INPUT_ADJUST_PAN = 0x20; //當用戶轉至此窗口時,由系統自動設置,所以你不要設置它。 //當窗口顯示之后該標志自動清除。 public static final int SOFT_INPUT_IS_FORWARD_NAVIGATION = 0x100;   8. public int gravity;        gravity 屬性。什么是gravity屬性呢?簡單地說,就是窗口如何停靠。        9. public float horizontalMargin;        水平邊距,容器與widget之間的距離,占容器寬度的百分率。        10. public float verticalMargin;        縱向邊距。        11. public int format;        期望的位圖格式。默認為不透明。參考android.graphics.PixelFormat。        12. public int windowAnimations;        窗口所使用的動畫設置。它必須是一個系統資源而不是應用程序資源,因為窗口管理器不能訪問應用程序。        13. public float alpha = 1.0f;        整個窗口的半透明值,1.0表示不透明,0.0表示全透明。        14. public float dimAmount = 1.0f;        當FLAG_DIM_BEHIND設置后生效。該變量指示后面的窗口變暗的程度。        1.0表示完全不透明,0.0表示沒有變暗。        15. public float screenBrightness = -1.0f;        用來覆蓋用戶設置的屏幕亮度。表示應用用戶設置的屏幕亮度。        從0到1調整亮度從暗到最亮發生變化。        16. public IBinder token = null;        窗口的標示符。( Identifier for this window. This will usually be filled in for you. )        17. public String packageName = null;        此窗口所在的包名。        18. public int screenOrientation =ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;        屏幕方向,參見android.content.pm.ActivityInfo#screenOrientation。        19. 在兼容模式下,備份/恢復參數所使用的內部緩沖區。        public int[] mCompatibilityParamsBackup = null;

              layoutanimation,顧名思義,是用來設置給viewgroup類型的animation,是子view來執行的。可以是

              [java]view plain copy android:layoutAnimation="@anim/popinlayout"    也可以是javacode的 [java]view plain copy viewgroup.setLayoutAnimation(layoutnaimationcontroller);

              和Animation類似,Layout Animation也支持Animation Listener,具體的就不多說了。layoutanimation會在View Group第一次進行布局的時候執行一次。

              具體來說,layoutanimation支持三個參數,

              1,anim就不多說了,

              2,animationOrder,這個是說子view按照什么順序來執行anim,可以使normal(正常,0-n),reverse(反序,n-0),random。一般不要太亂的還是normal

              3,delay,用于延遲的每個子view的動畫開始動畫持續時間的浮點數。越大間隔越長。0.3或者30%的字樣。

              另外,LayoutAnimationController包含一個內部類,LayoutAnimationController.AnimationParameters,這個類主要包括了count和index兩個參數。這些參數用于計算每個單獨的視圖動畫的開始時間。

              ViewGroup.LayoutParams這個類大家都一定很熟悉的,主要是height和width。其中還有一個字段,就是LayoutAnimationController.AnimationParameters,Used to animate layouts。

              layoutanimation一般可以用在listview等adapterview中,顯得比較炫一些。

              比如:

              [html]view plain copy

              listview中還有一個viewgroup的屬性,android:persistentDrawingCache

              Defines the persistence of the drawing cache. The drawing cache might be enabled by a ViewGroup for all its children in specific situations (for instance during a scrolling.) This property lets you persist the cache in memory after its initial usage. Persisting the cache consumes more memory but may prevent frequent garbage collection is the cache is created over and over again. By default the persistence is set to scrolling.

              定義繪圖的高速緩存的持久性。 繪圖緩存可能由一個 ViewGroup 在特定情況下為其所有的子類啟用,例如在一個滾動的過程中。 此屬性可以保留在內存中的緩存后其初始的使用。 堅持緩存會消耗更多的內存,但可能會阻止頻繁的垃圾回收是反復創建緩存。 默認情況下持續存在設置為滾動。

              其屬性值只有以下幾種:

              ConstantValueDescription none 0x0  The drawing cache is not persisted after use. animation 0x1  The drawing cache is persisted after a layout animation. scrolling 0x2The drawing cache is persisted after a scroll. all 0x3  The drawing cache is always persisted.

              一般默認的有scrolling屬性,我們在有layoutAnimation動畫的時候添加上animation屬性會更流通些。

              LayoutAnimationController用于為一個layout里面的控件,或者是一個ViewGroup里面的控件設置動畫效果,可以在XML文件中設置,亦可以在Java代碼中設置。

              一種直接在XML文件中設置

              1.  在res/anim文件夾下新建一個XML文件,名為list_anim_layout.xml,

              [java]view plain copy

              android:delay  子類動畫時間間隔 (延遲)   70% 也可以是一個浮點數 如“1.2”等

              android:animationOrder="random"   子類的顯示方式 random表示隨機

              android:animationOrder 的取值有

              normal0默認

              reverse1倒序

              random2隨機

              android:animation="@anim/slide_right" 表示孩子顯示時的具體動畫是什么

              說明:其中delay的單位為秒;animation為設置動畫的文件。animationOrder為進入方式

              2.  在res/anim文件夾下新建一個XML文件,名為slide_right,即上面用到的文件。

              [html]view plain copy

              顯示的效果為ListView第一次出現的時候為 item隨機出現 每個Item都是從左不可見(-100%p)的區域向右滑動到顯示的地方

              3.  在主布局文件中為控件添加如下配置:

              android:layoutAnimation="@anim/list_anim_layout",即第一步的布局文件。

              第二種設置方法:在Java代碼中設置

              1. 同上;

              2. 同上;

              4.  在Acitivty中添加如下代碼:

              //通過加載XML動畫設置文件來創建一個Animation對象;

              Animation animation=AnimationUtils.loadAnimation(this, R.anim.list_anim);

              //得到一個LayoutAnimationController對象;

              LayoutAnimationController lac=newLayoutAnimationController(animation);

              //設置控件顯示的順序;

              lac.setOrder(LayoutAnimationController.ORDER_REVERSE);

              //設置控件顯示間隔時間;

              lac.setDelay(1);

              //為ListView設置LayoutAnimationController屬性;

              datalist.setLayoutAnimation(lac);

              有兩種用法,我的通常寫在代碼中,像下面這樣:

              Java代碼   /**       * Layout動畫       *        * @return       */       protected LayoutAnimationController getAnimationController() {           int duration=300;           AnimationSet set = new AnimationSet(true);              Animation animation = new AlphaAnimation(0.0f, 1.0f);           animation.setDuration(duration);           set.addAnimation(animation);              animation = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0.0f,                   Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF,                   -1.0f, Animation.RELATIVE_TO_SELF, 0.0f);           animation.setDuration(duration);           set.addAnimation(animation);              LayoutAnimationController controller = new LayoutAnimationController(set, 0.5f);           controller.setOrder(LayoutAnimationController.ORDER_NORMAL);           return controller;       }   應用的時候只需這樣:  Java代碼   listView = (ListView) findViewById(R.id.listView);   listView.setLayoutAnimation(getAnimationController());   adapter = new ListViewAdapter(stores);   listView.setAdapter(adapter);   這樣一個簡單的LayoutAnimation就完成了。  別看到這里就以為文章就完了,以上都是些小玩意。呵呵,還有更厲害的!  你想設置更炫的動畫嗎?LayoutAnimation通常是Item一個一個的出現,有某種規律的。想讓每個Item都有自己的動畫嗎?那就繼續看下去。  Java代碼   .......   private int duration=1000;           private Animation push_left_in,push_right_in;           private Animation slide_top_to_bottom,slide_bottom_to_top;           public ListViewAdapter(ArrayListlist) {               this.list = list;               push_left_in=AnimationUtils.loadAnimation(context, R.anim.push_left_in);               push_right_in=AnimationUtils.loadAnimation(context, R.anim.push_right_in);               slide_top_to_bottom=AnimationUtils.loadAnimation(context, R.anim.slide_top_to_bottom);               slide_bottom_to_top=AnimationUtils.loadAnimation(context, R.anim.slide_bottom_to_top);           }   ........      @Override           public View getView(int position, View convertView, ViewGroup parent) {               // TODO Auto-generated method stub               ViewHodler hodler;               if (convertView == null) {                   hodler = new ViewHodler();                   convertView = LayoutInflater.from(context).inflate(                           R.layout.simple_item_7_for_main, null);                   ........                                                         convertView.setTag(hodler);                                      if (position % 2 == 0) {                       push_left_in.setDuration(duration);                       convertView.setAnimation(push_left_in);                   } else {                       push_right_in.setDuration(duration);                       convertView.setAnimation(push_right_in);                   }                                      /*if(position==0){slide_bottom_to_top.setDuration(duration);                      convertView.setAnimation(slide_bottom_to_top);                  }                  else{slide_top_to_bottom.setDuration(duration);                      convertView.setAnimation(slide_top_to_bottom);                  }*/                                  }else{                   hodler = (ViewHodler) convertView.getTag();               }   ........                                             return convertView;           }   看見上面的動畫設置了嗎?將動畫寫在getView()中,這樣可以設置很多不同的動畫。其實這不屬于LayoutAnimation的范疇了。  你可以試一下,如果設計好的話,可以有比LayoutAnimation更酷的效果。  我這里只試了兩種效果。  下面是我的動畫文件,共四個:  第一種效果:item分別從左右兩側滑入效果。  push_left_in.xml  Xml代碼   push_right_in.xml  Xml代碼   第2種效果:第一個item從下往上滑入,其他Item從上往下滑入效果,這個效果如果單個Item比較高(height)的話效果非常酷(卡牛的老版本好像用的就是這種效果)。  slide_bottom_to_top.xml  Xml代碼   slide_top_to_bottom.xml  Xml代碼   另外一篇:  這個不是我寫的。  GridView的item從上下左右飛入   Java代碼   import java.util.Random;   import android.app.Activity;   import android.content.Context;   import android.os.Bundle;   import android.view.LayoutInflater;   import android.view.View;   import android.view.View.OnClickListener;   import android.view.ViewGroup;   import android.view.animation.Animation;   import android.view.animation.TranslateAnimation;   import android.widget.BaseAdapter;   import android.widget.Button;   import android.widget.GridView;   import android.widget.ImageView;   public class ZdemoActivity extends Activity {        private GridView gv;    private Button btn;    private TranslateAnimation taLeft, taRight, taTop, taBlow;    private int[] imgList = new int[15];    private MyAdapter mAdapter;    private LayoutInflater mInflater;    @Override    public void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     setContentView(R.layout.main);     this.InitView();     this.InitAnima();     this.InitData();    }    private void InitAnima() {     // TODO Auto-generated method stub     taLeft = new TranslateAnimation(Animation.RELATIVE_TO_PARENT, 1.0f,       Animation.RELATIVE_TO_PARENT, 0.0f,       Animation.RELATIVE_TO_PARENT, 0.0f,       Animation.RELATIVE_TO_PARENT, 0.0f);     taRight = new TranslateAnimation(Animation.RELATIVE_TO_PARENT, -1.0f,       Animation.RELATIVE_TO_PARENT, 0.0f,       Animation.RELATIVE_TO_PARENT, 0.0f,       Animation.RELATIVE_TO_PARENT, 0.0f);     taTop = new TranslateAnimation(Animation.RELATIVE_TO_PARENT, 0.0f,       Animation.RELATIVE_TO_PARENT, 0.0f,       Animation.RELATIVE_TO_PARENT, 1.0f,       Animation.RELATIVE_TO_PARENT, 0.0f);     taBlow = new TranslateAnimation(Animation.RELATIVE_TO_PARENT, 0.0f,       Animation.RELATIVE_TO_PARENT, 0.0f,       Animation.RELATIVE_TO_PARENT, -1.0f,       Animation.RELATIVE_TO_PARENT, 0.0f);     taLeft.setDuration(1000);     taRight.setDuration(1000);     taTop.setDuration(1000);     taBlow.setDuration(1000);    }    private void InitData() {     // TODO Auto-generated method stub     for (int i = 0; i < 15; i++) {      imgList[i] = R.drawable.ic_launcher;     }     mAdapter = new MyAdapter();     gv.setAdapter(mAdapter);    }    private void InitView() {     // TODO Auto-generated method stub     gv = (GridView) findViewById(R.id.gridView1);     btn = (Button) findViewById(R.id.button1);     btn.setOnClickListener(new OnClickListener() {      @Override      public void onClick(View v) {       // TODO Auto-generated method stub       mAdapter = null;       mAdapter = new MyAdapter();       gv.setAdapter(mAdapter);       mAdapter.notifyDataSetChanged();      }     });     mInflater = (LayoutInflater) this       .getSystemService(Context.LAYOUT_INFLATER_SERVICE);    }    private class MyAdapter extends BaseAdapter {     @Override     public int getCount() {      // TODO Auto-generated method stub      return imgList.length;     }     @Override     public Object getItem(int position) {      // TODO Auto-generated method stub      return imgList[position];     }     @Override     public long getItemId(int position) {      // TODO Auto-generated method stub      return position;     }     @Override     public View getView(int position, View convertView, ViewGroup parent) {      // TODO Auto-generated method stub      ViewHolder holder = null;      if (convertView == null) {       convertView = mInflater.inflate(R.layout.item, null);       holder = new ViewHolder();       holder.image = (ImageView) convertView         .findViewById(R.id.imageView1);       convertView.setTag(holder);      } else {       holder = (ViewHolder) convertView.getTag();      }      int imgID = imgList[position];      holder.image.setImageResource(imgID);      Random ran = new Random();      int rand = ran.nextInt(4);      switch (rand) {      case 0:       convertView.startAnimation(taLeft);       break;      case 1:       convertView.startAnimation(taRight);       break;      case 2:       convertView.startAnimation(taTop);       break;      case 3:       convertView.startAnimation(taBlow);       break;      }      return convertView;     }     class ViewHolder {      public ImageView image;     }    }   }  一、            ViewGroup1.1         概述  定義  public abstract class ViewGroup extends View implements ViewParent, ViewManager  所在的包  import android.view.ViewGroup;  子類信息  View  |___ ViewGroup         |___ AdapterView|      |___ AbsListView         |      |      |___ GridView         |      |      |___ ListView         |      |             |___ ExpandableListView         |      |___ AbsSpinner         |             |___ Gallery         |             |___ Spinner         |___ FrameLayout         |      |___ DatePicker         |      |___ TimePicker         |      |___ MediaController         |      |___ ScrollView         |      |___ TabHost         |      |___ ViewAnimator         |             |___ ViewFlipper         |             |___ ViewSwitcher         |                    |___ ImageSwitcher         |                    |___ TextSwitcher         |___ LinearLayout         |      |___ RadioGroup         |      |___ TabWidget         |      |___ TableLayout         |      |___ TableRow         |      |___ ZoomControls         |___ RelativeLayout         |      |___ DialerFilter         |      |___ TwoLineListItem         |___ AbsoluteLayout                |___ WebView  ViewGroup繼承View,是一組view的集合,通過addView()來添加child view,removeView()、removeAllViews()等刪除child view。addView()加入的view存為數組,初始化數組大小為12,超過大小時每次增加12,每一個index對應一個view,可以通過getChildAt()、indexOfChild()來獲取view和index,getChildCount()獲取總child數。  內部類LayoutParams來管理ViewGroup的所占區域大小。  FILL_PARENT:填充滿parent的寬或高  WRAP_CONTENT:內容的實際大小加邊距  offsetChildrenTopAndBottom()、setPadding()來設置邊距。  1.2         部分方法  void addView(View child)  void addView(View child, int index)  void addView(View child, int width, int height)  void addView(View child, LayoutParams params)  void addView(View child, int index, LayoutParams params)  void removeView(View view)  void removeViewAt(int index)  void removeViews(int start, int count)  void removeAllViews()  void removeViewInLayout(View view)  void removeViewsInLayout(int start, int count)  void removeAllViewsInLayout()  增加刪除child view  void offsetChildrenTopAndBottom(int offset)  設置垂直方向頂部和底部的偏移,單位象素  int getChildCount()  int indexOfChild(View child)  View getChildAt(int index)  void setDescendantFocusability(int focusability)  int getDescendantFocusability()  ViewGroup.FOCUS_BEFORE_DESCENDANTS  先于子孫獲得focus  ViewGroup.FOCUS_AFTER_DESCENDANTS  子孫都不需要focus時viewgroup才獲得  ViewGroup.FOCUS_BLOCK_DESCENDANTS  void setClipChildren(boolean clipChildren)  void setClipToPadding(boolean clipToPadding)  true:滾動時child不可以繪制到padding區域,即剪裁掉  false:滾動時child可以繪制到padding區域  void setOnHierarchyChangeListener(OnHierarchyChangeListener listener)  設置child有add或remove時觸發的監聽器  void startLayoutAnimation()  運行動畫  void scheduleLayoutAnimation()  設置動畫狀態,刷新時運行動畫  void setLayoutAnimation(LayoutAnimationController controller)  LayoutAnimationController getLayoutAnimation()  設置布局動畫,在child第一次布局時運行動畫  void setLayoutAnimationListener(Animation.AnimationListener animationListener)  Animation.AnimationListener getLayoutAnimationListener()  設置動畫播放開始、結束、重播時觸發的監聽器  boolean isAnimationCacheEnabled()  void setAnimationCacheEnabled(boolean enabled)  boolean isAlwaysDrawnWithCacheEnabled()  void setAlwaysDrawnWithCacheEnabled(boolean always)  int getPersistentDrawingCache()  void setPersistentDrawingCache(int drawingCacheToKeep)  1.3         ViewGroup.LayoutParams  public static class LayoutParams  ViewGroup.LayoutParams  |___ ViewGroup.MarginLayoutParams  |      |___ FrameLayout.LayoutParams  |      |___ LinearLayout.LayoutParams  |      |      |___ RadioGroup.LayoutParams  |      |      |___ TableLayout.LayoutParams  |      |      |___ TableRow.LayoutParams  |      |___ RelativeLayout.LayoutParams  |___ AbsoluteLayout.LayoutParams  |___ AbsListView.LayoutParams  |___ Gallery.LayoutParams  |___ WindowManager.LayoutParams  public int width;     //指定view的寬高  public int height;  public LayoutAnimationController.AnimationParameters layoutAnimationParameters;  ViewGroup.LayoutParams.FILL_PARENT  ViewGroup.LayoutParams.WRAP_CONTENT  public LayoutParams(Context c, AttributeSet attrs)  public LayoutParams(int width, int height)  public LayoutParams(LayoutParams source)  LayoutParams()  1.4         ViewGroup. MarginLayoutParams  public static class MarginLayoutParams extends ViewGroup.LayoutParams  public int leftMargin;     //在ViewGroup.LayoutParams基礎上增加4個方向邊距  public int topMargin;  public int rightMargin;  public int bottomMargin;  public MarginLayoutParams(Context c, AttributeSet attrs)  public MarginLayoutParams(int width, int height)  public MarginLayoutParams(MarginLayoutParams source)  public MarginLayoutParams(LayoutParams source)  public void setMargins(int left, int top, int right, int bottom)          Margin        Padding、大小為設置的width, height,背景繪制的區域        實體大小  通過ViewGroup.LayoutParams設置width,height  View.setLayoutParams(ViewGroup.LayoutParams params);  通過ViewGroup.MarginLayoutParams設置margin  ViewGroup.MarginLayoutParams.setMargins(int left, int top, int right, int bottom);  ViewGroup.MarginLayoutParams.leftMargin  通過View. setPadding(int left, int top, int right, int bottom); 設置padding  白色區域大小:    width+ leftMargin+ rightMargin                              height+ topMargin+ bottomMargin  橙色區域大小:    width                              height  綠色區域大?。?   width- leftPadding- rightPadding                              height- topPadding- bottomPadding  二、            AdapterView2.1         概述  定義  public abstract class AdapterViewextends ViewGroup  包路徑  import android.widget.AdapterView;  子類信息  View  |___ ViewGroup         |___ AdapterView|___ AbsListView                |      |___ GridView                |      |___ ListView                |             |___ ExpandableListView                |___ AbsSpinner                       |___ Gallery                       |___ Spinner  AdapterView繼承ViewGroup,但AdapterView的child view由Adapter決定,不能通過addView()來添加。  setAdapter()來設置Adapter,getAdapter()獲取。  2.2         部分方法  void addView(View child)  void addView(View child, int index)  void addView(View child, LayoutParams params)  void addView(View child, int index, LayoutParams params)  void removeView(View child)  void removeViewAt(int index)  void removeAllViews()  不支持添加刪除view,使用則拋出UnsupportedOperationException異常  void setOnClickListener(OnClickListener l)  不支持,拋出異常RuntimeException  abstract T getAdapter()  abstract void setAdapter(T adapter)  設置child的數據和view  int getCount()  int getPositionForView(View view)  long getItemIdAtPosition(int position)  Object getItemAtPosition(int position)  返回Object不一定就是一個item的view,跟getAdapter().getItem(position)等效  要想獲得view應getAdapter().getView(position, convertView, parent)  abstract View getSelectedView()  int getSelectedItemPosition()  long getSelectedItemId()  Object getSelectedItem()  abstract void setSelection(int position)  int getFirstVisiblePosition()  屏幕上可見的第一項的position,部分可見也算  int getLastVisiblePosition()  屏幕上可見的最后一項的position,部分可見也算  void setFocusable(boolean focusable)  void setFocusableInTouchMode(boolean focusable)  void setOnItemClickListener(OnItemClickListener listener)  final OnItemClickListener getOnItemClickListener()  設置item點擊監聽器  boolean performItemClick(View view, int position, long id)  調用item點擊監聽器設置的回調函數  void setOnItemLongClickListener(OnItemLongClickListener listener)  final OnItemLongClickListener getOnItemLongClickListener()  設置item長按監聽器  void setOnItemSelectedListener(OnItemSelectedListener listener)  final OnItemSelectedListener getOnItemSelectedListener()  設置item被選擇時觸發的監聽器  public void setTextFilterEnabled(boolean textFilterEnabled)  public boolean isTextFilterEnabled()  開啟或關閉過濾窗口,開啟時,鍵盤輸入顯示在屏幕下方一半透明黑色區域,根據輸入過濾掉不包含輸入文字的項 二、            Adapter3.1         概述  定義  public interface Adapter  包路徑  import android.widget.Adapter;  SpinnerAdapter  ListAdapter  HeaderViewListAdapter  BaseAdapter  WrapperListAdapter  CursorAdapter  ArrayAdapterSimpleAdapter  Adapter  ResourceCursorAdapter  SimpleCursorAdapter  黑色文字為接口紅色文字為類斜體字為抽象類  子類信息  Adapter是AdapterView和數據間的橋梁,提供訪問每項數據的接口,并為每項創建一個view。  3.2         部分方法  void unregisterDataSetObserver(DataSetObserver observer);  void registerDataSetObserver(DataSetObserver observer)  注冊一個observer,當該Adapter對象的數據變化時調用。  int getCount()  Object getItem(int position)  long getItemId(int position)       boolean hasStableIds()  item的id是否穩定。穩定則數據變化時item 的id不變  View getView(int position, View convertView, ViewGroup parent)  返回顯示position項數據的view,可以手動創建一個view也可以通過xml layout文件創建。  position          第position項  convertView   可以為null,送入一個view,如果這個view不能轉換為需要顯示的view則創建一個新的view  parent            返回的view加入parent的ViewGroup  int getViewTypeCount()  getView()返回view的種數,如果都返回同一類的view則getViewTypeCount()為1  int getItemViewType(int position)  獲得position項view的類型,可以的返回值有0到getViewTypeCount() – 1和IGNORE_ITEM_VIEW_TYPE  boolean isEmpty()  是否包含有數據  ListAdapter增加  boolean isEnabled(int position)  public boolean areAllItemsEnabled()  返回false表示item不可選,不可點擊  SpinnerAdapter增加  public View getDropDownView(int position, View convertView, ViewGroup parent)  position項下拉菜單的view  3.3         ArrayAdapter  class ArrayAdapterextends BaseAdapter implements Filterable  ArrayAdapter(Context context, int textViewResourceId)  ArrayAdapter(Context context, int textViewResourceId, T[] objects)  ArrayAdapter(Context context, int textViewResourceId, Listobjects)  ArrayAdapter(Context context, int resource, int textViewResourceId)  ArrayAdapter(Context context, int resource, int textViewResourceId, T[] objects)  ArrayAdapter(Context context, int resource, int textViewResourceId, Listobjects)  context  textViewResourceId  沒有resource參數時:含有TextView 的layout文件資源ID,創建view時使用;  有resource參數時:layout文件中TextView的ID  resource  loyout文件資源ID  objects  ListView顯示的對象  SDK自帶的textViewResourceId對應的xml文件在cupcake\frameworks\base\core\res\res\layout  android.R.layout.simple_list_item_1  TextView  android.R.layout.simple_list_item_2  含有兩個TextView的TwoLineListItem  android.R.layout. simple_expandable_list_item_1  TextView  android.R.layout. simple_expandable_list_item_2  含有兩個TextView的TwoLineListItem  android.R.layout. simple_list_item_single_choice  CheckedTextView  android.R.layout. simple_list_item_multiple_choice  CheckedTextView  android.R.layout. simple_list_item_checked  CheckedTextView  void add(T object)  void insert(T object, int index)  void remove(T object)  void clear()  void notifyDataSetChanged()  void setNotifyOnChange(boolean notifyOnChange)  列表發生改變時是否自動調用notifyDataSetChanged(),設為false則需手動調用  Context getContext()  void setDropDownViewResource(int resource)  設置創建下拉菜單view需要的layout資源文件  static ArrayAdaptercreateFromResource(Context context,              int textArrayResId, int textViewResId)  Filter getFilter()  3.4         SimpleAdapter  public class SimpleAdapter extends BaseAdapter implements Filterable  public SimpleAdapter(Context context, List> data,              int resource, String[] from, int[] to)  context  data  resource  Layout文件id  from  data中Map的key  to  生成itemView的id, to[]數組大小不能超過from []的大小  public void setDropDownViewResource(int resource)  設置創建下拉菜單view需要的layout資源文件  public ViewBinder getViewBinder()  public void setViewBinder(ViewBinder viewBinder)  public static interface ViewBinder {  boolean setViewValue(View view, Object data, String textRepresentation);  }  綁定數據到view  用setViewBinder(null)的方式取消綁定  public void setViewImage(ImageView v, int value)  public void setViewImage(ImageView v, String value)  public void setViewText(TextView v, String text)  public Filter getFilter()  3.5         SimpleCursorAdapter  public class SimpleCursorAdapter extends ResourceCursorAdapter  demo  aipDemos/com.example.android.view/List2.java  List2.java,List3.java,List7.java  菜單路徑:API Demos/Views/Lists/  public SimpleCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to)  context  layout  c  Curor  from  to  public View newView(Context context, Cursor cursor, ViewGroup parent)  public View newDropDownView(Context context, Cursor cursor, ViewGroup parent)  public ViewBinder getViewBinder()  public void setViewBinder(ViewBinder viewBinder)  public void setViewImage(ImageView v, String value)  public void setViewText(TextView v, String text)  public void bindView(View view, Context context, Cursor cursor)  public int getStringConversionColumn()  public void setStringConversionColumn(int stringConversionColumn)  設置獲取from[stringConversionColumn]中數據  public CursorToStringConverter getCursorToStringConverter()  public void setCursorToStringConverter(  CursorToStringConverter cursorToStringConverter)  public static interface CursorToStringConverter {  CharSequence convertToString(Cursor cursor);  }  public CharSequence convertToString(Cursor cursor)  獲取from[stringConversionColumn]中數據  public void changeCursor(Cursor c)  3.6         HeaderViewListAdapter  public class HeaderViewListAdapter implements WrapperListAdapter, Filterable  private ListAdapter mAdapter;  ArrayListmHeaderViewInfos;  ArrayListmFooterViewInfos;  public HeaderViewListAdapter(ArrayListheaderViewInfos,  ArrayListfooterViewInfos,  ListAdapter adapter)  headerViewInfos  footerViewInfos  adapter  public class FixedViewInfo {  public View view;  public Object data;  public boolean isSelectable;  }  public int getHeadersCount()  public int getFootersCount()  public int getCount()  Header,Footer,mAdapter總item數  public boolean isEmpty()  mAdapter是否為空  public boolean removeHeader(View v)  public boolean removeFooter(View v)  public boolean areAllItemsEnabled()  public ListAdapter getWrappedAdapter()  獲取mAdapter  四、            AbsListView4.1         概述  定義  public abstract class AbsListView extends AdapterViewimplements TextWatcher,          ViewTreeObserver.OnGlobalLayoutListener, Filter.FilterListener,          ViewTreeObserver.OnTouchModeChangeListener  包路徑  import android.widget.AbsListView;  子類信息  View  |___ ViewGroup         |___ AdapterView|___ AbsListView                       |___ GridView                       |___ ListView                              |___ ExpandableListView  4.2         部分方法  void setStackFromBottom(boolean stackFromBottom)  boolean isStackFromBottom()  單列  多列  Disable  Enable  Disable  Enable  1  1  2  3  2  1  4  5  1  2  2  3  4  5  void setScrollingCacheEnabled(boolean enabled)  boolean isScrollingCacheEnabled()  設置是否緩存卷動項,緩存則需額外的內存,缺省為enable  void setCacheColorHint(int color)  int getCacheColorHint()  int getSolidColor()  緩存項背景顏色  int pointToPosition(int x, int y)  返回包含坐標(x, y)的項,沒有項包含該點則返回INVALID_POSITION  long pointToRowId(int x, int y)  void setTranscriptMode(int mode)  int getTranscriptMode()  TRANSCRIPT_MODE_DISABLED  當數據發生變化不自動滾動  TRANSCRIPT_MODE_NORMAL  當數據發生變化時,最后一項正顯示在屏幕上,自動滾動到最低端  TRANSCRIPT_MODE_ALWAYS_SCROLL  當數據發生變化時,自動滾動到最低端  void setFilterText(String filterText)  void clearTextFilter()  boolean hasTextFilter()  過濾文本  void getFocusedRect(Rect r)  獲取焦點框區域  View getSelectedView()  void setSelector(int resID)  void setSelector(Drawable sel)  Drawable getSelector()  焦點框  void setDrawSelectorOnTop(boolean onTop)  true:Selector繪制在文字之上  void setScrollIndicators(View up, View down)  void reclaimViews(Listviews)  void setRecyclerListener(RecyclerListener listener)  LayoutParams generateLayoutParams(AttributeSet attrs)  void beforeTextChanged(CharSequence s, int start, int count, int after)  void onTextChanged(CharSequence s, int start, int before, int count)  void afterTextChanged(Editable s)  五、            ListView5.1         概述  定義  public class ListView extends AbsListView  包路徑  import android.widget.ListView  子類信息  View  |___ ViewGroup         |___ AdapterView|___ AbsListView                       |___ ListView                              |___ ExpandableListView  ListView顯示為垂直可滾動的一列,所有item由ListAdapter提供。  5.2         部分方法  public ListView(Context context)  public ListView(Context context, AttributeSet attrs)  public ListView(Context context, AttributeSet attrs, int defStyle)  ListAdapter getAdapter()  void setAdapter(ListAdapter adapter)  設置listitem,adapter包含每一個item的數據并提供顯示數據的view  void addHeaderView(View v, Object data, boolean isSelectable)  void addHeaderView(View v)  在list頂端加headView,可以加多個,按添加的順序顯示。isSelectable為可否被選擇。  必須在setAdapter()前調用,否則拋出IllegalStateException異常  int getHeaderViewsCount()  獲得headerView的數量  boolean removeHeaderView(View v)  必須在setAdapter()后調用,否則拋出NullPointerException異常(運行期異常)。  void addFooterView(View v, Object data, boolean isSelectable)  void addFooterView(View v)  在list尾添加footerView,同addHeaderView()  必須在setAdapter()前后調用都可以  int getFooterViewsCount()  獲得footerView的數量  boolean removeFooterView(View v)  必須在setAdapter()后調用,否則拋出NullPointerException異常(運行期異常)。  int getChoiceMode()  void setChoiceMode(int choiceMode)  ListView. CHOICE_MODE_NONE  ListView. CHOICE_MODE_SINGLE  ListView. CHOICE_MODE_MULTIPLE  void setSelection(int position)  設置第position為選擇狀態  void setSelectionFromTop(int position, int y)  設置第position為選擇狀態,使position那項的位置在距離ListView頂端y的位置  void setSelectionAfterHeaderView()  使選擇項位置緊挨著HeaderView。  void setItemsCanFocus(boolean itemsCanFocus)  boolean getItemsCanFocus()  Drawable getDivider()  void setDivider(Drawable divider)  設置每兩個item間的分割  int getDividerHeight()  void setDividerHeight(int height)  設置每兩個item間空隙的高度  boolean isItemChecked(int position)  在單選或多選狀態下判斷第position項狀態  int getCheckedItemPosition()  在單選狀態下獲取選擇的那項,多選無效  SparseBooleanArray getCheckedItemPositions()  非單選模式下有效  void clearChoices()  清除選擇  void setItemChecked(int position, boolean value)  設置position項的狀態  Parcelable onSaveInstanceState()  void onRestoreInstanceState(Parcelable state)  boolean performItemClick(View view, int position, long id)  boolean onTouchEvent(MotionEvent ev)  boolean dispatchKeyEvent(KeyEvent event)  boolean onKeyDown(int keyCode, KeyEvent event)  boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event)  onKeyUp(int keyCode, KeyEvent event)  六、            ExpandableListView6.1         概述  定義  public class ExpandableListView extends ListView  包路徑  import android.widget.ExpandableListView;  子類信息  View  |___ ViewGroup         |___ AdapterView|___ AbsListView                       |___ ListView                              |___ ExpandableListView  ExpandableListView顯示為垂直可滾動的一列,與ListView的區別是它的item分group和child兩層,item的children可以展開顯示,也可以疊起不顯示。所有item由ExpandableListAdapter提供。  ExpandableListItem的展開與否可以用setChildIndicator()或setGroupIndicator()來設置。  注意:如果ExpandableListView的parent高度設為WRAP_CONTENT,則不能指定ExpandableListView的layout_height為WRAP_CONTENT;如果parent高度一定則可以設為WRAP_CONTENT。  6.2         部分方法  void setAdapter(ListAdapter adapter)  拋出異常RuntimeException  ListAdapter getAdapter()  只獲取groupList  void setAdapter(ExpandableListAdapter adapter)  ExpandableListAdapter getExpandableListAdapter()  設置ExpandableListView數據  boolean collapseGroup(int groupPos)  合上groupPosition組,  boolean expandGroup(int groupPos)  展開groupPosition組,是展開狀態返回true  boolean isGroupExpanded(int groupPosition)  long getExpandableListPosition(int flatListPosition)  轉換一個ListView的position(flatListPosition)為ExpandableList的packedPosition,packedPosition由ExpandableList的groupPosition和childPosition計算而來。  int getFlatListPosition(long packedPosition)  packedPosition轉換為flatListPosition,  packedPosition類型為group時packedPosition跟groupPosition相等  packedPosition類型為child時packedPosition跟child所在的group的groupPosition相等  static int getPackedPositionType(long packedPosition)  packedPosition的類型,groupPosition還是childPosition  ExpandableListView.PACKED_POSITION_TYPE_GROUP  ExpandableListView.PACKED_POSITION_TYPE_CHILD  ExpandableListView.PACKED_POSITION_TYPE_NULL  static int getPackedPositionGroup(long packedPosition)  返回groupPosition  static int getPackedPositionChild(long packedPosition)  如果packedPosition的類型是PACKED_POSITION_TYPE_CHILD,返回childPosition  static long getPackedPositionForChild(int groupPosition, int childPosition)  生成child的packedPosition  static long getPackedPositionForGroup(int groupPosition)  生成group的packedPosition  long getSelectedPosition()  long getSelectedId()  void setGroupIndicator(Drawable groupIndicator)  groupItem的標識  void setIndicatorBounds(int left, int right)  groupItem標識的位置  void setChildIndicator(Drawable childIndicator)  childItem的標識  void setChildIndicatorBounds(int left, int right)  childItem標識的位置,從left開始到right結束,right>left才顯示出來  left,right都可以指定ExpandableListView.CHILD_INDICATOR_INHERIT,繼承groupItem表識的位置,即通過setIndicatorBounds()設置的位置  void setChildDivider(Drawable childDivider)  void setSelectedGroup(int groupPosition)  boolean setSelectedChild(int groupPosition, int childPosition, boolean shouldExpandGroup)  public void setOnChildClickListener(OnChildClickListener onChildClickListener)  設置childItem點擊監聽器  public void setOnGroupClickListener(OnGroupClickListener onGroupClickListener)  設置groupItem點擊監聽器  public void setOnGroupCollapseListener (  OnGroupCollapseListener onGroupCollapseListener)  設置groupItem合上時觸發的監聽器  public void setOnGroupExpandListener (                     OnGroupExpandListener onGroupExpandListener)  設置groupItem展開時觸發的監聽器  public void setOnItemClickListener(OnItemClickListener l)  觸發ItemClick的itemPos是flatListPosition,盡量用setOnChildClickListener()和setOnGroupClickListener()代替這個方法。  6.3         ExpandableListAdapter  BaseExpandableListAdapter  CursorTreeAdapter  SimpleExpandableListAdapter  ResourceCursorTreeAdapter  ExpandableListAdapter  SimpleCursorTreeAdapter  黑色文字為接口紅色文字為類斜體字為抽象類  6.4         SimpleExpandableListAdapter  public class SimpleExpandableListAdapter extends BaseExpandableListAdapter  public SimpleExpandableListAdapter(Context context,              List> groupData, int groupLayout,              String[] groupFrom, int[] groupTo,              List>> childData,              int childLayout, String[] childFrom, int[] childTo)  public SimpleExpandableListAdapter(Context context,              List> groupData, int expandedGroupLayout,              int collapsedGroupLayout, String[] groupFrom, int[] groupTo,              List>> childData,              int childLayout, String[] childFrom, int[] childTo)  public SimpleExpandableListAdapter(Context context,              List> groupData, int expandedGroupLayout,              int collapsedGroupLayout, String[] groupFrom, int[] groupTo,              List>> childData,              int childLayout, int lastChildLayout, String[] childFrom,              int[] childTo)  groupData  grouplist數據  groupLayout  grouplist loyout資源文件  expandedGroupLayout  grouplist  collapsedGroupLayout  grouplist  groupFrom  抽取groupData的Map的哪幾列數據  groupTo  由groupFrom獲取的數據生成view的viewId  childData  childlist數據  childLayout  childlistloyout資源文件  lastChildLayout  childFrom  抽取childlist的Map的哪幾列數據  childTo  由childFrom獲取的數據生成view的viewId  public int getChildrenCount(int groupPosition)  public Object getChild(int groupPosition, int childPosition)  public long getChildId(int groupPosition, int childPosition)  public View getChildView(int groupPosition, int childPosition, boolean isLastChild,              View convertView, ViewGroup parent)  public View newChildView(boolean isLastChild, ViewGroup parent)  public int getGroupCount()  public Object getGroup(int groupPosition)  public long getGroupId(int groupPosition)  public View getGroupView(int groupPosition, boolean isExpanded, View convertView,              ViewGroup parent)  public View newGroupView(boolean isExpanded, ViewGroup parent)  public boolean isChildSelectable(int groupPosition, int childPosition)  public boolean hasStableIds()  6.5         SimpleCursorTreeAdapter  public abstract class SimpleCursorTreeAdapter extends ResourceCursorTreeAdapter  public SimpleCursorTreeAdapter(Context context, Cursor cursor, int collapsedGroupLayout,              int expandedGroupLayout, String[] groupFrom, int[] groupTo, int childLayout,              int lastChildLayout, String[] childFrom, int[] childTo)  public SimpleCursorTreeAdapter(Context context, Cursor cursor, int collapsedGroupLayout,              int expandedGroupLayout, String[] groupFrom, int[] groupTo,              int childLayout, String[] childFrom, int[] childTo)  public SimpleCursorTreeAdapter(Context context, Cursor cursor, int groupLayout,              String[] groupFrom, int[] groupTo, int childLayout, String[] childFrom,              int[] childTo)  與SimpleExpandableListAdapter不同的是List> groupData改為Cursor cursor,共有方法都類似。  七、            ListActivity7.1         概述  定義  public class ListActivity extends Activity  包路徑  import android.app.ListActivity  子類信息  Context  |___ ContextWrapper         |___ ContextThemeWrapper                |___ Activity                       |___ ListActivity  繼承Activity,封裝一個ListView成員  demo  aipDemos/com.example.android.view/List1.java  List1.java ~ List14.java  菜單路徑:API Demos/Views/Lists/  7.2         部分方法  public void onContentChanged()  public void setListAdapter(ListAdapter adapter)  public ListAdapter getListAdapter()  public void setSelection(int position)  public int getSelectedItemPosition()  public long getSelectedItemId()  public ListView getListView()  獲取ListView對象,可以使用ListView的方法  7.3         ExpandableListActivity  public class ExpandableListActivity extends Activity implements          OnCreateContextMenuListener,  ExpandableListView.OnChildClickListener, ExpandableListView.OnGroupCollapseListener,          ExpandableListView.OnGroupExpandListener  繼承Activity封裝一個ExpandableListView對象  八、            GridView8.1         概述  定義  public class GridView extends AbsListView  包路徑  import android.widget.AbsListView  子類信息  View  |___ ViewGroup         |___ AdapterView|___ AbsListView                       |___ GridView  多行多列可垂直方向滾動,只支持先行后列垂直方向滾動的模式;不支持先列后行水平方向滾動的模式  支持  不支持  1  2  3  4  5  6  7  1  4  7  2  5  3  6  demo  aipDemos/com.example.android.view/Grid1.java  Grid1.java ~ Grid2.java  菜單路徑:API Demos/Views/Grid/  8.2         部分方法  top padding  bottom padding  left padding  right padding  vertical spacing  horizontal spacing  void setVerticalSpacing(int verticalSpacing);  設置垂直方向行間距  void setHorizontalSpacing(int horizontalSpacing);  設置水平方向列間距  void setColumnWidth(int columnWidth);  設置列寬  void setNumColumns(int numColumns);  設置列數  void setGravity(int gravity);  設置item對齊方式  Gravity.TOP  Gravity.BOTTOM  Gravity.LEFT  缺省  Gravity.RIGHT  Gravity.CENTER_VERTICAL  Gravity.CENTER_HORIZONTAL  Gravity.CENTER  Gravity.FILL_VERTICAL  Gravity.FILL_HORIZONTAL  Gravity.FILL  Gravity.CLIP_VERTICAL  Gravity.CLIP_HORIZONTAL  int getStretchMode()  void setStretchMode(int stretchMode)  設置填充GridView時的方式  GridView.NO_STRETCH  使用設置的列寬和列間距排版,無視GridView的寬度  GridView.STRETCH_SPACING  拉伸列間距,根據列寬、列數和GridView的寬度計算列間距。Item+Space+Item  GridView.STRETCH_SPACING_UNIFORM  拉伸列間距,計算方式與  GridView.STRETCH_SPACING不同。  Space+Item+Space+Item+Space  GridView.STRETCH_COLUMN_WIDTH  拉伸列寬,根據列間距、列數和GridView的寬度計算列寬。  ListAdapter getAdapter()  void setAdapter(ListAdapter adapter)  設置item列表  public void setSelection(int position)  九、            AbsSpinner9.1         概述  定義  public abstract class AbsSpinner extends AdapterView包路徑  import android.widget.AbsSpinner;  子類信息  View  |___ ViewGroup         |___ AdapterView|___ AbsSpinner                       |___ Gallery                       |___ Spinner  9.2         部分方法  void setAdapter(SpinnerAdapter adapter)  SpinnerAdapter getAdapter()  void setSelection(int position, boolean animate)  void setSelection(int position)  int getCount()  int pointToPosition(int x, int y)  Parcelable onSaveInstanceState()  void onRestoreInstanceState(Parcelable state)  十、            Gallery10.1     概述  定義  public class Gallery extends AbsSpinner implements GestureDetector.OnGestureListener  包路徑  import android.widget.Gallery;  子類信息  View  |___ ViewGroup         |___ AdapterView|___ AbsSpinner                       |___ Gallery  items水平方向滾動顯示,滾動停止時選擇項停在屏幕正中。  demo  aipDemos/com.example.android.view/Gallery1.java  Gallery1.java ~ Gallery2.java  菜單路徑:API Demos/Views/Gallery/  10.2     部分方法  void setCallbackDuringFling(boolean shouldCallback)  滑動過程中是否每項都調用getOnItemSelectedListener()注冊的callback  false:最后選中的一項才調用callback  true:所有項都調用callback  void setAnimationDuration(int animationDurationMillis)  設置反彈回屏幕正中這部分的動畫時間間隔,單位毫秒,缺省為400ms。  void setSpacing(int spacing)  設置兩項之間的間距,缺省為0,單位象素  void setUnselectedAlpha(float unselectedAlpha)  設置未選中項的alpha值 0~1.0  十一、           Spinner11.1     概述  定義  public class Spinner extends AbsSpinner implements OnClickListener  包路徑  import android.widget.Spinner;  子類信息  View  |___ ViewGroup         |___ AdapterView|___ AbsSpinner                       |___ Spinner  在一個單行文本框中,同時只顯示一個有序列表中的一個項,點擊彈出一個下拉單選對話框,從中進行選擇。  系統自帶布局文件:  simple_spinner_dropdown_item.xml  simple_spinner_item.xml  demo  aipDemos/com.example.android.view/Spinner1.java  菜單路徑:API Demos/Views/Spinner/  11.2     部分方法  public int getBaseline()  public void setOnItemClickListener(OnItemClickListener l)  拋出異常RuntimeException  public boolean performClick()  彈出下拉對話框  public void onClick(DialogInterface dialog, int which)  public void setPrompt(CharSequence prompt)  public void setPromptId(int promptId)  public CharSequence getPrompt()  設置下拉菜單標題  十二、           LinearLayout12.1     概述  定義  public class LinearLayout extends ViewGroup  包路徑  import android.widget.LinearLayout;  子類信息  View  |___ ViewGroup         |___ LinearLayout                |___ RadioGroup                |___ TabWidget                |___ TableLayout                |___ TableRow                |___ ZoomControls                |___ NumberPicker  LinearLayout可以設置位水平的一行或垂直的一列,所有子元素按加入順序排列,通過setOrientation()來設置行模式還是列模式,缺省為行模式。通過setGravity()設置對齊方式。  也可以對單個子元素制定weight,允許子元素填充屏幕上的剩余空間,剩余空間安指定的比例分配。  demo  aipDemos/com.example.android.view/linear_layout_1.java  linear_layout_1.java ~ linear_layout_10.java  菜單路徑:API Demos/Views/ Layouts/LinearLayout/  12.2     部分方法  public LinearLayout(Context context)  public LinearLayout(Context context, AttributeSet attrs)  public boolean isBaselineAligned()  public void setBaselineAligned(boolean baselineAligned)  public int getBaseline()  獲取baseline距離頂端的距離,不支持baseline對齊返回-1  public int getBaselineAlignedChildIndex()  public void setBaselineAlignedChildIndex(int i)  public float getWeightSum()  public void setWeightSum(float weightSum)  public void setOrientation(int orientation)  public int getOrientation()  HORIZONTAL:行模式  VERTICAL:列模式  public void setGravity(int gravity)  public void setHorizontalGravity(int horizontalGravity)  public void setVerticalGravity(int verticalGravity)  對齊方式  public LayoutParams generateLayoutParams(AttributeSet attrs)  public static class LayoutParams extends ViewGroup.MarginLayoutParams  增加了一個參數weight  public LayoutParams(int width, int height, float weight)  比如3個layout排成一行,分別為ly1, ly2, ly3  width值分別為width1,width2,width3  FILL_PARENT的寬度為WIDTH  weight值分別為weight1, weight2, weight3  只要weight1,weight2,weight3不同時為0,則3個layout總寬度變為WIDTH  ly1的寬度為  對weight未負數,width1+width2+width3 >= WIDTH未做測試  12.3     LinearLayout.LayoutParams  public static class LayoutParams extends ViewGroup.MarginLayoutParams  public float weight;              //增加weight屬性  public int gravity = -1;  public LayoutParams(int width, int height, float weight)  12.4     RadioGroup  demo  aipDemos/com.example.android.view/RadioGroup1.java  菜單路徑:API Demos/Views/ Radio Group/  一列RadioButton  public void setOnHierarchyChangeListener(OnHierarchyChangeListener listener)  子項有變化時觸發的監聽器,增加/刪除項  public void check(int id)  設置id項為選擇  public int getCheckedRadioButtonId()  獲取選擇項的id  public void clearCheck()  清除選擇狀態  public void setOnCheckedChangeListener(OnCheckedChangeListener listener)  RadioButton狀態改變監聽器  12.5     TabWidget  通常用作TabHost的子元素,單獨使用同LinearLayout。  12.6     TableRow  通常用作TableLayout子元素,單獨使用同LinearLayout。  12.7     ZoomControls  系統帶布局文件  zoom_controls.xml  public void setOnZoomInClickListener(OnClickListener listener)  public void setOnZoomOutClickListener(OnClickListener listener)  public void setZoomSpeed(long speed)  public boolean onTouchEvent(MotionEvent event)  public void show()  淡入  public void hide()  淡出消失  public void setIsZoomInEnabled(boolean isEnabled)  public void setIsZoomOutEnabled(boolean isEnabled)  public boolean hasFocus()  十三、           TableLayout13.1     概述  定義  public class TableLayout extends LinearLayout  包路徑  import android.widget.TableLayout;  子類信息  View  |___ ViewGroup         |___ LinearLayout                |___ TableLayout  TableLayout將子元素的位置分配到行或列中,一個TableLayout由許多TableRow組成,每個TableRow都定義一個row,TableLayout不顯示row、column或cell的邊框線,每個row擁有0個或多個cell,每個cell擁有一個view對象。列可以被隱藏setColumnCollapsed(),也可以設置為伸展從而填充可利用的屏幕空間setColumnStretchable(),也可以設置為強制收縮直到表各匹配屏幕大小setColumnShrikable()。  TableLayout寬始終為FILL_PARENT,TableRow的高始終未WRAP_CONTEN。  demo  aipDemos/com.example.android.view/TableLayout1.java  TableLayout1.java ~ TableLayout12.java  菜單路徑:API Demos/Views/ Layouts/TableLayout  13.2     部分方法  public boolean isShrinkAllColumns()  public void setShrinkAllColumns(boolean shrinkAllColumns)  是否所有列可收縮  public boolean isStretchAllColumns()  public void setStretchAllColumns(boolean stretchAllColumns)  是否所有列可拉伸  public void setColumnCollapsed(int columnIndex, boolean isCollapsed)  public boolean isColumnCollapsed(int columnIndex)  columnIndex列是否隱藏,必須是TableRow的列才能隱藏  public void setColumnStretchable(int columnIndex, boolean isStretchable)  public boolean isColumnStretchable(int columnIndex)  columnIndex列是否可拉伸  public void setColumnShrinkable(int columnIndex, boolean isShrinkable)  public boolean isColumnShrinkable(int columnIndex)  columnIndex列是否可收縮  13.3     TableLayout.LayoutParams  public static class LayoutParams extends LinearLayout.LayoutParams  重載了構造函數強制設width為FILL_PARENT  13.4     TableRow.LayoutParams  public static class LayoutParams extends LinearLayout.LayoutParams  public int column;  //第幾列  public int span;      //占幾列寬  public LayoutParams(int column)  十四、           FrameLayout14.1     概述  定義  public class FrameLayout extends ViewGroup  包路徑  import android.widget.FrameLayout  子類信息  View  |___ ViewGroup         |___ FrameLayout                |___ DatePicker                |___ TimePicker                |___ MediaController                |___ ScrollView                |___ TabHost                |___ ViewAnimator                       |___ ViewFlipper                       |___ ViewSwitcher                              |___ ImageSwitcher                              |___ TextSwitcher  FrameLayout定制為屏幕上一個空白備用區域,可以在其中填充一個單一對象。所有的子元素將會固定在屏幕的左上角,不能為FrameLayout中一個子元素制定位置,后一個子元素將直接在前一個子元素之上進行覆蓋填充,把他們全部或部分擋?。ǔ呛笠粋€子元素是透明的)。  14.2     部分方法  public FrameLayout(Context context)  public FrameLayout(Context context, AttributeSet attrs)  public FrameLayout(Context context, AttributeSet attrs, int defStyle)  public void setForegroundGravity(int foregroundGravity)  設置前景對齊方式,缺省為Gravity.FILL  public Drawable getForeground()  public void setForeground(Drawable drawable)  設置drawable,drawable是一個可繪制的“設備”,drawable顯示在所有child之上  public void draw(Canvas canvas)  手動把canvas所在的view顯示出來,不用重載該函數,注意與onDraw(Canvas)的區別  public boolean gatherTransparentRegion(Region region)  public void setMeasureAllChildren(boolean measureAll)  public boolean getConsiderGoneChildrenWhenMeasuring()  public LayoutParams generateLayoutParams(AttributeSet attrs)  14.3     FrameLayout. LayoutParams  public static class LayoutParams extends MarginLayoutParams  public int gravity = -1;  public LayoutParams(Context c, AttributeSet attrs)  public LayoutParams(int width, int height)  14.4     DatePicker  由3個NumberPicker組成,系統自帶一個layout文件:  \cupcake\frameworks\base\core\res\res\layout\date_picker.xml,  這個缺省布局方式為水平LinearLayout,順序為Month/Day/Year  這個控件dayOfMont的范圍校驗做的還不好,比如當前時間是2009/3/31,月份減一后為2009/2/31,而這個日期是非法的,但設置為系統日期是可以成功的,結果為2009/3/3。  demo  aipDemos/com.example.android.view/DateWidgets1.java  DateWidgets1.java ~ DateWidgets2.java  菜單路徑:API Demos/Views/Date Widgets/  public void setEnabled(boolean enabled)  public void updateDate(int year, int monthOfYear, int dayOfMonth)  monthOfYear:0~11  year:1900~2100  dayOfMonth:1~31  public void init(int year, int monthOfYear, int dayOfMonth,              OnDateChangedListener onDateChangedListener)  public void setEnabled(boolean enabled)  public int getYear()  public int getMonth()  public int getDayOfMonth()  14.5     TimePicker  demo同上  public void setEnabled(boolean enabled)  public void setOnTimeChangedListener(  OnTimeChangedListener onTimeChangedListener)  public Integer getCurrentHour()  public void setCurrentHour(Integer currentHour)  public void setIs24HourView(Boolean is24HourView)  public boolean is24HourView()  public Integer getCurrentMinute()  public void setCurrentMinute(Integer currentMinute)  public int getBaseline()  14.6     MediaController  demo  aipDemos/com.example.android.media/VideoViewDemo.java  14.7     ScrollView  demo  aipDemos/com.example.android.view/ScrollView1.java  ScrollView1.java ~ ScrollView2.java  aipDemos/com.example.android.view/InternalSelectionScroll.java  菜單路徑:API Demos/Views/ Layouts/ScrollView/  ScrollView只支持垂直方向滾動,只能有一個子對象,這個子對象的大小可以超過屏幕大小。這個子對象不能是ListView或TextView,因這兩個view是自己管理如何滾動。這個子對象通常使用LinearLayout  public void addView(View child)  public void addView(View child, int index)  public void addView(View child, ViewGroup.LayoutParams params)  public void addView(View child, int index, ViewGroup.LayoutParams params)  只能有一個子元素,在已有一個子元素時再調用會拋出異常IllegalStateException()  public int getMaxScrollAmount()  public boolean isFillViewport()  public void setFillViewport(boolean fillViewport)  true:拉伸高度到viewport的高  public boolean isSmoothScrollingEnabled()  public void setSmoothScrollingEnabled(boolean smoothScrollingEnabled)  true:滾動過程用動畫過渡  public boolean pageScroll(int direction)  翻頁  public boolean fullScroll(int direction)  翻到底部或頂部  public boolean arrowScroll(int direction)  翻項  View.FOCUS_DOWN  View.FOCUS_UP  public final void smoothScrollBy(int dx, int dy)  相對目前位置滾動(x, y)  public final void smoothScrollTo(int x, int y)  滾動到絕對位置(x, y)  public void scrollTo(int x, int y)  無動畫效果滾動  public void fling(int velocityY)  14.8     TabHost  demo  aipDemos/com.example.android.view/Tabs1.java  Tabs1.java~ Tabs3.java  菜單路徑:API Demos/Views/ Layouts/LinearLayout/  對應TabActivity  TabHost由TabWidget,TabContent組成。  TabWidget包含多個TabSpec;TabContent是FrameLayout.  TabSpec由tag,indictor,content組成,content可以是  1.ViewId;2.intent;3.TabHost.TabContentFactory。  內部接口TabHost.TabContentFactory  public interface TabContentFactory {  View createTabContent(String tag);  }  在xml文件中定義TabHost需注意兩點:  1.TabWidget的id必須指定為"@android:id/tabs",否則會有RuntimeException2.addTab()之前需調用setup()方法,繼承TabActivity則不需要  public TabSpec newTabSpec(String tag)  創建一個tab標簽,tab標簽由3部分組成:tag文字,label文字/圖片,content  內部類TabHost.TabSpec,它的每個函數都返回this對象,便于鏈式表達,比如:  tabHost.addTab(tabHost.newTabSpec("tab1")                  .setIndicator("tab1")                  .setContent(R.id.view1));  public class TabSpec {  public TabSpec setIndicator(CharSequence label);  public TabSpec setIndicator(CharSequence label, Drawable icon);  public TabSpec setContent(int viewId);  public TabSpec setContent(TabContentFactory contentFactory);  public TabSpec setContent(Intent intent);  };  public void setup()  public void setup(LocalActivityManager activityGroup)  從xml創建TabHost 才須調setup(),如果TabSpec的content是intent需調用帶參數的setup()  public void addTab(TabSpec tabSpec)  public void clearAllTabs()  public void setCurrentTabByTag(String tag)  public void setCurrentTab(int index)  public int getCurrentTab()  public String getCurrentTabTag()  public View getCurrentTabView()  public View getCurrentView()  public TabWidget getTabWidget()  public FrameLayout getTabContentView()  public void onTouchModeChanged(boolean isInTouchMode)  public void setOnTabChangedListener(OnTabChangeListener l)  標簽變化觸發的監聽器  14.9     ViewAnimator  因FrameLayout是多個子元素占同樣的顯示區域,則在不同子元素切換顯示時可以加動畫效果。通常是當前顯示的view消失,下一個顯示的view出現。  public void setDisplayedChild(int whichChild)  public void setDisplayedChild(int whichChild)  public int getDisplayedChild()  public void showNext()  public void showPrevious()  public void addView(View child, int index, ViewGroup.LayoutParams params)  重載了該方法,在加第一個view的狀態為View.VISIBLE,之后加的view狀態都是View.GONE  public View getCurrentView()  public Animation getInAnimation()  public void setInAnimation(Animation inAnimation)  public Animation getOutAnimation()  public void setOutAnimation(Animation outAnimation)  public void setInAnimation(Context context, int resourceID)  public void setOutAnimation(Context context, int resourceID)  public void setAnimateFirstView(boolean animate)  14.10 ViewFlipper  14.11 ViewSwitcher  14.12 ImageSwitcher  demo  aipDemos/com.example.android.view/ImageSwitcher1.java  菜單路徑:API Demos/Views/ ImageSwitcher/  14.13 TextSwitcher  demo  aipDemos/com.example.android.view/TextSwitcher1.java  菜單路徑:API Demos/Views/ TextSwitcher/  十五、           RelativeLayout15.1     概述  定義  public class RelativeLayout extends ViewGroup  包路徑  import android.widget.RelativeLayout;  子類信息  View  |___ ViewGroup         |___ RelativeLayout                |___ DialerFilter                |___ TwoLineListItem  RelativeLayout的child view位置可以用相對于其他元素或父元素的位置來描述。如果Y的位置依賴于X,則X需先于Y描述。  需要注意的是不要循環依賴,比如RelativeLayout的高設為WRAP_CONTENT,其child設為ALIGN_PARENT_BOTTOM  demo  aipDemos/com.example.android.view/RelativeLayout1.java  RelativeLayout1.java ~ RelativeLayout2.java  菜單路徑:API Demos/Views/Layouts/RelativeLayout/  15.2     部分方法  public void setIgnoreGravity(int viewId)  public void setGravity(int gravity)  public void setHorizontalGravity(int horizontalGravity)  public void setVerticalGravity(int verticalGravity)  public int getBaseline()  public LayoutParams generateLayoutParams(AttributeSet attrs)  public static class LayoutParams extends ViewGroup.MarginLayoutParams  LEFT_OF              位于指定child的左邊  RIGHT_OF  ABOVE  BELOW  ALIGN_BASELINE       ALIGN_LEFT                     相對指定child的左邊對齊  ALIGN_TOP  ALIGN_RIGHT  ALIGN_BOTTOM  ALIGN_PARENT_LEFT  ALIGN_PARENT_RIGHT  ALIGN_PARENT_TOP  ALIGN_PARENT_BOTTOM  CENTER_IN_PARENT  CENTER_HORIZONTAL  CENTER_VERTICAL  15.3     RelativeLayout.LayoutParams  public static class LayoutParams extends ViewGroup.MarginLayoutParams  public boolean alignWithParent;    public LayoutParams(Context c, AttributeSet attrs)  public LayoutParams(int w, int h)  public LayoutParams(ViewGroup.LayoutParams source)  public LayoutParams(ViewGroup.MarginLayoutParams source)  public void addRule(int verb)  只用于添加相對于parent的規則,可用addRule(verb, RelativeLayout.TRUE)代替,RelativeLayout.TRUE的值為-1  public void addRule(int verb, int anchor)  verb為相對于兄弟位置,則anchor必須為有效的兄弟id設置才生效,否則無效  verb為相對于parent位置,anchor無論設為何值都生效  public int[] getRules()  15.4     DialerFilter  15.5     TwoLineListItem  十六、           AbsoluteLayout16.1     概述  定義  public class AbsoluteLayout extends ViewGroup  包路徑  import android.widget.Absolutelayout;  子類信息  View  |___ ViewGroup         |___ AbsoluteLayout                |___ WebView  AbsoluteLayout可以對其子元素指定準確的x/y坐標值,允許元素之間相互重疊,不推薦使用。  16.2     部分方法  public ViewGroup.LayoutParams generateLayoutParams(AttributeSet attrs)  16.3     AbsoluteLayout. LayoutParams  public static class LayoutParams extends ViewGroup.LayoutParams  public int x;    // 在ViewGroup.LayoutParams基礎上增加坐標(x, y)  public int y;  public LayoutParams(int width, int height, int x, int y)  public LayoutParams(Context c, AttributeSet attrs)  public LayoutParams(ViewGroup.LayoutParams source)  十七、           WebView17.1     概述  定義  public class WebView extends AbsoluteLayout          implements ViewTreeObserver.OnGlobalFocusChangeListener,          ViewGroup.OnHierarchyChangeListener  包路徑  import android.webkit.WebView;  子類信息  View  |___ ViewGroup         |___ AbsoluteLayout                |___ WebView  WebView用于顯示網頁,用于可滾動顯示的web瀏覽器或簡單顯示在線內容的Activity。用WebKit顯示網頁和在歷史記錄向前向后操作、放大縮小、搜索文字demo  aipDemos/com.example.android.view/webview_1.java  菜單路徑:API Demos/Views/WebView/  17.2     部分方法  public void clearCache(boolean includeDiskFiles)  public void goBack()  public void goForward()  public String getUrl()  public String getTitle()  public void reload()  public void loadUrl(String url)  public boolean zoomIn()  public boolean zoomOut()  public void goBackOrForward(int steps)

              在網站上搜索的時候看到了windowManager、window、viewGroup中的實現原理,看了一下,覺得不錯所以一并貼到這里來了。

              介紹addview方法,在windowManager、window、viewGroup中的實現原理。首先將介紹這些類結構關系,然后分析其內在聯系,介紹實現原理,最后介紹重要的一個參數windowManager.layoutParams。 文章預計分為三個部分。 一、首先介紹一下上述接口、類的結構

              接口:windowManager

              用來在應用與window之間的管理接口,管理窗口順序,消息等 public interface WindowManager extends android.view.ViewManager      抽象類:window

              定義窗口樣式和行為的抽象基類,用于作為頂層的view加到windowManager中。

              唯一實現了這個抽象類的是PhoneWindow,實例化PhoneWindow需要一個窗口

              public abstract class Window

              其中有一個很重要的內部類

              private class LocalWindowManager extends WindowManagerImpl.CompatModeWrapper{...};

              抽象類:viewGroup

              包含其他view的容器,layouts和view 容器的基類。

              public abstract class ViewGroup extends View implements ViewParent, ViewManager

              相關接口:ViewParent

              定義了一個view parent 的要負責的功能以及view和parent view之間的關聯

              public interface ViewParent {public void requestLayout();

              public void createContextMenu(ContextMenu menu);

              public void bringChildToFront(View child);

              .....

              }

              viewManager

              用來添加和移除activity中的view的接口 public interface ViewManager {public void addView(View view, ViewGroup.LayoutParams params);     public void updateViewLayout(View view, ViewGroup.LayoutParams params);     public void removeView(View view); } 二.他們之間的內在關系。

              1. 對于view來說,添加到viewGroup中是通過addView();方式來實現的,在addView中實際上使用的是:

              addViewInner(child, index, params, false);

              流程是: 1.首先是對子View是否已經包含到一個父容器中

              2.對子View布局參數的處理

              3.調用addInArray來添加View

              4.設置父View為當前的ViewGroup

              5.焦點的處理

              6.當前View的AttachInfo信息

              7.View樹改變的監聽

              8.子View中的mViewFlags的設置                              主要是通過    addInArray添加view,添加的實現為system.arrayCopy(....);

              2. 對于viewGroup來說,都會顯示在在一個窗口中,每個都有一個父節點mParent,,最頂上的節點也是一個viewGroup,也就是decorView。

              對于每個activity只有一個decorView也就是ViewRoot,只有一個window,window的獲取是通過下面方法獲取的。

              Window mWindow = PolicyManager.makeNewWindow(this); 復制代碼 在activity中使用setContentView(),其實是使用了 window.setContentView()完成的,window.setcontentView,

              還是通過LocalWindowManager.addView(view, params)來實現的。這里LocalWindowManager是實現了WindowManagerImpl.CompatModeWrapper

              ,本質上就是WindowManager、viewManager接口中的addvidew方法。

              3.  對于windowManager來說一個系統只有一個,它是由系統底層實現的,用于負責調度當前顯示那個窗口,消息處理我們獲得一個windowManager的方式如下: WindowManager windowManager = (WindowManager)context().getSystemService(                                     Context.WINDOW_SERVICE); 復制代碼 這里windowManager其實是一個接口,而通過getSystemService的方式。通過這個方式可以獲取很多的系統服務,比如電話、鬧鐘、電源管理等等。

              同時windowManager和幾個類之間的內在聯系如下:

              windowManager類圖關系.jpg (67.46 KB, 下載次數: 0)

              下載附件  保存到相冊

              2013-10-10 19:02 上傳

              責任編輯:

              標簽:

              相關推薦:

              精彩放送:

              新聞聚焦
              Top 中文字幕在线观看亚洲日韩