前言
常見的圖片裁剪有兩種,一種是圖片固定,裁剪框移動放縮來確定裁剪區域,早期見的比較多,缺點在于不能直接預覽裁剪后的效果;還有一種現在比較普遍了,就是裁剪框固定,直接拖動縮放圖片,便于預覽裁剪結果。
我做的這個控件屬于后者。一般來說,做圖片裁剪的思路無外乎是先監聽手勢,獲取坐標,再對圖片變形,最后確定裁剪區域的坐標對位圖進行裁剪,最后保存圖片到本地。我嘛還是個技術小白,一想到要監控手勢這些就頭疼,碰巧項目之前為了做查看大圖而引入了大名鼎鼎的第三方圖片查看控件――PhotoView(使用步驟參考這篇文章:Android PhotoView使用步驟實例詳解)。于是轉念一想,能不能把到圖片變形為止的前幾步交給PhotoView來搞定,我只要負責確定確定裁剪區域后面這幾步呢。后來掉了好幾個坑導致偷懶也沒輕松多少其實ε=(´ο`*)))唉~


先簡要介紹一下設計思路,如上圖所示,主要分為兩部分,上層是遮罩(也可以理解為是裁剪框),用于預覽裁剪后的效果;下層是PhotoView,這里多包了一層改為正方形顯示。
下面是遮罩的代碼,比較簡單,這里就不贅述了。
/** * Created by MandyLu on 2018/7/14. * 圓形裁剪框 */public class CircleCropView extends View { public final int CIRCLE_MARGIN = 50; public CircleCropView(Context context) { super(context); } public CircleCropView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); } public CircleCropView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) public CircleCropView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, widthMeasureSpec); } @RequiresApi(api = Build.VERSION_CODES.O) @Override protected void onDraw(Canvas canvas) { canvas.save(); Path path = new Path(); Rect viewDrawingRect = new Rect(); getDrawingRect(viewDrawingRect); float radius = viewDrawingRect.width() / 2 - CIRCLE_MARGIN; path.addCircle(viewDrawingRect.left + radius + CIRCLE_MARGIN, viewDrawingRect.top + radius + CIRCLE_MARGIN, radius, Path.Direction.CW); Paint outsidePaint = new Paint(); outsidePaint.setAntiAlias(true); outsidePaint.setARGB(151, 0, 0, 0); canvas.clipPath(path, Region.Op.DIFFERENCE); canvas.drawRect(viewDrawingRect, outsidePaint); canvas.restore(); }}SquarePhotoView只是在PhotoView的基礎上改了長寬,重寫一下onMeasure方法即可:
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, widthMeasureSpec); }那么現在最關鍵的一步,就是從PhotoView獲取當前圖片顯示區域的Drawable或Bitmap了。粗略看了一下PhotoView的函數,并沒有找到能用的( 主站蜘蛛池模板: 建湖县| 荥经县| 屯昌县| 望都县| 北宁市| 芜湖县| 旺苍县| 中阳县| 麻城市| 仪陇县| 郑州市| 明光市| 锡林郭勒盟| 锡林浩特市| 天长市| 昌黎县| 自贡市| 凤城市| 南昌市| 宣恩县| 托克逊县| 潼关县| 来凤县| 兴文县| 东兰县| 渭源县| 靖江市| 汝南县| 冷水江市| 昭觉县| 万州区| 龙山县| 辽宁省| 深泽县| 巧家县| 香港| 绵竹市| 乌什县| 山阴县| 化隆| 军事|