在android应用中我做了一个悬浮框,布局界面就一个button,我怎么区分我是做了这个按钮的setOnClickListener还是setOnTouchListener事件,setOnTouchListener是使这个按钮移动,setOnClickListener是点击这个按钮触发的事件,但往往只有触发一个事情,怎样才能很好的解决这个问题,请教高手,贴几行代码?

解决方案 »

  1.   

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

  2.   

    可以不用setOnClickListener这个监听,将该监听的内容放在onTouchEvent的ACTION_DOWN来处理
      

  3.   

    因为我既要处理按钮的点击事件,又要触发按钮的onTouchEvent事件的时间不触发onclick事件,真不知道该怎样很好的处理,看网上有些代码是加上一个判断标志,请教该如果处理
      

  4.   


    加信号量的方法,就是加变量来控制有些代码在什么时候能走到,什么时候走不到。
    典型的if/switch语句
      

  5.   

    你的需求理解了。用不到信号量,也用不到onclick,只要用一个变量记录的ACTION_MOVE的x,y。来判断是否移动了就行。
    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足够小的情况下视为正常按下。
      

  6.   

    请问是不是这样做判断
    if(event.getX()-mTouchStartX>5||event.getY()-mTouchStartY>5)
             {
             updateViewPosition();
             mTouchStartX=mTouchStartY=0;
             }
             else
             {
              Utils.startActivity(AlbumActivityXnew.this,Album_photograph.class);
             }
             break;
      

  7.   

    你确定setOnClickListener只监控ACTION_DOWN的行为?按照你的说法,只要有Touch的行为,那就可以触发setOnclickListener?你可以自己去试试看,setOnClickListener到底是不是ACTION_DOWNH和ACTION_UP一起触发的,单纯的写代码进ACTION_DOWN里并不能实现setOnClickListener的效果。
      

  8.   


    mTouchStartX这个是什么时候获取的?不用做减法,ACTION_MOVE事件返回的值可以直接用。
    这个你可以在你的真机上调试下,就能看出来效果。
      

  9.   

    请问是不是这样做判断
    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事件
      

  10.   


    我的touch事件是这样写的不知道对不对,但是还是没什么效果,还是没有很好的区分touch事件和点击事件,这个怎么改才正确,求教
      

  11.   

    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; }
    });
      

  12.   

    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;}
    });
    试试能否达到你的要求。
    建议:明确下各个事件的调用时机。
      

  13.   

    ACTION_DOWN ACTION_UP构成一个click时间
    当onTouch事件返回ture时将不会把事件传递到onClick事件(表面当前的事件已经处理,不需往下传递)只要控制好onTouch事件什么时候返回true或者false 就能解决你的问题了
      

  14.   

    本人测试过,
    这是因为回调函数的返回值所引起的,如果在Touch事件的down action的时候返回false,则表示这个组件不会吃掉这个down event,并且对touch的后续动作都不感兴趣。
    也就是说如果在onTouch里面是返回true,那么onClick当然就无法再被回调了。
    只要将你的onTouch函数返回false,那么后面的onClick()就可以生效了。