仿微信头像剪切

本文介绍如何实现仿微信头像的裁剪功能。通过在底部放置一个可缩放的ImageView,配合手势操作,上层视图绘制边框,实现裁剪效果。裁剪页面由两个重叠的View组成,代码注释详细。裁剪完成后,可以直接保存图片,并针对Android 6.0及以上版本处理权限适配问题。
摘要由CSDN通过智能技术生成

来个动图:
这里写图片描述
裁剪效果其实就是图片在底部,上层一个视图重叠在上面,这里参考的是洪洋大神的仿微信头像篇,文章说的相当清楚了,我只是简洁的删改一点,看裁剪这个页面:

这里写图片描述
两个View重叠,就有了这个效果。看看底部View实现思路:底部View其实就是个ImageView,可以缩放,支持手势,直接贴代码吧

/**
 * 缩放图片的View
 * <p>
 * <p>
 * Created by dong.he on 2016/9/3.
 * <p>
 * blog:http://blog.csdn.net/hedong_77
 */
public class ClipZoomImageView extends ImageView implements
        OnScaleGestureListener, OnTouchListener,
        ViewTreeObserver.OnGlobalLayoutListener {
   
    public static float SCALE_MAX = 4.0f;
    private static float SCALE_MID = 2.0f;

    /**
     * 初始化时的缩放比例
     */
    private float initScale = 1.0f;
    private boolean once = true;

    /**
     * 用于存放矩阵
     */
    private final float[] matrixValues = new float[9];

    /**
     * 缩放的手势检验
     */
    private ScaleGestureDetector mScaleGestureDetector = null;
    private final Matrix mScaleMatrix = new Matrix();

    /**
     * 用于双击
     */
    private GestureDetector mGestureDetector;
    private boolean isAutoScale;

    private int mTouchSlop;

    private float mLastX;
    private float mLastY;

    private boolean isCanDrag;
    private int lastPointerCount;
    /**
     * 水平方向与View的边距
     */
    private int mHorizontalPadding;

    public ClipZoomImageView(Context context) {
        this(context, null);
    }

    public ClipZoomImageView(Context context, AttributeSet attrs) {
        super(context, attrs);

        setScaleType(ScaleType.MATRIX);
        mGestureDetector = new GestureDetector(context,
                new SimpleOnGestureListener() {
                    @Override
                    public boolean onDoubleTap(MotionEvent e) {
                        if (isAutoScale == true)
                            return true;

                        float x = e.getX();
                        float y = e.getY();
                        if (getScale() < SCALE_MID) {
                            ClipZoomImageView.this.postDelayed(
                                    new AutoScaleRunnable(SCALE_MID, x, y), 16);
                            isAutoScale = true;
                        } else {
                            ClipZoomImageView.this.postDelayed(
                                    new AutoScaleRunnable(initScale, x, y), 16);
                            isAutoScale = true;
                        }

                        return true;
                    }
                });
        mScaleGestureDetector = new ScaleGestureDetector(context, this);
        this.setOnTouchListener(this);
    }

    /**
     * 自动缩放的任务
     */
    private class AutoScaleRunnable implements Runnable {
   
        static final float BIGGER = 1.07f;
        static final float SMALLER = 0.93f;
        private float mTargetScale;
        private float tmpScale;

        private float x;
        private float y;

        /**
         * 传入目标缩放值,根据目标值与当前值,判断应该放大还是缩小
         *
         *
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值