1

我正在尝试拖放一个按钮,问题是当我在运动事件中使用 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;
}

}

4

2 回答 2

3

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

我会尝试使用 a GestureDetector,它OnGestureListener有一种onScroll()方法可以为您提供滚动距离(它可以记住最后一个位置并给出相对运动),这样您就可以将该值添加到填充中,也就是说,您拖动 10px = > 你添加 10px 的内边距。

代码示例:

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
    }

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

于 2011-02-07T17:38:18.983 回答
2

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

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

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

于 2011-02-12T16:20:32.803 回答