Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 用手指移动任何RelativeLayout(不更改布局参数)_Android_Android Animation - Fatal编程技术网

Android 用手指移动任何RelativeLayout(不更改布局参数)

Android 用手指移动任何RelativeLayout(不更改布局参数),android,android-animation,Android,Android Animation,我有一个视图,我想用手指移动它。我想得到xDelta和yDelta,然后只转换视图的矩阵(不是图像视图,任何视图,例如RelativeLayout)。 我想知道如何做到这一点: 覆盖RelativeLayout的onDraw并在那里应用转换矩阵。可能吗 我目前正在做的是在每个onTouch事件上应用动画。动画的持续时间为0,x/y的开始/结束时间相同(setFillAfter=true)。它只是把风景放在我想要的地方。但是那不是太贵了吗 我不能直接通过onDraw操作任何视图的矩阵吗?我试过这样

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

  • 覆盖RelativeLayout的onDraw并在那里应用转换矩阵。可能吗
  • 我目前正在做的是在每个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);
    }
    

    但似乎我做错了。

    我不想告诉你,你的问题比你想象的更容易,但下面是它的样子:

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

    希望这有帮助

    如果要实现拖动手势,则可以在其运动事件中使用onTouchListener。操作\u移动使用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;
        }
    };
    
    您需要在运行时创建拖动图像,并且必须调整其位置。在这个示例代码中,我没有调整位置,因此不会在触摸位置创建拖动的图像。你还需要考虑被拖拽的图像的高度和宽度。


    希望有帮助

    如果要永久移动布局(在临时情况下,我们可以使用动画),请使用。希望这将有助于您实现这一目标:

  • 确保视图最初在要使用的方向上有足够的空间。比如“匹配父母”等等

  • 使用GestureDetector.onImplegestureListener和overrideonDraw(返回true;),onScroll——使用onTouchEvent连接它,您将直接获得距离,或者您可以使用事件1和事件2计算自己的距离

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

  • 在onDraw方法中,通过canvas.translate(…使用这些变量…)使用这些信息;super.onDraw(帆布)

  • 你的努力将会取得成果


    PS:绘图以左上角为0,0开始,我宁愿在位图上绘制一次视图并转换位图。我认为这样会更有效率。当拖动时,真实视图可能不可见或消失。所以你认为没有办法直接操纵矩阵?我不确定视图将如何使用填充移动?你试过了吗是的。我用来实现API级别低于11的拖放特性。