在android应用中我做了一个悬浮框,布局界面就一个button,我怎么区分我是做了这个按钮的setOnClickListener还是setOnTouchListener事件,setOnTouchListener是使这个按钮移动,setOnClickListener是点击这个按钮触发的事件,但往往只有触发一个事情,怎样才能很好的解决这个问题,请教高手,贴几行代码?
解决方案 »
- ndk C调用java中的方法
- Android RelativeLayout
- Android ctwep的问题
- 有关 Android 3.0 的疑问
- 求ophone的屏保的设计思路或源码
- 自定义横向listview响应点击item消息的时候,adapter为空,程序异常
- 请问ndk-build里的make不支持.mk里文件名为*.c?
- 【急求】android源码编译时如何用指定文件覆盖已有文件
- 有没有搞Android下wifi开发的一起交流下
- android studio1.4编译报错
- 在PopupWindow中使用EditText.setError()报错
- C#编写的socket服务器怎么发数据给android手机?
setOnClickListener的监控时间只监控到手指ACTION_DOWN时发生的行为
加信号量的方法,就是加变量来控制有些代码在什么时候能走到,什么时候走不到。
典型的if/switch语句
case MotionEvent.ACTION_MOVE:
x = (int) event.getX();
y = (int) event.getY();
break;
case MotionEvent.ACTION_UP:
if(x...&&y..){移动的处理}else{点击的处理}PS:x,y具体的判断值因你的布局而异。
因为有的时候手指按下的时候可能会有小小的移动,所以你判断的时候可以当X,Y足够小的情况下视为正常按下。
if(event.getX()-mTouchStartX>5||event.getY()-mTouchStartY>5)
{
updateViewPosition();
mTouchStartX=mTouchStartY=0;
}
else
{
Utils.startActivity(AlbumActivityXnew.this,Album_photograph.class);
}
break;
mTouchStartX这个是什么时候获取的?不用做减法,ACTION_MOVE事件返回的值可以直接用。
这个你可以在你的真机上调试下,就能看出来效果。
if(event.getX()-mTouchStartX>5||event.getY()-mTouchStartY>5)
{
updateViewPosition();
mTouchStartX=mTouchStartY=0;
}
else
{
Utils.startActivity(AlbumActivityXnew.this,Album_photograph.class);
}
break;基本上可以这样理解
在onTouch事件的action_move里, 判断事件移动位置是否超过某一设定值,并设置标志来区分click事件
我的touch事件是这样写的不知道对不对,但是还是没什么效果,还是没有很好的区分touch事件和点击事件,这个怎么改才正确,求教
// TODO Auto-generated method stub
//获取相对屏幕的坐标,即以屏幕左上角为原点
x = event.getRawX();
y = event.getRawY()-25; //25是系统状态栏的高度
Log.i("currP", "currX"+x+"====currY"+y);
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
//获取相对View的坐标,即以此View左上角为原点
mTouchStartX = event.getX();
mTouchStartY = event.getY();
Log.i("startP", "startX"+mTouchStartX+"====startY"+mTouchStartY);
// isPressed=false;
break;
case MotionEvent.ACTION_MOVE:
updateViewPosition();
//isPressed=true;
break; case MotionEvent.ACTION_UP:
//event.getXPrecision()
if(event.getX()-mTouchStartX>5||event.getY()-mTouchStartY>5)
{
updateViewPosition();
mTouchStartX=mTouchStartY=0;
}
else
{
Utils.startActivity(AlbumActivityXnew.this,Album_photograph.class);
}
break;
default:
break;
}
return true; }
});
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Log.i("startP", "startX"+mTouchStartX+"====startY"+mTouchStartY);
// isPressed=false;
break;
case MotionEvent.ACTION_MOVE:
//获取相对View的坐标,即以此View左上角为原点
mTouchStartX = event.getX();
mTouchStartY = event.getY();
//isPressed=true;
break;case MotionEvent.ACTION_UP:
//event.getXPrecision()if(mTouchStartX>5||mTouchStartY>5)
{
updateViewPosition();
mTouchStartX=mTouchStartY=0;
}
else
{
Utils.startActivity(AlbumActivityXnew.this,Album_photograph.class);
}
break;
default:
break;
}
return true;}
});
试试能否达到你的要求。
建议:明确下各个事件的调用时机。
当onTouch事件返回ture时将不会把事件传递到onClick事件(表面当前的事件已经处理,不需往下传递)只要控制好onTouch事件什么时候返回true或者false 就能解决你的问题了
这是因为回调函数的返回值所引起的,如果在Touch事件的down action的时候返回false,则表示这个组件不会吃掉这个down event,并且对touch的后续动作都不感兴趣。
也就是说如果在onTouch里面是返回true,那么onClick当然就无法再被回调了。
只要将你的onTouch函数返回false,那么后面的onClick()就可以生效了。