1. android自定義控制項 怎樣設置內邊距
自定義控制項,實質是重寫某個控制項的方法和屬性,同時也繼承父控制項的方法和屬性,比如內邊距,設置自定義控制項內邊距的方法: 在xml布局文件中使用標簽: android:padding="", android:paddingLeft="", android:paddingTop="", android:bottom="" 如果想要設置外邊距,使用下面標簽: android:layout_margin="",android:layout_marginLeft,android:layout_marginRight,android:layout_marginTop,android:layout_marginBottom
2. Android自定義控制項之可平移、縮放、旋轉圖片控制項
先上效果圖
單點拖動圖片對圖片進行平移操作。雙手縮放圖片大小和旋轉圖片到一定的角度。圖片縮放的時候 不能大於最大的縮放因子和小於最小的縮放因子。大於最大縮放因子或者小於最小縮放因子需要對圖像進行回彈。圖片旋轉的角度只能為90度的倍數,不滿足90度要進行回彈。圖片回彈要一個漸變的效果。
大體思路: 首先,Android中提供了Matrix類可以對圖像進行處理。其次,要顯示一張圖片最容易想到的就是ImageView。回彈要求漸變的過程,可以通過屬性動畫進行設置。所以大體的思路是:繼承ImageView,重寫onTouchEvent()方法,判斷事件類型,在對應的事件使用Matrix對圖像進行變換。
Matrix是一個已經封裝好的矩陣,最重要的作用就是對坐標點進行變換。
舉個栗子:
1.某個點(x0,y0,1)通過單位矩陣E映射得到的點還是(x0,y0,1)。
3.點(x0,y0,1)通過矩陣T映射得到的點就會做如下的變換
可以看到點(x0,y0,1)經過T矩陣在x軸方向上平移了dx,在y軸方向上平移了dy。
通過以上的變換可以得到具體的思路: 我們維護一個圖像對應的矩陣mCurrentMatrix,該矩陣主要是對ImageView中的圖像的各個點進行映射。ImageView在容器位置擺放完成之後,置mCurrentMatrix矩陣為單位矩陣。當onTouchEvent()方法中觸發單點觸控並且手指進行平移的時候,調用矩陣mCurrentMatrix的postTranslate(dx,dy),對mCurrentMatrix進行變換。當手指抬起,利用變換結束後的矩陣對圖像的各個點進行映射,從而得到平移變換後的圖像。同理可得,在兩只手指進行縮放旋轉的時候,我們對矩陣mCurrentMatrix進行各種變換,當縮放旋轉的事件結束再利用變換完的矩陣去映射圖像的各個點,從而得到縮放、旋轉後的圖像。
安卓自定義View進階 - Matrix原理
安卓自定義View進階 - Matrix詳解
首先理清事件的邏輯:
初始化圖像大小和位置
縮放圖像大小和控制項大小自適應,平移圖像中心和控制項中心重合
onTouchEvent()函數
平移操作
將圖像對應的矩陣進行變換。
縮放操作
mBoundRectF為記錄圖像邊界的矩形。縮放的時候選取圖像的中心進行縮放。
旋轉操作
旋轉的時候旋轉的旋轉中心也是圖像的中心
圖像中各個點的映射
調用ImageView的setImageMatrix(Matrix matrix)會讓ImageView根據設置的matrix去重新繪制圖像。
更新圖像的矩形邊界
獲得圖像的矩形,並根據矩陣映射矩形各個點的坐標。
縮放回彈
旋轉回彈
一些計算方法
要求圖像的變換是一個漸變的過程,很容易想到的就是屬性動畫。因為屬性動畫本身就是對值進行不斷set的過程。而我們維護的矩陣也是一個值,所以很自然可以想到,如果得到回彈之前的矩陣的值以及回彈之後矩陣的值,就可以根據動畫監聽器中動畫當前的系數值去改變矩陣的值。
對animator對象設置完監聽器之後,就可以在手指抬起的時候調用屬性動畫的start()方法開啟動畫。
自定義可平移、縮放、旋轉的控制項主要點有兩個方面:一是onTouchEvent()中判斷平移、旋轉、縮放的觸發條件,平移位移量、縮放比例因子、旋轉角度的計算。二是Matrix矩陣的應用。
3. Tasker beta如何實現Android 11電源菜單控制項的自定義圖塊添加
Tasker beta 5.9.4及以上版本可以通過以下步驟實現Android 11電源菜單控制項的自定義圖塊添加:
確保Tasker版本:
進入Tasker設置:
創建或選擇任務:
自定義電源菜單圖塊:
保存並應用設置:
進一步定製:
通過以上步驟,你就可以在Android 11設備上,通過Tasker beta實現電源菜單控制項的自定義圖塊添加了。
4. 【Android】自定義Spinner控制項及其使用
一、簡單使用
1. 寫選項值
在res/values/文件夾下新建一個 arrays.xml 文件:
2. 在界面文件中添加Spinner控制項
activity_main.xml 文件:
2.1 dropdown模式
效果:
2.2 dialog模式
效果:
二、自定義dropdown樣式
1. 修改點擊樣式和下拉框樣式
在res/drawable/文件夾下新建兩個文件:
(1)shape_for_custom_spinner.xml 文件(用來定義下拉框的樣式):
(2)selector_for_custom_spinner文件(用來定義Spinner控制項本身的樣式,帶選擇器,有點擊效果):
在界面文件中的Spinner控制項中引用它們:
效果:
2. 增加下劃線
在res/values/文件夾下新建一個style.xml文件:
說明: (1)customTheme——自定義主題樣式,引用它自定義下劃線才能正常顯示。 (2)customSpinnerStyle——自定義的Spinner樣式,和上面的主題樣式一樣在界面文件中引用。 (3)android:divider——分割線顏色。 (4)android:dividerHeight——分割線寬度。
在界面文件中的Spinner控制項中引用它:
效果:
三、動態配置Spinner選項
1. 刪除界面文件中引入的字元串組
即,刪除這一行:
2. 增加一個自定義的layout文件來配置列表樣式
在res/layout/文件夾下新建一個item_for_custom_spinner.xml文件:
3. 在java文件中對Spinner控制項進行配置
MainActivity.java文件:
說明: 不想自己自定義列表樣式可以選擇直接使用Android自帶的support_simple_spinner_dropdown_item 效果:
四、Spinner選擇事件
1. 增加一個簡單的選擇監聽器
可以發現有兩個問題: (1)初始化監聽器的時候事件被調用了。 (2)重復點擊同一選項事情不會被重復調用。
2. 不希望監聽器動作初始化時就被調用
辦法很簡單,就是定義一個flag用來確認監聽器是否是第一次被調用,是則忽略它:
這樣一來,界面初始化時就不會出現監聽器動作被執行了一次的情況了。
3. 不希望重復點擊同一選項時沒有動作
需要重寫Spinner控制項的部分代碼。
(1)在java/com.example.myapplication/文件夾下新建一個ReSpinner.java文件:
(2)替換掉界面文件中的控制項根名稱,其他什麼都不用動: 將
改為
這樣一來,重復點擊同一事件,也能正常多次觸發監聽器動作了。
五、自定義dialog樣式
經過上面的修改,基本已經完成了對dropdown模式下的樣式自定義和監聽器動作自定義了,將spinnerMode改回dialog,增加一個prompt標簽,增加dialog的標題:
(1)先在res/values/strings.xml文件中定義一個標題(必須步驟):
(2)再在邊界文件中引用它:
5. 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)