2011-03-29 75 views

回答

9

注册一个LongCLickListener。如果识别出长时间点击,则将标志设置为真。

在OnTouch方法中,只有标志设置为true时才允许缩放和移动。移动和缩放后,将标志再次设置为假。

下面是一些伪代码:

public class MyActivity extends Activity { 

    private boolean longClick = false; 

    public boolean onTouch(View v, MotionEvent event) { 
     if (longClick) { 
     // do scaling and moving ... 
     longClick = false; 
     } 
     return false; 
    } 

    public boolean onLongClick(View v) { 
     longClick = true; 
     return false; 
    } 
} 
+0

我试图在ImageView上做到这一点。那么,我为它设置了哪些听众? onLongClick或onTouch? – 2011-03-29 12:03:11

+0

他们俩。在onLongClick中,您可以检查以前是否有长时间点击,并且在onTouch中,您可以像现在这样做移动和缩放。 – RoflcoptrException 2011-03-29 12:05:23

+0

是的,我不敢恭维。但是说我正在实现一个'ImageView视图'点击,那么我应该写'view.setOnLongClickListener()'?并设置我的类实现'onLongClickListener'和'onTouchListener'? – 2011-03-30 04:50:13

2

Roflcoptr的主要思路是正确的,但即使你没有将长按移动鼠标指针,onLongClick将被调用。为了避免这种情况,您可以使用此代码:

final int NONE=0; 
final int DRAG=1; 
final int LONG_PRESS=2; 
int mode=NONE; 

PointF start=new PointF(); 

public boolean onLongClick(View v) { 
    if(mode==NONE) mode=LONG_PRESS; //it helps to avoid unwanted onLongClick 
    return false; 
} 

public boolean onTouch(View v, MotionEvent event){ 
    switch(event.getAction() & MotionEvent.ACTION_MASK){ 
     case MotionEvent.ACTION_DOWN: 
      start.set(event.getX(),event.getY()); //point where we started from 
      break; 
     case MotionEvent.ACTION_UP: 
      mode=NONE; 
      break; 
     case MotionEvent.ACTION_MOVE: 
      if(mode==NONE && getDistance(event.getX(),event.getY(),start.x,start.y)>30d) mode=DRAG; //if we really move our pointer, then start the drag mode. 
      //it helps to avoid unwanted moving 

      if(mode==DRAG){ 
      //do your stuff 
      } 
      if(mode==LONG_PRESS){ 
      //do your stuff 
      } 
      break; 
    } 
} 

//returns distance between 2 points 
private double getDistance(float x1,float y1,float x2,float y2){ 
    float dx=Math.abs(x1-x2); 
    float dy=Math.abs(y1-y2); 
    return Math.sqrt(dx*dx+dy*dy); 
} 

希望这将帮助别人)

+0

辉煌的代码,帮助我!谢谢一堆 – 2013-04-17 18:02:39

2

您可以创建两个View.ontouchlistener一个用于工作,一个空,并设置监听器只查看onlongpress

LinearLayout.LayoutParams longpressLP = new LinearLayout.LayoutParams(100,100); 
    LinearLayout longpress = new LinearLayout(this); 
    longpress.setBackgroundColor(Color.GREEN); 
    mainlayout.addView(longpress,longpressLP); 



    final View.OnTouchListener buttontouch=new View.OnTouchListener() { 

     public boolean onTouch(View v, MotionEvent event) { 
      // TODO Auto-generated method stub 
      if(event.getAction()==MotionEvent.ACTION_DOWN) 
       v.setOnTouchListener(buttontouchnone); 
      else 
       Toast.makeText(getApplicationContext(), "Touched", Toast.LENGTH_SHORT).show(); 
      return false; 
     } 
    }; 
    final View.OnTouchListener buttontouchnone=new View.OnTouchListener() { 

     public boolean onTouch(View v, MotionEvent event) { 
      // TODO Auto-generated method stub 
      Toast.makeText(getApplicationContext(), "None Touch", Toast.LENGTH_SHORT).show(); 
      return false; 
     } 
    }; 
    longpress.setOnTouchListener(buttontouch); 
    longpress.setOnLongClickListener(new View.OnLongClickListener() { 

     public boolean onLongClick(View v) { 
      // TODO Auto-generated method stub 
      Toast.makeText(getApplicationContext(), "LongClick", Toast.LENGTH_SHORT).show(); 
      v.setOnTouchListener(buttontouch); 
      return true; 
     } 
    }); 
相关问题