Java OnTouch MotionEvent动作移动未触发
我尝试在拖动按钮时获取X,Y坐标,但由于某些原因,touch listener上附带的代码仅会触发两次,而不是在拖动时不断更新,即使使用trothing,为了提高性能,我也会感到满意,但正如我所说,Java OnTouch MotionEvent动作移动未触发,java,android,android-activity,touch,draggable,Java,Android,Android Activity,Touch,Draggable,我尝试在拖动按钮时获取X,Y坐标,但由于某些原因,touch listener上附带的代码仅会触发两次,而不是在拖动时不断更新,即使使用trothing,为了提高性能,我也会感到满意,但正如我所说,onTouch方法仅在操作停止时触发,再过一次 这是我的代码: 在日志中,我刚刚: ACTION_DOWN WindowManager﹕ Drag already in progress UKNOWN ACTION MotionEvent.getAction对动作类型以及其他指针信息进行编码(用于
onTouch
方法仅在操作停止时触发,再过一次
这是我的代码:
在日志中,我刚刚:
ACTION_DOWN
WindowManager﹕ Drag already in progress
UKNOWN ACTION
MotionEvent.getAction对动作类型以及其他指针信息进行编码(用于多点触摸处理)。你只想得到动作部分
编辑:此外,根据下面的讨论,StartDraging存在一些问题。最后,您的代码应该是这样的
int basex;
int basey;
RelativeLayout.LayoutParams layoutParams;
RelativeLayout layBg;
....................
dragBtn.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent me) {
// TODO Auto-generated method stub
layoutParams = (RelativeLayout.LayoutParams) dragBtn.getLayoutParams();
switch (me.getAction()) {
case MotionEvent.ACTION_DOWN:
basex = ((int) (me.getRawX() - layoutParams.leftMargin));
basey = ((int) (me.getRawY() - layoutParams.topMargin));
break;
case MotionEvent.ACTION_MOVE:
int i = (int) event.getRawX();
int j = (int) event.getRawY();
layBg = ((RelativeLayout) dragBtn.getParent());
if ((i - basex > -(dragBtn.getWidth() * 2 / 3))
&& (i - basex < layBg.getWidth() - dragBtn.getWidth() / 3)) {
layoutParams.leftMargin = (i - basex);
}
if ((j - basey > -(dragBtn.getHeight() * 2 / 3))
&& (j - basey < layBg.getHeight() - dragBtn.getHeight() / 3)) {
layoutParams.topMargin = (j - basey);
}
layoutParams.rightMargin = -1000;
layoutParams.bottomMargin = -1000;
dragBtn.setLayoutParams(layoutParams);
break;
}
return true;
}
});
intbasex;
int-basey;
RelativeLayout.LayoutParams LayoutParams;
相对性layBg;
....................
dragBtn.setOnTouchListener(新视图.OnTouchListener(){
@凌驾
公共布尔onTouch(视图v,运动事件me){
//TODO自动生成的方法存根
layoutParams=(RelativeLayout.layoutParams)dragBtn.getLayoutParams();
开关(me.getAction()){
case MotionEvent.ACTION\u DOWN:
basex=((int)(me.getRawX()-layoutParams.leftMargin));
basey=((int)(me.getRawY()-layoutParams.topMargin));
打破
case MotionEvent.ACTION\u移动:
int i=(int)event.getRawX();
int j=(int)event.getRawY();
layBg=((RelativeLayout)dragBtn.getParent());
如果((i-basex>-(dragBtn.getWidth()*2/3))
&&(i-basex-(dragBtn.getHeight()*2/3))
&&(j-basey
一旦系统有了拖放阴影,它将通过向应用程序中当前可见的所有视图对象发送拖动事件来开始拖放操作。它可以通过调用视图对象的拖动侦听器(onDrag()的实现)或调用视图对象的onDragEvent()方法来实现这一点ACTION\u DRAG\u Start的值您希望捕获OnDragListener
中的X和Y坐标数据,而不是OnTouchListener
。在您在屏幕上拖动对象的整个过程中,Android会将其解释为一个单独的ACTION\u MOVE事件,因此您只会从中获取一次数据在自定义OnDragListener
类中执行de:
@Override
public boolean onDrag(View v, DragEvent event) {
int action = event.getAction();
float xCoord;
float yCoord;
if(action == DragEvent.ACTION_DRAG_LOCATION) {
xCoord = event.getX();
yCoord = event.getY();
}
return event.getResult(); //returns true for valid drop or false for invalid drop
}
在自定义的OnDragListener
类中的其他地方,您必须对xCoord和yCoord数据执行一些操作。例如,在我的应用程序中,我在我的“调试”版本的应用程序上有一个TextView
,其中显示xCoord和yCoord数据。我执行TextView.setText()
if(action==DragEvent.action\u DRAG\u LOCATION){…
希望这会有帮助。Hi@Darrell,但我不明白这会有什么帮助。即使我将运动getAction更改为getActionMasked,这也不会解决问题,因为此方法onTouch只会触发两次。例如,我更改为记录蒙面动作,但同样的事情,只有两个日志详细信息,一个值为0,然后值为3。将在某个活动中删除上面的内容,并将其附加到某个虚拟按钮上,您将看到相同的结果。明白了,只要您从onTouch返回true,您应该继续看到事件。尝试将startDrag移动到ACTION\u DOWN子句中,可能是第二次调用“drag ready in progress”错误导致系统中止拖动?嘿@Darrell,谢谢!这就是问题所在!你可以编辑你的答案,但我无论如何都会接受。这段该死的代码造成了问题,当我删除它时,它会按预期触发。但是,如果我把代码放下来,同样的错误。有什么解决方案吗?有趣的是,我没有使用s以前是拖动的,但听起来你可能需要做更多的工作来使用“拖放”框架。谢谢@Ravi,我很快就会测试。一个问题是,这个按钮会移动整个按钮,还是创建一个“副本”因为我不想在开始拖动按钮的地方留下空白。代码只是为了移动整个按钮,而不是创建副本。嘿@Ravi,这不是好的解决方案,也不是有效的解决方案,这只是更新页边距,弄乱了UI的其余部分。我需要这个
View.DragShadowBuilder shadow=new View.DragSha的有效解决方案dowBuilder(dragBtn)
ok NP,它在我的位置工作,我不知道如何实现DragShadowBuilder。我也尝试过,但问题是事件有时会随机触发3或4次,有时会触发6、7次,甚至停止,即使我继续拖动对象。但是我没有尝试使用“拖动位置”,我只是尝试了“拖动输入”。我很快就会尝试。@ShP I recommend将event.getX()
和event.getY()
仅放在活动位置,这样您就不会得到重复的数据。您应该注意,即使您开始拖动对象,然后按住手指不动(在放下对象之前),Android可能仍然会记录一些移动,因为只触摸屏幕会产生触摸斜率。你可能可以通过截断F来减少一些“噪音”
@Override
public boolean onDrag(View v, DragEvent event) {
int action = event.getAction();
float xCoord;
float yCoord;
if(action == DragEvent.ACTION_DRAG_LOCATION) {
xCoord = event.getX();
yCoord = event.getY();
}
return event.getResult(); //returns true for valid drop or false for invalid drop
}