Android圖片貼紙旋轉縮放功能的實現

jopen 9年前發布 | 35K 次閱讀 Android Android開發 移動開發

我們的項目包含圖片編輯功能,特別是包含圖片添加水印貼紙的功能,從最初的簡單版可以添加一個圖片并且移動位置,到現在添加的圖片可以進行移動,以及縮放,旋轉,已經是和其他的圖片處理可以達到一樣的很好的效果了。一直想要整理一下,分享一下實現的改進過程,一直沒空,也由于我過于懶,沒有動筆。今天正好有時間,分享一下。

原始階段:直接添加ImageView,并且設置其在父view中的位置

父視圖為RelativeLayout,貼紙view就是一個ImageView,通過設置topMargin和leftMargin來設置在父視圖中顯示的位置,不支持縮放和旋轉。功能快速實現,代碼比較冗余。再有了新的需求不方便擴展。

新階段:自定義View,通過matrix變換實現各種功能

主要是定義一個View,在使用的時候放到需要用到的地方,大小設置和目標圖片相同大小。通過matrix對平移,旋轉,縮放的操作進行映射,最終改變貼紙圖片的繪制結果,因此實現目標功能。下面具體分析各個功能。

首先創建的視圖在設置完貼紙圖片之后,要創建一個浮點型數組,用于保存默認未進行任何變換的時候貼紙圖片的關鍵點,以及一個原始矩形用于保存一個默認繪制區域的矩形,用代碼表示就是:

float imgWidth = mBitmap.getWidth();
float imgHeight = mBitmap.getHeight();
float[] originPoints = new float[]{0, 0, imgWidth,0, imgWidth, imgHeight, 0, imgHeight, imgWidth/2, imgHeight/2}; //分別為矩形的四個點,與中心點
RectF mOriginRect = new RectF(0, 0, imgWidth, imgHeight);


變換后的點通過Matrix.mapPoints(newPoints, originPoints)進行映射,變換后的矩形通過Matrix.mapRect(newRect, originRect)進行映射,可以通過這些新的點畫一些附加元素。至于貼紙圖,可以通過獲取后的rect進行定位畫,也可以直接使用 canvas.drawBitmap(bitmap, matrix, paint)方法繪制。

至于如何進行變換操作,如何進行變換,則是在onTouch中處理各種觸摸事件,或者在dispatchTouchEvent。

平移

通過判斷ACTION_DOWN,ACTION_UP,判斷觸摸是否在我們的貼紙圖片上面,然后計算手指滑動的距離,可以獲取到x軸和y軸的平移距離,調用mMatrix.postTranslate(x,y),然后重新映射繪圖即可。

旋轉

以貼紙圖片的一個邊緣點為旋轉觸摸點,以貼紙圖片的中心(非貼紙view的中心),計算旋轉的角度,調用mMatrix.postRotate(rotation, px, py), px,py為貼紙圖片的中心點(為上面映射后的點,而不是原始點)。

縮放

同樣通過觸摸位置計算兩次滑動過程中的縮放比例,來通過Matrix.postScale(scale, scale, px, py)進行縮放。

其他

開始的時候沒有想到使用Matrix,進行了很多的嘗試,沒有很好的結果。最后使用了Matrix之后,則簡單很多,只是在計算縮放和旋轉的時候,因為數學沒有學好,花了很久才把數學問題搞定。

這里分享我自己的一個完整的貼紙View,開箱即用,https://github.com/sangmingming/StickerView 。如果在這方面,你又更好的實現方式,也歡迎留言,與我進行交流。

原文地址:http://blog.isming.me/2015/05/10/sticker-view/,轉載請注明出處。

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!