㈠ android 自定義控制項 layout
Android 繪制流程
View :View主要執行layout方法,使用 serFrame 方法來設置本身 View 的四個頂點的位置,確定View本身的位置。
ViewGroup :ViewGroup主要執行onLayout方法,遞歸遍歷所有子View,確定子View的位置。
我們來看ViewRootImpl中的 performLayout() 方法
看到這里,那host.getMeasuredWidth() / host.getMeasuredHeight()是什麼?它是直接調用View中的方法,其實就是經過measure後的DecorView的測量寬度和高度。在 Android 自定義控制項 measure 中有說明。
2.3.2.1 我們先來看ViewGroup中的 layout() 方法
ViewGroup裡面的layout最終會調入到父類View中的layout,View的layout後面講解。這里可以先告訴大家,最終會調用View的onLayout方法,而ViewGroup的onLayout是抽象方法,所以它的子類LinearLayout必須要實現。
2.3.2.2 我們再來看LinearLayout中的 onLayout() 方法。
2.3.2.3 挑一個縱向的吧,我們再來看LinearLayout中的 layoutVertical() 方法。
2.3.2.4 我們再來看LinearLayout中的 setChildFrame() 方法。
又一次回到了View的layout方法,接下來就看View分發的layout。
我們先來看View中的 layout() 方法。
我們先來看View中的 onLayout() 方法。
空空如也,其實View的布局由父容器決定,所以空實現是正常的,當然也可以在自定義View中進行更改。
《Android 視圖模塊 全家桶》
Android開發之自定義控制項(二)---onLayout詳解
自定義View Layout過程 - 最易懂的自定義View原理系列(3)
㈡ 如何系統的學習android自定義各種酷炫控制項
首先,為什麼需要自定義View?
1. 現有的View滿足不了你的需求,也沒有辦法從已有控制項派生一個出來;界面元素需要自己繪制。
2. 現有View可以滿足要求,把它做成自定義View只是為了抽象:為這個自定義View提供若干方法,方便調用著操縱View。通常做法是派生一個已有View,或者結合xml文件直接inflate。
目前常用的基本上是第二種方式,這種方式非常簡單,與通常的View使用方法基本相同,但是作用卻異常強大,擁有了這一層抽象,代碼更加整潔也更容易維護,通過抽取自定義View的公共操作方法也減少了冗餘代碼,雖然簡單,但不可忽視。
大多數人感覺神秘的應該是第一種,自繪控制項,完全自定義;但其實這兩種方式歸根結底全部都是自繪;不信你去看看TextView的源碼。只不過通常情況下系統幫我們繪制好了一些控制項給開發者使用;OK,接下來就是一個問題。
在講述之前我還是啰嗦地重申一下,復用已有View是最最常用也最有效的自定義View方式,必須熟練使用。
其次,如何自定義View?
想一下,一個View給用戶最直觀的感知是什麼?靜止的形態和動態的操作。靜止的形態意思就是一個View呈現到用戶眼裡長成啥樣子?動態操作指的是,用戶與View之間可以有哪些交互?點擊滑動View的不同地方會有什麼反應?
1. 靜態
如果一個自定義View的樣式都沒有辦法繪制出來,那麼後續的交互就是空談了;我們一步步分解這個問題。
1.1 你的自定義View分為哪幾個部分?是所有的部分都需要手動繪制還是只有一部分——找出需要完全自定義的部分,其他的部分用已有View實現。
1.2 你的自定義View的每個部分長成什麼樣,佔用多大空間——結合理論知識View的measure過程,比如match_parent, wrap_content結合父View的laout_params參數最終測量大小是多少?
1.3 你的自定義View每個部分擺放在哪?相對位置如何?——View的layout過程。
1.4 你的自定義View那些完全需要手動繪制的部分是什麼樣,如何繪制?
你得學會操縱Canvas,學會2D繪圖,什麼?你跟我說3D,OpenGL?學會這些再說。
㈢ android自定義控制項之文件選擇
不多說,先上圖:
列舉當前目錄下的所有文件,如果是選擇目錄,則不顯示文件,如果是選擇文件,則需要顯示文件。
新建目錄,就是在當前路徑下新建目錄,同時新建後的目錄要能夠及時顯示在文件列表中。
需要讀寫許可權,添加第三方許可權請求庫:
使用:
DialogFragment與Dialog有一些不同的地方,其中show方法需要傳入FragmentManager
另外需在onCreateVie方法初始化布局,以及獲取到控制項
另外就是RecycleView,之所以採用RecycleView,是因為發現如果用ListView,內存會不斷增加,很難降下來。
其中CommonAdapter繼承自BaseAdapter,是通用的Adapter,兼容ListView:
這一部分邏輯有FileProvider類完成; 這里需要注意的是,有些手機不支持讀取根目錄,所以改為讀取"/mnt/"作為根目錄就行讀取。
另外跳轉目錄都是改變當前路徑,然後再刷新數據。
同時在其內部定義了FileData類:
文件選擇,可以通過當前路徑路徑以及列表索引來唯一確定路徑;都是,當跳轉目錄後,索引應該重置。
這里採用WeakReference記錄選擇的控制項,但選擇其他目錄或者文件時,之前的控制項需要重置一下狀態。
https://github.com/xiaoyifan6/videocreator
該源碼主要用於圖片合成gif或者視頻,其中文件選擇彈窗是自己寫的。感覺這個彈出應該有許多地方可以用到,所以寫下這篇文章,方便以後參考查看。
㈣ Carson帶你學Android:手把手教你寫一個完整的自定義View
自定義View一共分為兩大類,具體如下圖:
對於自定義View的類型介紹及使用場景如下圖:
在使用自定義View時有很多注意點(坑),希望大家要非常留意:
View的內部本身提供了post系列的方法,完全可以替代Handler的作用,使用起來更加方便、直接。
主要針對View中含有線程或動畫的情況: 當View退出或不可見時,記得及時停止該View包含的線程和動畫,否則會造成內存泄露問題 。
當View帶有滑動嵌套情況時,必須要處理好滑動沖突,否則會嚴重影響View的顯示效果。
接下來,我將用自定義View中最常用的 繼承View 來說明自定義View的具體應用和需要注意的點
在下面的例子中,我將講解:
下面我將逐個步驟進行說明:
步驟1:創建自定義View類(繼承View類)
特別注意:
步驟2:在布局文件中添加自定義View類的組件及顯示
至此,一個基本的自定義View已經實現了,運行效果如下圖。
接下來繼續看自定義View關於屬性自定義的問題:
先來看wrap_content & match_parent屬性的區別
如果不手動設置支持 wrap_content 屬性,那麼 wrap_content 屬性是不會生效(顯示效果同 match_parent )
padding 屬性:用於設置控制項內容相對控制項邊緣的邊距;
如果不手動設置支持padding屬性,那麼padding屬性在自定義View中是不會生效的。
繪制時考慮傳入的padding屬性值(四個方向)。
除了常見的以android:開頭的系統屬性(如下所示),很多場景下自定義View還需要系統所沒有的屬性,即自定義屬性。
實現自定義屬性的步驟如下:
下面我將對每個步驟進行具體介紹
對於自定義屬性類型 & 格式如下:
至此,一個較為規范的自定義View已經完成了。
Carson_Ho的github: 自定義View的具體應用
不定期分享關於 安卓開發 的干貨,追求 短、平、快 ,但 卻不缺深度 。
㈤ 如何打造Android自定義的下拉列表框控制項
實現方式:
1、水平布局一個TextView和一個ImageView(小黑箭頭)
2、實現點擊ImageView的單擊事件,彈出PopupWindow
3、PopupWindow中實現下拉列表
關鍵代碼示例:
1、布局
<LinearLayout android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<TextView/>
<ImageView />
</LinearLayout>
2、單擊事件
image.setBackgroundResource(R.drawable.gerendang_jiantou);
image.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
//彈出popupwindow
}
});
3、pupupwindow相關代碼
ListView lv = new ListView(this);
adapter = new OptionsAdapter(context, datas); // 根據數據,設置下拉框顯示
list.setAdapter(adapter);
/**
* 兩種不同長度的下拉框,主要是為了適應屏幕的大小
*/
if (p_width > 0) {
pWindow = new PopupWindow(v, par.getWidth(), 150);
} else {
pWindow = new PopupWindow(v, par.getWidth(), 300);
}
pWindow.setFocusable(true); //能夠焦點獲得
pWindow.setBackgroundDrawable(new BitmapDrawable()); //設置背景
pWindow.setOutsideTouchable(true); //外部點擊關閉
pWindow.update(); //更新位置
㈥ Android 橫向布置控制項,縱向時間軸控制項(步驟,快遞,時間軸)
使用自定義控制項,先計算得到每個圓心的x軸坐標,然後繪制出圓心,源李鎮長條,擾罩文字
StepView.java
使用方法
ps:
使用RecyclerView通過控雹粗製item的顯示隱藏即可實現
item.xml
ativity.xml
Adapter.java