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