有ImageMagnifier,它是ImageView的“放大镜”:
public class ImageMagnifier extends android.support.v7.widget.AppCompatImageView {
private PointF zoomPos;
private boolean zooming = false;
private Matrix matrix;
private Paint paint;
private Bitmap bitmap;
private BitmapShader shader;
private int sizeOfMagnifier = 200;
public ImageMagnifier(Context context) {
super(context);
init();
}
public ImageMagnifier(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
public ImageMagnifier(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
private void init() {
zoomPos = new PointF(0, 0);
matrix = new Matrix();
paint = new Paint();
}
@Override
public boolean onTouchEvent(MotionEvent event) {
int action = event.getAction();
zoomPos.x = event.getX();
zoomPos.y = event.getY();
switch (action) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_MOVE:
zooming = true;
this.invalidate();
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
zooming = false;
this.invalidate();
break;
default:
break;
}
return true;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (!zooming) {
buildDrawingCache();
} else {
bitmap = getDrawingCache();
shader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
paint = new Paint();
paint.setShader(shader);
matrix.reset();
matrix.postScale(2f, 2f, zoomPos.x, zoomPos.y);
paint.getShader().setLocalMatrix(matrix);
canvas.drawCircle(zoomPos.x, zoomPos.y - 150, sizeOfMagnifier, paint);
}
}
}
一切正常,但我不知道如何为放大镜添加框架。试图做类似的事情:
paint.setStyle(Paint.Style.STROKE);
paint.setColor(Color.BLACK);
但在这种情况下,得到了一个反转:放大的图像显示在一个框架中(应该是黑色的),放大镜本身是空的。
你的思路是对的,只是frame,你需要单独创建一个object
Pain,在画好放大镜本身之后再画:只有你应该避免在方法中创建新对象
onDraw,正如 Android Studio 可能已经告诉你的那样。即Paint在初始化视图的时候创建对象,在 中onDraw,复用即可。