4

我有一个视图,我想用手指移动它。我想得到 xDelta 和 yDelta 并只翻译视图的矩阵(不是图像视图,任何视图,例如 RelativeLayout)。我想知道如何做到这一点:

  1. 覆盖RelativeLayout 的onDraw 并在那里应用翻译矩阵。那可能吗?
  2. 我目前正在对每个 onTouch 事件应用动画。动画的持续时间为 0,x/y 的开始/结束相同(setFillAfter = true)。它只是将视图放在我想要的位置。但这不是太贵了吗?

不能直接通过onDraw来操作任何视图的矩阵吗?我试过这样的事情:

@Override
protected void onDraw(Canvas canvas) {
    if (getDx() != 0 && getDy() != 0) {
        m = canvas.getMatrix();
        m.postTranslate(dx, dy);
        canvas.setMatrix(m);
    }
    super.onDraw(canvas);
}

但似乎我做错了。

4

4 回答 4

6

如果要实现拖动手势,则可以使用onTouchListener并在其MotionEvent.ACTION_MOVE中使用 setPadding 设置填充到该视图。

这是示例代码:

case MotionEvent.ACTION_MOVE:
    yourView.setPadding((int)event.getRawX(), (int)event.getRawY(), 0, 0);

onTouchListener 示例:-

OnTouchListener drag= new OnTouchListener() {

        @Override
    public boolean onTouch(View v, MotionEvent event) {

        switch(event.getAction() & MotionEvent.ACTION_MASK){
           case MotionEvent.ACTION_DOWN:

            break;
           case MotionEvent.ACTION_POINTER_DOWN:

            break;
           case MotionEvent.ACTION_MOVE:
               img.setPadding((int)event.getRawX(), (int)event.getRawY(), 0, 0);
            break;
           case MotionEvent.ACTION_UP:
            break;
           case MotionEvent.ACTION_POINTER_UP:

            break;
           }        return true;
    }
};

您需要在运行时创建拖动图像并且必须调整其位置。在此示例代码中,我没有调整位置,因此不会在触摸位置创建拖动的图像。您还需要考虑要拖动的图像的高度和宽度。

希望能帮助到你 !

于 2012-11-15T12:10:38.163 回答
2

I hate to be the one to tell you that your problem is even easier than you thought, but here's what it looks like:

@Override
protected void onDraw(Canvas canvas) {
    if (getDx() != 0 && getDy() != 0) {
        canvas.translate(getDx(), getDy());
    }
    super.onDraw(canvas);
}

Hope this helps!

于 2012-11-13T21:07:55.787 回答
1

如果你想永久移动你的布局(如果是临时的,我们可以使用动画)然后使用android Official Page 的 Drag And Drop API。希望对你有帮助

于 2012-11-16T06:20:07.193 回答
1

有助于实现它的几件事:

  1. 确保您的视图最初在您想要使用的方向上有足够的空间。像'match_parent'等

  2. 使用 GestureDetector.onSimpleGestureListener 并覆盖onDraw (return true;) , onScroll -- 使用onTouchEvent连接就可以直接得到距离,也可以使用event1 和 event2自己计算

  3. 将此信息存储在变量中并调用invalidate()

  4. 在您的 onDraw 方法中 - 通过canvas.translate(..use those variables..) 使用此信息;超级.onDraw(画布);

你会达到的结果

PS:绘图以left-top为0,0开始

于 2012-11-16T17:54:43.667 回答