2012-01-03 156 views
0

有這樣的問題,但他們中的大多數都問如何將GestureDetector設置爲視圖。我已經完成了,現在我想知道,android沒有提供任何圖片。 我遇到的問題是我不知道如何處理該方法中提供的velocityX/Y。 我的最後一次嘗試是這樣的:如何實現GestureListener.onFling()方法

public class TouchableImage extends SizeableImage 
    implements GestureDetector.OnGestureListener, 
    GestureDetector.OnDoubleTapListener, 
    OnTouchListener{ 

    protected GestureDetector mDetector; 

    protected Matrix mCurrentMatrix; 

    public TouchableImage(Context context) { 
     super(context); 
     init(); 
    } 

    public TouchableImage(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     init(); 
    } 

    protected void init() { 
     mCurrentMatrix = new Matrix(); 
     mDetector = new GestureDetector(getContext(), this); 
     mDetector.setOnDoubleTapListener(this); 
     if (hasImage()){ 
      onNewImage(); 

     } 
    } 

    private void onNewImage() { 
     setOnTouchListener(this); 
     setScaleType(ScaleType.MATRIX); 
     setImageMatrix(mCurrentMatrix); 
    } 

    @Override 
    public void setImageDrawable(Drawable d){ 
     super.setImageDrawable(d); 
     onNewImage(); 
    } 



    @Override 
    public void setImageBitmap(Bitmap bm) { 
     super.setImageBitmap(bm); 
     onNewImage(); 
    } 

    public boolean hasImage(){ 
     return getDrawable() != null; 
    } 

    /*GestureDetector.OnGestureListener */ 
    @Override 
    public boolean onDown(MotionEvent e) { 
     // do nothing on one finger down 
     return true; 
    } 

    @Override 
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, 
      float velocityY) { 
     LogCat.d("ZoomableImage_FLING", "x:" + velocityX + " y:" + velocityY); 
     float distanceX = velocityX/1000; 
     float distanceY = velocityY/ 1000; 
     long end = System.currentTimeMillis() + (long)(Math.abs(velocityX)> Math .abs(velocityY) ? Math.abs(velocityX)/8: Math.abs(velocityY)/8); 
      long now = System.currentTimeMillis(); 

     while (now < end){ 
      FlingRunnable fr = new FlingRunnable(e1, e2, distanceX, distanceY); 
      postDelayed(fr, 10); 
      distanceX -= distanceX/100; 
      distanceY -= distanceY/100; 
      now = System.currentTimeMillis(); 
     } 

     return true; 
    } 

    @Override 
    public void onLongPress(MotionEvent e) { 
     // do nothing onLongPress  
    } 

    @Override 
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, 
      float distanceY) { 
     LogCat.d("ZoomableImage_SCROLL", "x:" + distanceX + " y:" + distanceY); 
     mCurrentMatrix.postTranslate(distanceX * -1, distanceY *-1); 
     setImageMatrix(mCurrentMatrix); 
     return true; 
    } 

    @Override 
    public void onShowPress(MotionEvent e) { 
     // do nothing onShowPress 
    } 

    @Override 
    public boolean onSingleTapUp(MotionEvent e) { 
     // do nothing onSingleTapUp 
     return true; 
    } 


    /*GestureDetector.OnDoubleTapListener*/ 
    @Override 
    public boolean onDoubleTap(MotionEvent e) { 
     // TODO Auto-generated method stub 
     return false; 
    } 

    @Override 
    public boolean onDoubleTapEvent(MotionEvent e) { 
     // TODO Auto-generated method stub 
     return false; 
    } 

    @Override 
    public boolean onSingleTapConfirmed(MotionEvent e) { 
     // TODO Auto-generated method stub 
     return false; 
    } 

    /* Images onTouchListener */ 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     /* simply dispatch the motion Events to our GestureDetector */ 
     return mDetector.onTouchEvent(event); 
    } 


    /* sizeable Image*/ 
    @Override 
    public Matrix getCurrentMatrix() { 
     return mCurrentMatrix; 
    } 

    @Override 
    public void setImageBounds(PointF point) { 

    } 

    public class FlingRunnable implements Runnable{ 


     public MotionEvent e1; 
     public MotionEvent e2; 
     public float distanceX; 
     public float distanceY; 

     public FlingRunnable(MotionEvent e1, MotionEvent e2, float distanceX, floa t distanceY){ 
       this.e1 = e1; 
      this.e2 = e2; 
      this.distanceX = distanceX; 
      this.distanceY = distanceY; 
     } 

     @Override 
     public void run() { 
      onScroll(e1, e2, distanceX, distanceY); 
     } 

    } 

}  

一個問題我已經是找到distanceX/Yend合理的值。 我的另一個問題是,即使我有一些值,fling()似乎「立即」出現,所有onScroll()調用是同時添加和應用的。

注:我的構建目標是2.1(Eclair的),所以我不能使用在2.2(升級Froyo)發明了更好的探測器

回答

0

看看這個代碼,

public class gesture extends Activity implements OnGestureListener 
{ 
private GestureDetector gestureScanner; 

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
super.onCreate(savedInstanceState); 
gestureScanner = new GestureDetector(this); 
Toast.makeText(gesture.this, "Perform Some gestures on screen", Toast.LENGTH_LONG).show(); 
setContentView(R.layout.main); 
} 

@Override 
public boolean onTouchEvent(MotionEvent me) 
{ 
return gestureScanner.onTouchEvent(me); 
} 

@Override 
public boolean onDown(MotionEvent e) 
{ 
Toast.makeText(gesture.this, "Motion Event Performed", Toast.LENGTH_LONG).show(); 
return true; 
    } 

@Override 
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) 
{ 
Toast.makeText(gesture.this, "Fling Event performed", Toast.LENGTH_LONG).show(); 
return true; 
} 

@Override 
public void onLongPress(MotionEvent e) 
{ 
Toast.makeText(gesture.this, "Long-Press event performed", Toast.LENGTH_LONG).show(); 
} 

@Override 
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) 
{ 
Toast.makeText(gesture.this, "Scroll event performed", Toast.LENGTH_LONG).show(); 
return true; 
} 

@Override 
public void onShowPress(MotionEvent e) 
{ 
Toast.makeText(gesture.this, "Show-Press event performed", Toast.LENGTH_LONG).show(); 
} 

@Override 
public boolean onSingleTapUp(MotionEvent e) 
{ 
Toast.makeText(gesture.this, "Single-Tap event performed", Toast.LENGTH_LONG).show(); 
return true; 
} 
} 

Documentation of GestureListenerTutorials project

這裏是根據你的問題看這個答案的最佳解決方案:

Fling gesture detection on grid layout and How to make horizontal scrolling view in android

另一個一扔教程: how to implement both ontouch and also onfling in a same listview?

+0

您的代碼示例是沒有用的,並不會因爲工作aspected:如果有人「甩」在圖像上,有超過10個項目在第二個抵達。吐司顯示最少2秒,所以日誌會好很多。我也有這個問題。我所擁有的問題更多的是如何讓一張圖片(比屏幕更大)「隨意」(如果有人「Fl過」)。不幸的是,您的鏈接都不是有用的 – 2012-01-03 21:35:34