java - 在 MotionEvent.ACTION_MOVE 上重绘 View

标签 java android android-view

我创建了背景为红色的基本 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/

相关文章:

java - Firestore 无法添加 DocumentId

android - VideoView-播放swf文件

java - 使用 JNI 将 java 与 C 计时器库进行接口(interface)

java - 在 Java GUI 中显示鼠标所在位置键入的字符

java - 识别 Retrofit 2 请求

文件存在时 Android SDK "no such file"

java - 使用 RecyclerView 制作类似目录的布局

android - 如何判断一个 View 在 Android 屏幕上是否可见?

java - Android:将按钮添加到 YouTubePlayerView

java - 获取 OpenStack 服务器的标签