自定义view图片缩放控件
ImageView控件只能展示图片,不能对图片进行手势缩放,此篇文章主要实现对图片的展示和缩放,技能点主要有以下几个方面:
- 继承View,实现自定义View功能
- 绘制bitmap,显示图片
- 实现对图片拖动功能
- 实现对图片的放大缩小功能
- 实现图片的裁剪功能
演示效果图
直接看代码会枯燥,这里先看下演示效果图
代码实现
1、自定义view类CropView,实现图片显示和缩放功能
public class CropView extends View {
public CropView(Context context) {
super(context);
init();
}
public CropView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init();
}
public CropView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
// 初始化手势识别类
private ScaleGestureDetector scaleGestureDetector;
private GestureDetector gestureDetector;
private Matrix matrix;
private Bitmap bitmap;
private float[] matrixArray;
private float setMinimumScale = 0.2f;
private float maximumScale = 4.0f;
private Rect restrictBound;
private Rect getRestrictedBound() {
return restrictBound;
}
private void init() {
matrix = new Matrix();
matrixArray = new float[9];
// 初始化缩放手势识别类,用于图片的缩放
scaleGestureDetector = new ScaleGestureDetector(getContext(), onScaleGestureListener);
// 初始化手势识别类,用于图片的拖动
gestureDetector = new GestureDetector(getContext(), onGestureListener);
}
// 缩放手势监听
private ScaleGestureDetector.OnScaleGestureListener onScaleGestureListener = new ScaleGestureDetector.OnScaleGestureListener() {
@Override
public boolean onScale(ScaleGestureDetector scaleGestureDetector) {
// 处理图片缩放
scale(scaleGestureDetector);
return true;
}
@Override
public boolean onScaleBegin(ScaleGestureDetector scaleGestureDetector) {
// 设为true,才能执行接下来的操作,onScale --> onScaleEnd
return true;
}
@Override
public void onScaleEnd(ScaleGestureDetector scaleGestureDetector) {
//获取本次缩放事件的缩放因子(缩放事件以onScale()返回值为基准,一旦该方法返回true,代表本次事件结束,要开启下次事件)
float scale = scaleGestureDetector.getScaleFactor();