android 中怎么很好的解决setOnClickListener和setOnTouchListener冲突

xinyuetonghua 2012-05-03 08:29:06
在android应用中我做了一个悬浮框,布局界面就一个button,我怎么区分我是做了这个按钮的setOnClickListener还是setOnTouchListener事件,setOnTouchListener是使这个按钮移动,setOnClickListener是点击这个按钮触发的事件,但往往只有触发一个事情,怎样才能很好的解决这个问题,请教高手,贴几行代码?
...全文
19409 24 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
WSQ458542323976 2013-10-18
  • 打赏
  • 举报
回复
解决了贴段代码,让我们也参考一下
miginfo 2013-09-27
  • 打赏
  • 举报
回复
你是怎么解决的啊。我也遇到了这个问题
buhaixiang0923 2013-06-24
  • 打赏
  • 举报
回复
20楼正解,本人已解决这两个事件的问题,谢谢。
wjaycooode 2013-05-11
  • 打赏
  • 举报
回复
本人测试过, 这是因为回调函数的返回值所引起的,如果在Touch事件的down action的时候返回false,则表示这个组件不会吃掉这个down event,并且对touch的后续动作都不感兴趣。 也就是说如果在onTouch里面是返回true,那么onClick当然就无法再被回调了。 只要将你的onTouch函数返回false,那么后面的onClick()就可以生效了。
shjhotmail 2013-03-08
  • 打赏
  • 举报
回复
MARK一下,以后用的到~
lovehong0306 2012-08-02
  • 打赏
  • 举报
回复
ACTION_DOWN ACTION_UP构成一个click时间
当onTouch事件返回ture时将不会把事件传递到onClick事件(表面当前的事件已经处理,不需往下传递)

只要控制好onTouch事件什么时候返回true或者false 就能解决你的问题了
  • 打赏
  • 举报
回复
public boolean onTouch(View v, MotionEvent event) {


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;

}
});


试试能否达到你的要求。
建议:明确下各个事件的调用时机。
xinyuetonghua 2012-05-04
  • 打赏
  • 举报
回复
public boolean onTouch(View v, MotionEvent event) {

// 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;

}
});
xinyuetonghua 2012-05-04
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

引用 10 楼 的回复:
引用 9 楼 的回复:

你的需求理解了。用不到信号量,也用不到onclick,只要用一个变量记录的ACTION_MOVE的x,y。来判断是否移动了就行。
case MotionEvent.ACTION_MOVE:
x = (int) event.getX();
y = (int) event.getY();
break;
case MotionEve……
[/Quote]

我的touch事件是这样写的不知道对不对,但是还是没什么效果,还是没有很好的区分touch事件和点击事件,这个怎么改才正确,求教
lunar1983 2012-05-04
  • 打赏
  • 举报
回复
请问是不是这样做判断
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事件
zgycsmb 2012-05-04
  • 打赏
  • 举报
回复
1楼说的对呀
给点分吧,
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]
引用 9 楼 的回复:

你的需求理解了。用不到信号量,也用不到onclick,只要用一个变量记录的ACTION_MOVE的x,y。来判断是否移动了就行。
case MotionEvent.ACTION_MOVE:
x = (int) event.getX();
y = (int) event.getY();
break;
case MotionEvent.ACTION_UP:
i……
[/Quote]

mTouchStartX这个是什么时候获取的?不用做减法,ACTION_MOVE事件返回的值可以直接用。
这个你可以在你的真机上调试下,就能看出来效果。
sosoyiyi 2012-05-04
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

setOnTouchListener是监控从点下鼠标 (可能拖动鼠标)到放开鼠标(鼠标可以换成手指)的整个过程 ,他的回调函数是onTouchEvent(MotionEvent event),然后通过判断event.getAction()是MotionEvent.ACTION_UP还是ACTION_DOWN还是ACTION_MOVE分别作不同行为。


setOnClickListener……
[/Quote]
你确定setOnClickListener只监控ACTION_DOWN的行为?按照你的说法,只要有Touch的行为,那就可以触发setOnclickListener?你可以自己去试试看,setOnClickListener到底是不是ACTION_DOWNH和ACTION_UP一起触发的,单纯的写代码进ACTION_DOWN里并不能实现setOnClickListener的效果。
xinyuetonghua 2012-05-04
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

你的需求理解了。用不到信号量,也用不到onclick,只要用一个变量记录的ACTION_MOVE的x,y。来判断是否移动了就行。
case MotionEvent.ACTION_MOVE:
x = (int) event.getX();
y = (int) event.getY();
break;
case MotionEvent.ACTION_UP:
if(x...&&am……
[/Quote]请问是不是这样做判断
if(event.getX()-mTouchStartX>5||event.getY()-mTouchStartY>5)
{
updateViewPosition();
mTouchStartX=mTouchStartY=0;
}
else
{
Utils.startActivity(AlbumActivityXnew.this,Album_photograph.class);
}
break;
xinyuetonghua 2012-05-04
  • 打赏
  • 举报
回复
请教啊
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
因为我既要处理按钮的点击事件,又要触发按钮的onTouchEvent事件的时间不触发onclick事件,真不知道该怎样很好的处理,看网上有些代码是加上一个判断标志,请教该如果处理
[/Quote]

加信号量的方法,就是加变量来控制有些代码在什么时候能走到,什么时候走不到。
典型的if/switch语句
android_baiyuchuan 2012-05-03
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

可以不用setOnClickListener这个监听,将该监听的内容放在onTouchEvent的ACTION_DOWN来处理
[/Quote]
我看行!
xinyuetonghua 2012-05-03
  • 打赏
  • 举报
回复
因为我既要处理按钮的点击事件,又要触发按钮的onTouchEvent事件的时间不触发onclick事件,真不知道该怎样很好的处理,看网上有些代码是加上一个判断标志,请教该如果处理
  • 打赏
  • 举报
回复
可以不用setOnClickListener这个监听,将该监听的内容放在onTouchEvent的ACTION_DOWN来处理
j_f0001 2012-05-03
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

setOnTouchListener是监控从点下鼠标 (可能拖动鼠标)到放开鼠标(鼠标可以换成手指)的整个过程 ,他的回调函数是onTouchEvent(MotionEvent event),然后通过判断event.getAction()是MotionEvent.ACTION_UP还是ACTION_DOWN还是ACTION_MOVE分别作不同行为。


setOnClickListener……
[/Quote]
正解,LZ可以看看自己的逻辑整理正确没有
加载更多回复(4)

80,471

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧