2012-01-03 24 views
0

このような質問がたくさんありますが、ほとんどの人がGestureDetectorをViewに設定する方法を尋ねています。私はすでにそれをしています、そして今、私は、アンドロイドがImage Flingを許可するものは何も提供していないと思っています。 私が持っている問題は、そのメソッドで提供されている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/Yためとendのための合理的な値を見つけることです。 私が持っている別の問題いくつかの値を持っていても、fling()は「一度に」表示されているように、すべてのonScroll()コールが同時に追加されて適用されるようです。

注:私のビルドターゲットは2.1(エクレア)であるので、私はより良い2.2(フローズンヨーグルト)に発明ディテクタ

答えて

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 GestureListenerここでTutorials project

あなたの質問に応じて最高の解決策は、この答えを見て:

Fling gesture detection on grid layoutHow to make horizontal scrolling view in android

別の情事チュートリアル: how to implement both ontouch and also onfling in a same listview?

+0

あなたのコードサンプルが有用ではなかった、とのように動作しませんaspected:誰かが画像の上に「投げつける」場合は、2番目に到着した10以上のイベントがあります。トーストは2秒間で表示されるので、ログははるかに良いでしょう。また、私はすでに私の質問にそれを持っています。私が持っている質問は、誰かが "Flings"した場合、画像(スクリーンよりも大きい)を "アフタースクール"にするために何をすべきかです。残念ながらあなたのリンクのどれも役に立たなかった –