Java 使用scaleFocus缩放画布会导致跳转
我正在处理一个自定义视图,它可以通过缩放手势进行缩放。当我不使用缩放焦点时,一切都很好。但是有一次我像这样做了Java 使用scaleFocus缩放画布会导致跳转,java,android,android-animation,scale,Java,Android,Android Animation,Scale,我正在处理一个自定义视图,它可以通过缩放手势进行缩放。当我不使用缩放焦点时,一切都很好。但是有一次我像这样做了canvas.scale(mScaleFactor,mScaleFactor,scaleFocus[0],scaleFocus[1]),它在缩小到某个低比例因子时导致跳跃。以下是视图的简化版本,说明了问题: public class TestView extends FrameLayout { private ScaleGestureDetector mScaleGestureDete
canvas.scale(mScaleFactor,mScaleFactor,scaleFocus[0],scaleFocus[1])代码>,它在缩小到某个低比例因子时导致跳跃。以下是视图的简化版本,说明了问题:
public class TestView extends FrameLayout {
private ScaleGestureDetector mScaleGestureDetector;
private float mScaleFactor = 1.f;
private float mMinScaleFactor = 0.4f;
private static final float MAX_SCALE_FACTOR = 2.0f;
private Matrix canvasMatrix = new Matrix();
float[] scaleFocus = new float[2];
private Rect clipBounds = new Rect();
private static final String TAG = "TestView";
public TestView(@NonNull Context context) {
super(context);
sharedConstructor();
}
public TestView(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
sharedConstructor();
}
public TestView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
sharedConstructor();
}
public void setChildViews() {
ImageView imageView = new ImageView(getContext());
LayoutParams layoutParams = new LayoutParams(StateUtil.screenWidth*2, StateUtil.screenHeight*2);
layoutParams.gravity = Gravity.CENTER;
imageView.setLayoutParams(layoutParams);
imageView.setImageResource(R.drawable.test);
canvasMatrix.set(getMatrix());
addView(imageView);
//some additional views are added here
}
private void sharedConstructor(){
mScaleGestureDetector = new ScaleGestureDetector(getContext(), mScaleGestureListener);
setChildViews();
}
@Override
public boolean onTouchEvent(MotionEvent event) {
return mScaleGestureDetector.onTouchEvent(event) || super.onTouchEvent(event);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.getClipBounds(clipBounds);
canvas.scale(mScaleFactor, mScaleFactor, scaleFocus[0], scaleFocus[1]);
canvas.getMatrix().invert(canvasMatrix);
canvas.save();
}
private final ScaleGestureDetector.OnScaleGestureListener mScaleGestureListener
= new ScaleGestureDetector.SimpleOnScaleGestureListener() {
@Override
public boolean onScale(ScaleGestureDetector detector) {
scaleFocus[0] = detector.getFocusX();
scaleFocus[1] = detector.getFocusY();
canvasMatrix.mapPoints(scaleFocus);
if (clipBounds.contains((int) scaleFocus[0], (int) scaleFocus[1])){
mScaleFactor *= detector.getScaleFactor();
mScaleFactor = Math.max(mMinScaleFactor, Math.min(mScaleFactor, MAX_SCALE_FACTOR));
TestView.this.invalidate();
}
return true;
}
};
}
下面是我的设备上的外观:
我已经尝试过解决方案,但它对我不起作用。即使我不调用super.onTouchEvent(事件)代码>,问题仍然出现
你知道是什么原因导致的吗?如何解决