【问题标题】:Redraw view on MotionEvent.ACTION_MOVE在 MotionEvent.ACTION_MOVE 上重绘视图
【发布时间】:2016-07-03 10:39:43
【问题描述】:

我创建了背景为红色的基本视图。我在我的活动中使用该视图。我已将 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;
}

提前感谢

【问题讨论】:

  • 为什么不用v.invalidate()方法重绘?
  • @mehd azizi 我尝试在动画后通过 ontouch 方法获得的视图上进行 ivalidate,但它不起作用。它只是将整个视图拖到新位置,它不像地图那样重绘

标签: java android android-view


【解决方案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;
}

【讨论】:

  • 你在 ACTION_MOVE 中改变背景图片或类似的东西吗?
  • 没什么,我只是通过动画来改变它的位置
  • 如果你想显示一张大图并四处走动,你必须在滚动视图中添加一个图像视图。像这样:stackoverflow.com/questions/4990682/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-08
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 2012-06-24
相关资源
最近更新 更多