我创建了背景为红色的基本 View 。我在我的 Activity 中使用该 View 。我将 setOnTouch 监听器设置为相同的 View 。 在触摸事件上,我正在移动该 View 。
Before touch event it looks like this
After MotionEvent.ACTION_MOVE it look like this
在运动事件之后我想重绘 View 。我不想显示白色部分。
它应该像谷歌地图在任何方向移动 map 时那样重绘它。
以下代码是我的基本自定义 View
public class CustomVIew extends View {
public CustomVIew(Context context) {
super(context);
}
public CustomVIew(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CustomVIew(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawColor(Color.RED);
}
}
这是我的 OnTouch 方法实现
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
_xDelta = v.getX() - event.getRawX();
_yDelta = v.getY() - event.getRawY();
Log.d(TAG, "onTouch: X:" + _xDelta + " Y:" + _yDelta);
break;
case MotionEvent.ACTION_MOVE:
v.animate()
.x(event.getRawX() + _xDelta)
.y(event.getRawY() + _yDelta)
.setDuration(10)
.start();
break;
default:
return false;
}
return true;
}
提前致谢
最佳答案
您可能需要使 View 无效。
这有助于: When it's necessary to execute invalidate() on a View?
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
_xDelta = v.getX() - event.getRawX();
_yDelta = v.getY() - event.getRawY();
Log.d(TAG, "onTouch: X:" + _xDelta + " Y:" + _yDelta);
break;
case MotionEvent.ACTION_MOVE:
//do something like change the picture
v.invalidate();
break;
default:
return false;
}
return true;
}
关于java - 在 MotionEvent.ACTION_MOVE 上重绘 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38169109/