如何横向拖动视图?

3
在像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);
    }
}

在我的活动中:

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

我想模拟一个相册。我有一万张照片要展示。我的相册每次只能显示10张照片。我想拖动包含相册内容的LinearLayout,使其在水平方向上移动。当LinearLayout到达窗口的末尾时,像SlidingDrawer一样更改其内容并显示下10张照片。SlidingDrawer是一个不错的解决方案,但它有一些限制。当您将整个LinearLayout设置为其handle时,它不能被点击。当您为其设置单独的handle时,您无法确定handle相对于content的位置。

3
你尝试将它放在HorizontalScrollView中了吗? http://developer.android.com/reference/android/widget/HorizontalScrollView.html - Jave
5个回答

8

从Bluefalcon的建议开始,我想到了以下内容:

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

...

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

你也可以将lastX和lastY的初始化 ```lastX = initalX; lastY = initialY;```放在if (action == MotionEvent.ACTION_DOWN && !isDragging)里面。首先,因为在onTouch()中视图已经被绘制,你会得到正确的x和y。其次,这样即使视图因为之前的拖动而移动,每次开始拖动时它也会再次初始化。 - vida
它能够工作,但有时(我认为是拖动到父视图)ACTION_CANCEL会出现问题。我删除了“else if ACTION_CANCEL”并将“else if ACTION_UP”编辑为“else”。然后问题就解决了 :) - Mete
我能将这段代码与 onClick 和 onLongClick 监听器结合使用吗? - Coder123
@coder123 我不知道是否应该为此开始一个新问题。 - Frank Schwieterman

3

水平滚动视图是安卓中最简单的水平拖拽选项...

水平滚动视图

试一试吧...在指定区域内,添加文本框或者你喜欢使用的任何布局和小部件...即使是动态程序,它也能正常工作...


3
如果您想滚动,请按照其他人建议使用水平滚动视图。
但是,如果您的意思是“拖放”,则可以执行以下操作:
- 在TextView上设置触摸监听器。 - 监听ACTION_DOWN之后的所有事件和ACTION_MOVE事件。 - 从上述事件中获取x和y位置。 - 使用API setTop和setLeft,并将它们设置为上面获取的x和y。 - 然后在整个视图上调用invalidate。
这将使UI元素在屏幕上拖动。

1

链接已经失效。 - Shailendra Madda

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接