我已经实现了ZoomView,我在其中绘制了许多项目,当我点击其中一个时,它会更改它的视图并调用invalidate。这适用于我测试的所有地方(API 8,API 10,API 19),但它不适用于API 16.
在API 16上,问题是只有当我在ZoomView中移动屏幕时,才会重绘已更改的项目。
更奇怪的是,即使所有项目都相同且只有不同的位置,其中一些在点击时会重新绘制,而有些则不会。可以使用的项目是左上角的项目,可以使用比例1在屏幕上绘制并翻译[0,0]。
问题可能在于我的ZoomView,这里是简化代码:
public class ZoomView extends FrameLayout {
//SOME VARIABLES
public ZoomView(Context context) {
super(context);
setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
setBackgroundColor(getResources().getColor(R.color.background));
scaleDetector = new ScaleGestureDetector(context, new ScaleListener());
}
@Override
public boolean dispatchTouchEvent(final MotionEvent ev) {
//COMPUTE TRANSLATION OR DETERMINE WHERE IT WAS CLICKED
}
@Override
protected void dispatchDraw(final Canvas canvas) {
canvas.save();
canvas.translate(posX, posY);
canvas.scale(scaleFactor, scaleFactor);
v.draw(canvas);
canvas.restore();
}
private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
@Override
public boolean onScale(ScaleGestureDetector detector) {
//COMPUTE SCALE AND CALL INVALIDATE
}
}
}