一.Bitmap基本操作
1.平移bitmap
public class ConsumerBitmapView extends View {
//创建Matrix对象
private Matrix matrix = new Matrix();
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//把Matrix对象设置给bitmap
canvas.drawBitmap(bitmap, matrix, null);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
lastX = event.getX();
lastY = event.getY();
break;
case MotionEvent.ACTION_MOVE:
float dx = event.getX() - lastX;
float dy = event.getY() - lastY;
//根据手势滑动差更新bitmap位置
matrix.postTranslate(dx, dy);
lastX = event.getX();
lastY = event.getY();
invalidate();
break;
case MotionEvent.ACTION_UP:
break;
}
return true;
}
}
2.缩放bitmap
public class ConsumerBitmapView extends View {
private Matrix matrix = new Matrix();
private ScaleGestureDetector scaleGestureDetector;
private void init(Context context) {
//初始化scaleGestureDetector
scaleGestureDetector = new ScaleGestureDetector(context, new ScaleListener());
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//把Matrix对象设置给bitmap
canvas.drawBitmap(bitmap, matrix, null);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
//将触摸事件传递给ScaleGestureDetector
scaleGestureDetector.onTouchEvent(event);
return true;
}
//手势监听
private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
private float scale = 1.0f;
private void scale(float scaleFactor, float focusX, float focusY) {
scale *= scaleFactor;
//
matrix.postScale(scaleFactor, scaleFactor, focusX, focusY);
invalidate();
}
@Override
public boolean onScaleBegin(ScaleGestureDetector detector) {
return true;
}
@Override
public boolean onScale(ScaleGestureDetector detector) {
scale(detector.getScaleFactor(), detector.getFocusX(), detector.getFocusY());
return true;
}
@Override
public void onScaleEnd(ScaleGestureDetector detector) {
}
}
}
3.对big bitmap进行裁剪滚动
public class LargeBitmapImageView extends ImageView {
private GestureDetector gestureDetector;
//给的初始bitmap展示区域
private Rect mRect = new Rect(0, 0, 900, 900);
private BitmapRegionDecoder bitmapRegionDecoder;
public LargeBitmapImageView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init(context);
}
private void init(Context context) {
try {
InputStream inputStream = getResources().openRawResource(R.drawable.changtu);
bitmapRegionDecoder = BitmapRegionDecoder.newInstance(inputStream, false);
} catch (Resources.NotFoundException | IOException e) {
Log.d("111", "exception");
}
gestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
//根据手势下滑的位移去更新rect
mRect.offset((int) distanceX, (int) distanceY);
invalidate();
return true;
}
}
);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
//将触摸事件传递给ScaleGestureDetector
gestureDetector.onTouchEvent(event);
return true;
}
@Override
protected void onDraw(Canvas canvas) {
//更新需要展示的bitmap的区域
Bitmap bitmap = bitmapRegionDecoder.decodeRegion(mRect, null);
canvas.drawBitmap(bitmap,0,0,null);
}
}