天天看點

Android中實作Bitmap在自定義View中的放大與拖動

一基本實作思路:

基于View類實作自定義View –MyImageView類。在使用View的Activity類中完成OnTouchListener接口,實作對MotionEvent事件的監聽與處理,常見的MotionEvent事件如下:

ACTION_DOWN事件,記錄平移開始點

ACTION_UP事件,結束平移事件處理

ACTION_MOVE事件,記錄平移點,計算與開始點距離,實作Bitmap平移,在多點觸控時候,計算兩點之間的距離,實作圖像放大

ACTION_POINTER_DOWN事件,計算兩點之間的距離,作為初始距離,實作圖像手勢放大時候使用。

ACTION_POINTER_UP事件,結束兩點觸控放大圖像處理

放大與拖動

基于單點觸控實作Bitmap對象在View上的拖動、并且檢測View的邊緣,防止拖動過界。基于兩個點觸控實作Bitmap對象在View上的放大、并且檢測放大倍數。基于Matrix對象實作對Bitmap在View上放大與平移變換,Matrix對象是android中實作圖像幾何變換的矩陣,支援平移、放大、縮小、錯切、旋轉等常見操作。

Bitmap對象在View中的更新與顯示

通過重載onDraw方法,使用canvas實作繪制Bitmap對象、通過view.invalidate()方法實作View的重新整理。

MyImageView類的重要方法說明:

initParameters()初始化所有需要用到的參數

setStartPoint()設定圖像平移的開始點坐标

setMovePoint()設定圖像平移的移動點坐标,然後集合開始點位置,計算它們之間的距離,進而得到Bitmap對象需要平移的兩個參數值sx、sy。其中還包括保證圖像不會越過View邊界的檢查代碼。

savePreviousResult()儲存目前的平移資料,下次可以繼續在次基礎上平移Bitmap對象。

zoomIn()根據兩個點之間的歐幾裡德距離,通過初始距離比較,得到放大比例,實作Bitmap在View對象上的放大

Matrix中關于放大與平移的API

Matrix.postScale方法與Matrix.postTranslate方法可以不改變Bitmap對象本身實作平移與放大。

二:代碼實作

自定義View類使用xml布局如下:

自定義View實作代碼如下:

Activity類中實作對View的OnTouchListener監聽與MotionEvent事件處理的代碼如下:

三:運作效果如下

Android中實作Bitmap在自定義View中的放大與拖動

繼續閱讀