在MotionEvent.ACTION_MOVE上重绘视图

时间:2016-07-03 10:39:43

标签: java android android-view

我在基本视图中创建了背景中的红色。我在我的活动中使用该视图。我将setOnTouch列表器放到同一视图中。 在触摸事件上,我正在移动这种观点。

Before touch event it looks like this

After MotionEvent.ACTION_MOVE it look like this

在运动事件之后,我希望重新绘制视图。我不希望显示白色部分。

它应该像谷歌地图一样在任何方向移动地图上重绘它。

以下代码属于我的基本自定义视图

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;
}

提前完成

1 个答案:

答案 0 :(得分:1)

您可能需要使视图无效。

这有助于: 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;
}