Android 如何水平拖动视图?

Android 如何水平拖动视图?,android,drag-and-drop,Android,Drag And Drop,在ListView和Gallery等控件中,可以沿一个方向垂直或水平拖动项目 我有一个文本视图,我成功地拖动了它。但我想水平移动它。我如何实现它 谢谢 我的代码: public class MyDragShadowBuilder extends View.DragShadowBuilder { private static View view; public MyDragShadowBuilder(View v) { super(v); view

在ListView和Gallery等控件中,可以沿一个方向垂直或水平拖动项目

我有一个文本视图,我成功地拖动了它。但我想水平移动它。我如何实现它

谢谢

我的代码:

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);
    }
}
在我的活动中:

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;
            }
        });

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

水平滚动视图是android中最简单的水平拖动选项


尝试一下……在指定的范围内,提供textview或您喜欢使用的任何布局或小部件……它甚至可以用于动态过程……

HorizontalScroll视图是解决此问题的完美方案。请参阅此处的博客

如果要滚动,请按照其他人的建议使用水平滚动视图

但是如果你是指“拖放”中的拖动,那么你可以执行以下操作

  • TextView
  • 收听
    动作\u向下
    和事件
    动作\u移动后的所有事件
  • 从上述事件中获取
    x
    y
    位置
  • 使用API
    setTop
    setLeft
    并将它们设置为上面的
    x
    y
  • 然后在整个视图上调用
    invalidate

这将在屏幕上拖动UI元素。

您可以使用水平滚动视图模拟水平滑动画廊。

从Bluefalcon的建议开始,我提出了如下建议:

// in onCreate of the containing view
dragButton.setOnTouchListener(new DragExperimentTouchListener(dragButton.getX(), dragButton.getY()));


你试过把它放在水平滚动视图中吗?您还可以将lastX和lastY的初始化设置为
lastX=initalX;lastY=初始值
中的code>。首先,因为它确定视图已经在onTouch()中绘制,并且您将得到正确的x和y。第二,这样每次开始拖动时它都会被再次初始化,即使视图已经因为之前的拖动而移动了。这是可行的,但有时(我认为拖动到父视图)操作会出现问题。我删除了“else if ACTION\u CANCEL”并将“else if ACTION\u UP”编辑为“else”。问题解决了:)我可以将此代码与onClick和onLongClick listeneres结合使用吗?@coder123我不知道我会为此开始一个新的问题。链接已失效
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;
    }
}