Java 在android上拖放一个按钮。。帮助
我试图拖放一个按钮问题是,当我在运动事件中使用getX()时,它会工作,但按钮开始抖动。当我调用getRawX()方法时,它不会抖动,但在我开始拖放之前,它至少跳了80px 我怎样才能做到这一点,我将在这里发布我的代码: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
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()。