Android中子View如何只处理click事件?

本人写了一个可移动的浮窗,浮窗上面有好几个按钮,在触摸没有按钮的地方并滑动时,是可以移动浮窗的,但是当触摸在按钮上面时,是不能移动浮窗的,请问应该在哪里做拦截和处理才能达到这些按钮只处理click事件,而不影响浮窗的移动?

阅读 2.7k
2 个回答

不需要用onclicklistener了,在ontouch里,判断 如果是move就return false,是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同时处理一个事件” 第一个就是我的博客写的如何处理这个问题。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题