【问题标题】:Drag an drop a button on android .. help在android上拖放一个按钮..帮助
【发布时间】:2011-02-07 16:59:05
【问题描述】:

我正在尝试拖放一个按钮,问题是当我在运动事件中使用 getX() 时它可以工作,但按钮开始颤抖。当我调用 getRawX() 方法时,它不会颤抖,但在我开始拖放之前它至少跳了 80 像素。

我怎么能做到这一点,我会在这里发布我的代码:

    public class MyButton extends Button {

private final static int START_DRAGGING = 0;
private final static int STOP_DRAGGING = 1;

private int status;
private LinearLayout parentLayout;

public MyButton(Context context) {
    super(context);

}

public MyButton(Context context, AttributeSet attrs) {
    super(context, attrs);

}

public MyButton(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);

}

@Override
public boolean onTouchEvent(MotionEvent event) {


    // Log.i("teste", "Button width: " + btWidth + ", Height : "+ btHeight);

    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:
        status = START_DRAGGING;
        Log.i("teste", "Coordenada on ACTION_DOWN: " + (int) event.getRawX());
        break;
    case MotionEvent.ACTION_UP:
        status = STOP_DRAGGING;
        Log.i("teste", "Coordenada on ACTION_UP: " + (int) event.getRawX());
        break;
    case MotionEvent.ACTION_MOVE:
        if(status == START_DRAGGING){
            parentLayout.setPadding((int)event.getRawX(), 0,0,0);
            parentLayout.invalidate();
            Log.i("teste", "Coordenada on ACTION_MOVE: " + (int) event.getRawX());
        }                           
        break;

    }

    return true;
}

}

【问题讨论】:

    标签: java android drag-and-drop touch-event


    【解决方案1】:

    event.getX() 返回相对于您的视图(按钮)的触摸坐标,event.getRawX() 返回相对于显示器的触摸坐标,所以我认为第一种方法是正确的,如果您设置 button,而不是布局。但是您仍然会遇到“跳跃”问题,因为您应该触摸按钮,而不是它的边缘,并且第一步会将边缘置于您的手指之下。

    我会尝试使用GestureDetector,它的OnGestureListener 有一个onScroll() 方法,可以为您提供滚动距离(它可以记住最后一个位置并给出相对运动),以便您可以添加value 到 padding,即你拖动 10px => 你添加了 10px 的 padding。

    代码示例:

    private GestureDetector gd =
                new GestureDetector(getContext(), new SimpleOnGestureListener() {
        @Override
        public boolean onScroll(MotionEvent e1, MotionEvent e2,
                                                float distanceX, float distanceY) {
            setPadding((int)(getPaddingLeft()+distanceX),0,0,0);
        }
        @Override
        public boolean onDown(MotionEvent e) {
            return true; // else no event will be handled
        }
    

    我还会添加一些检查以防止出现负数或过多的填充。

    【讨论】:

    • @user569873:添加示例。哦,你必须将return gd.onTouchEvent(event) 放在视图的 onTouchEvent() 中。
    【解决方案2】:

    我也一直致力于触摸和移动物体。我开始以类似的方式移动一些东西:更改顶部和左侧填充。很快,当我在屏幕上添加更多可移动对象时,事情变得有点混乱。我会触摸屏幕上的一个点,其他东西就会开始移动。发生的事情是屏幕上有多个重叠的视图。只有顶视图会接收到触摸事件。

    我发现一篇帖子建议查看 Android Launcher 代码并了解它们是如何进行拖放的。我认为他们的方法非常好。您确实必须添加一个 ViewGroup 来保存您的可移动对象,但这很有效。视图的范围与您在屏幕上看到的相匹配,您最终不会感到意外。事件转到您期望的视图。

    如果事实证明您将拥有多个可移动对象,您可能需要查看我的博客文章:“Moving Views In Android”。有关 Android Launcher 和源代码的更多说明。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多