关于Android中onTouch时间与onClick事件的监听问题

       在项目中经常在同一个界面中会用到onTouch时间与onClick事件,这两个事件有时候会有冲突,或者导致其中一个事件监听不起作用。下面说一下关于这两个事件同时存在的时候的处理方法。先上代码。

/**小猫的监听事件**/
private void initCatListener(){
//左侧小猫的点击事件
anim_cat.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
k++;
            if(k%2>0){
            anim_cat.layout(824, 400, 1024, 600);//
            huanfu.setBackgroundResource(R.drawable.huanfu_selector);
            honghua.setBackgroundResource(R.drawable.yuyin_selector);
            }
            else{
            anim_cat.layout(824, 400, 1024, 600);
            huanfu.setBackgroundResource(R.color.transparent);
            honghua.setBackgroundResource(R.color.transparent);
            }
            v.setBackgroundResource(R.anim.sit_stand);
            handler.post(st_thread);
}
});
//右侧小猫的触摸监听事件
anim_cat.setOnTouchListener(new OnTouchListener() {
int lastX, lastY,lastX1,lastY1;
@Override
public boolean onTouch(View v, MotionEvent event) {
DisplayMetrics dm = getResources().getDisplayMetrics(); 
       int  screenWidth = dm.widthPixels; 
       int  screenHeight = dm.heightPixels;         
int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN: 
lastX1 = (int) event.getRawX(); 
               lastY1 = (int) event.getRawY(); 
               lastX = (int) event.getRawX(); 
               lastY = (int) event.getRawY();
               return false;
            //拖拽动画    
            case MotionEvent.ACTION_MOVE:        
            int dx = (int) event.getRawX() - lastX; 
               int dy = (int) event.getRawY() - lastY; 
               if(Math.sqrt(dx*dx+dy*dy)>20){
               int left = v.getLeft() + dx; 
               int top = v.getTop() + dy; 
               int right = v.getRight() + dx; 
               int bottom = v.getBottom() + dy; 
                // 设置不能出界 
               if (left < 0) { 
                    left = 0; 
                    right = left + v.getWidth(); 
               }  
               if (right > screenWidth) { 
                    right = screenWidth; 
                    left = right - v.getWidth(); 
                }  
                if (top < 0) { 
                    top = 0; 
                    bottom = top + v.getHeight(); 
                }  
                if (bottom > screenHeight) { 
                    bottom = screenHeight; 
                    top = bottom - v.getHeight(); 
                } 
                v.setBackgroundResource(R.anim.tuo_show);
                v.layout(left, top, right, bottom); 
                
                lastX = (int) event.getRawX(); 
                lastY = (int) event.getRawY();  
               }
               return false; 
            //单击弹出气泡,移动拖拽
            case MotionEvent.ACTION_UP:              
            int lastX2 = (int) event.getRawX();
            int lastY2 = (int) event.getRawY();
           
            //右侧底角,判断是点击还是拖拽
            if(lastX2>screenWidth/2 ){            
            //滑动的宽和高都小于1的时候,认为是点击事件,弹出泡泡
            if(Math.abs(lastX2-lastX1)<1 && Math.abs(lastY2-lastY1)<1){
            return false;
            }else{
            //恢复到右下角
                anim_cat.layout(824, 400, 1024, 600);
            anim_cat2.setVisibility(View.GONE);
            cat_layout.setVisibility(View.VISIBLE);
            anim_cat.setVisibility(View.VISIBLE);
            anim_cat.setBackgroundResource(R.anim.sit_stand);
                startAnimaton(anim_cat);
                return true;
            }
            }
            else{
            //隐藏右下角,显示左下角小猫
            anim_cat.setVisibility(View.GONE);
            cat_layout2.setVisibility(View.VISIBLE);
            anim_cat2.layout(0, 400, 200, 600);
            anim_cat2.setVisibility(View.VISIBLE);
            anim_cat2.setBackgroundResource(R.anim.sit_stand);
            honghua.setBackgroundResource(R.color.transparent);
            huanfu.setBackgroundResource(R.color.transparent);
                startAnimaton(anim_cat2);
                k = 0;//防止泡泡显示时拖拽到另一侧,又恢复到左侧,第一次点击小猫泡泡不显示的问题
                return true;
            }                                
           }
return false;              
}
});

        前面是点击事件的监听,后面是触摸事件的监听,这两个事件的关键点在于onTouch事件的监听中。case MotionEvent.ACTION_DOWN:按钮被按下的时候,要做的操作,通常情况下,在switch中一个case中的方法执行完毕之后,要用break来结束。但是,在此处,要return false;这里的return false是什么意思呢?

        onTouch事件的监听返回的是一个布尔型的值,在DOWN事件结束的时候,返回false,意思就是说监听没有结束,要继续往下进行。在MOVE事件中,返回的还是false,监听继续有效。在UP事件中,判断MOVE的距离,距离小于1,return false;默认拖动距离小于1当做点击事件处理,此时的onClickListener就起作用了。move距离大于1,return true;表示监听已经结束,不再继续往下执行,onClick事件不起作用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值