Java 在android上拖放一个按钮。。帮助

Java 在android上拖放一个按钮。。帮助,java,android,drag-and-drop,touch-event,Java,Android,Drag And Drop,Touch Event,我试图拖放一个按钮问题是,当我在运动事件中使用getX()时,它会工作,但按钮开始抖动。当我调用getRawX()方法时,它不会抖动,但在我开始拖放之前,它至少跳了80px 我怎样才能做到这一点,我将在这里发布我的代码: public class MyButton extends Button { private final static int START_DRAGGING = 0; private final static int STOP_DRAGGING = 1; priva

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

我怎样才能做到这一点,我将在这里发布我的代码:

    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;
}
}
event.getX()
返回相对于视图(按钮)的触摸坐标,
event.getRawX()
返回相对于显示器的触摸坐标,因此如果设置按钮的填充而不是布局,我认为第一种方法是正确的。但你仍然会有“跳跃”的问题,因为你应该触摸按钮,而不是它的边缘,第一步会把边缘放在你的手指下

我会尝试使用一个
手势检测器
,它的
OnTestureListener
有一个
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
    }
我还将添加一些检查以防止负面或过度填充。

event.getX()
返回相对于视图(按钮)的触摸坐标,
event.getRawX()
返回相对于显示器的触摸坐标,因此我认为第一种方法是正确的,如果设置按钮的填充,而不是布局。但你仍然会有“跳跃”的问题,因为你应该触摸按钮,而不是它的边缘,第一步会把边缘放在你的手指下

我会尝试使用一个
手势检测器
,它的
OnTestureListener
有一个
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
    }

我还将添加一些检查,以防止负面或过度填充。

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

我发现一篇帖子建议看一看Android启动程序代码,看看它们是如何拖放的。我认为他们的方法真的很好。您确实需要添加一个视图组来保存可移动对象,但这是可行的。视图的范围与您在屏幕上看到的内容相匹配,您最终不会感到意外。事件转到您期望的视图


如果结果是您将拥有多个可移动对象,您可能需要查看我的博客帖子:“”。还有更多关于Android启动器和源代码的解释

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

我发现一篇帖子建议看一看Android启动程序代码,看看它们是如何拖放的。我认为他们的方法真的很好。您确实需要添加一个视图组来保存可移动对象,但这是可行的。视图的范围与您在屏幕上看到的内容相匹配,您最终不会感到意外。事件转到您期望的视图


如果结果是您将拥有多个可移动对象,您可能需要查看我的博客帖子:“”。还有更多关于Android启动器和源代码的解释

@user569873:添加了示例。哦,您必须将
return gd.onTouchEvent(event)
放入视图的onTouchEvent()。@user569873:添加了示例。哦,您必须将
返回gd.onTouchEvent(事件)
放入视图的onTouchEvent()。