安卓實時更新圖片的控制項叫什麼
A. 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矩陣的應用。
B. 安卓桌面小部件Widget的局限性及適用性
一、Widget並不支持所有的控制項跟布局,而僅僅只是支持Android布局和控制項的一個子集。(當然也不支持自定義View)
1.支持的布局:
2.支持的控制項:
二、Widget不支持Animation動畫。
1.可以通過Bitmap、layoutAnimation和幀動畫實現動畫效果:
用這些方式雖然可以實現簡單的動效,但是非常容易產生內存溢出問題,導致OOM和閃退。歸根結底,Widget的設計是主打輕量化,需要長期放在桌面的Widget如果有大量動效,將會耗費大量系統性能和電量,這與它的設計初衷是相違背的。
2.動畫效果和方位感測器測試:
動效:使用 setImageViewBitmap 方法設置簡單的旋轉動畫,動畫會在兩基吵乎分鍾後停止播放。
感測器:在應用進入後台,執行 onStop 方法時,方位感測器會在一分鍾後停止監聽回調,此時後台Service正常運行,Widget時間正常更新,但是方位傳碰正感器不再回調監聽。(經測試,開啟前台Service才可以正常監聽)
總結:非常不建議Widget需要動畫或者調用感測器展示,在部分手機上會提示耗電異常,強制殺死程序。
三、進程保活:
進程保活涉及到的問題搏悉非常復雜,且越來越嚴格。測試了三款APP:
順歷:清除後台任務後Widget時間停止更新。
萬年歷:正常更新。
中華萬年歷:正常更新。
總結:順歷未設置保活方案,或保活失敗。
萬年歷與中華萬年歷監聽了系統時區改變廣播、時間手動設置廣播,在手動設置時間或時區後這兩個Widget也同步更新。同時還有一個時間正常流逝的廣播,系統每分鍾會發送一次,但是這個廣播在8.0系統以後不允許靜態注冊,也就是只能在APP運行的情況下才能監聽這個廣播。尚不清楚這兩個APP如何保活,或是如何在8.0以上系統監聽這個廣播,達到即便殺死後台,也能每分鍾刷新Widget時間的目的。
關鍵詞「輕量化」
1.因為Widget主打輕量化,對動效支持較差,所以Widget界面以靜態界面為主。
2.支持的布局和控制項非常少,不支持自定義View,界面以簡易布局為主。(如圖片+文字)
3.實時性要求不高。(如每日一首古詩)
4.與用戶簡單互動。(如播放器的播放、暫停、下一曲)