本人写了一个可移动的浮窗,浮窗上面有好几个按钮,在触摸没有按钮的地方并滑动时,是可以移动浮窗的,但是当触摸在按钮上面时,是不能移动浮窗的,请问应该在哪里做拦截和处理才能达到这些按钮只处理click事件,而不影响浮窗的移动?
本人写了一个可移动的浮窗,浮窗上面有好几个按钮,在触摸没有按钮的地方并滑动时,是可以移动浮窗的,但是当触摸在按钮上面时,是不能移动浮窗的,请问应该在哪里做拦截和处理才能达到这些按钮只处理click事件,而不影响浮窗的移动?
我之前遇到过这个问题,可以看看下面的代码,
private CustomerClickListener customerClickListener=CustomerClickListener.getInstance();
itemImage.setImageBitmap(bitmap);
itemImage.setOnTouchListener(new OnTouchListener(){
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
if(motionEvent.getAction()==MotionEvent.ACTION_DOWN&& OPENStatus.getClick()==0){
//以下是点击事件的逻辑处理,可以自定义逻辑代码
//这是我的一种用来处理点击事件的状态,用来避免用户重复点击的状态判断,最好使用一个静态类,这样可以全局进行判断点击的状态;
//1是用户触摸了子view,2是代表用户的是点击事件,需要调用事件,0是正常状态(即什么都没干)
//setClick是一个静态变量,
OPENStatus.setClick(1);
//下面的我要执行的点击事件的操作,我的是使用Intent打开一个界面的功能,
Intent intent = new Intent();
intent.setAction(Constance.SHOWDETAIL);
ArrayList<String> openImageLists = (ArrayList)entries.getOpenImageLists();
intent.putStringArrayListExtra("values",openImageLists);
customerClickListener.setIntent(intent);
}
//最重要的是全部return false;避免父view不处理事件
return false;
}
});
自定义父view的自定义部分:
//首先要有CustomerClickListener的引用,这个类是子view的点击时间的处理类,自己编写
private CustomerClickListener customerClickListener=CustomerClickListener.getInstance();
//重写onTouchEvent事件,进行处理触摸事件即可
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN://表示用户按下的一瞬间
lastx=getScrollX();
//是否是点击事件的状态,当按下就先设置为true
isClick = true;
x=(int)event.getX();
break;
case MotionEvent.ACTION_MOVE://表示用户按下之后在屏幕上移动的过程
int moveX = (int) event.getX();
int distance = moveX - x;
scrollBy(-distance,0);
//如果点击事件为1,那么就重置为0
if(OPENStatus.getClick()==1){
OPENStatus.setClick(0);
}
//一旦有滚动,就不是点击事件了
isClick = false;
break;
case MotionEvent.ACTION_UP://标识的是用户抬起的一瞬间
//点击事件,如果是抬起后没有发生滚动,则代表还是点击事件为true
if (isClick) {
synchronized (this){
//如果状态为1,则代表这个操作是个子view的点击事件
if(OPENStatus.getClick()==1) {
//设置2是为了
OPENStatus.setClick(2);
//这个clickListener和子view中的CustmerClickListener是同一个类,也是同一个对象;
//调用事件的处理方法
customerClickListener.callOpen();
}
}
具体可以直接百度 “安卓如何解决子view与父view同时处理一个事件” 第一个就是我的博客写的如何处理这个问题。
3 回答914 阅读✓ 已解决
2 回答1k 阅读✓ 已解决
1 回答794 阅读✓ 已解决
2 回答913 阅读
2 回答850 阅读
1 回答789 阅读
1 回答838 阅读
不需要用onclicklistener了,在ontouch里,判断 如果是move就return false,是click就执行原来的点击操作