2011-03-29 71 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; 
     } 
    }); 
相關問題