来个动图:
裁剪效果其实就是图片在底部,上层一个视图重叠在上面,这里参考的是洪洋大神的仿微信头像篇,文章说的相当清楚了,我只是简洁的删改一点,看裁剪这个页面:
两个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;
/**
* 传入目标缩放值,根据目标值与当前值,判断应该放大还是缩小
*
*