如何水平拖动视图?

Bob*_*obs 3 android drag-and-drop

在ListView和Gallery等控件中,您可以在垂直或水平方向上拖动项目.

我有一个TextView,我成功地拖动它.但是我想把它向水平方向移动.我该如何实现它?

谢谢,

我的代码:

public class MyDragShadowBuilder extends View.DragShadowBuilder {
    private static View view;

    public MyDragShadowBuilder(View v) {
        super(v);
        view = v;
    }

    @Override
    public void onProvideShadowMetrics(Point size, Point touch) {
        width = getView().getWidth();
        height = getView().getHeight();
        size.set(width, height);
        touch.set(width / 2, height / 2);
    }

    private int width, height;

    @Override
    public void onDrawShadow(Canvas canvas) {
        view.draw(canvas);
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的活动中:

tv.setOnLongClickListener(new OnLongClickListener() {
        @Override
        public boolean onLongClick(View v) {
            ClipData data = ClipData.newPlainText("dot",
                    "Dot : " + v.toString());
            View.DragShadowBuilder myShadow = new MyDragShadowBuilder(v);
            v.startDrag(data, myShadow,(Object) v, 0);
            return false;
            }
        });
Run Code Online (Sandbox Code Playgroud)

我想模拟一个画廊.我有10000张照片要显示出来.我的画廊可以显示10张照片.我想拖动我的图库的LinearLayout水平包含图库的内容,当LinearLayout像SlidingDrawer一样到达窗口的末尾时,更改其内容并显示接下来的10张照片.SlidingDrawer是一个很好的解决方案,但它有一些局限性.将整个LinearLayout设置为其句柄时,无法单击它.为其设置单独的句柄时,无法确定句柄相对于内容的位置.

Fra*_*man 7

从Bluefalcon的建议开始,我想出了类似的东西:

// in onCreate of the containing view
dragButton.setOnTouchListener(new DragExperimentTouchListener(dragButton.getX(), dragButton.getY()));
Run Code Online (Sandbox Code Playgroud)

...

public class DragExperimentTouchListener implements View.OnTouchListener {

    public DragExperimentTouchListener(float initalX, float initialY) {
        lastX = initalX;
        lastY = initialY;
    }

    boolean isDragging = false;
    float lastX;
    float lastY;
    float deltaX;

    @Override
    public boolean onTouch(View arg0, MotionEvent arg1) {

        int action = arg1.getAction();

        if (action == MotionEvent.ACTION_DOWN && !isDragging) {
            isDragging = true; 
            deltaX = arg1.getX();
            return true;
        } else if (isDragging) {
            if (action == MotionEvent.ACTION_MOVE) {

                arg0.setX(arg0.getX() + arg1.getX() - deltaX);
                arg0.setY(arg0.getY());
                return true;
            } else if (action == MotionEvent.ACTION_UP) {
                isDragging = false;
                lastX = arg1.getX();
                lastY = arg1.getY();
                return true;
            } else if (action == MotionEvent.ACTION_CANCEL) {
                arg0.setX(lastX);
                arg0.setY(lastY);
                isDragging = false;
                return true;
            }
        }

        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)