2013-05-21 3 views
2

끌어서 놓기 코드를 작성했지만 지금까지 제대로 작동하지만 핑거의 속도와 방향에 따라 인식하고 작동 할 수 있어야합니다 (계속 움직입니다. 손가락이 벌써 올라간다 고해도 관성이 추가됩니다.)드래그 앤 드롭의 관성 움직임

enter image description here

답변

2

나는 일부 사용자 지정 onTouchEvent 수신기를 사용하고 inerce 운동의 거리를 결정하기 위해 VelocityTracker를 사용했다 : 이것의 좋은 예는 페이스 북의 chatheads 될 것이다. 그럼 간단하게 애니메이션을 번역를 사용하여 새로운 장소에 실제보기 여백을 설정 onAnimationEnd 무시하고, 그

+1

드래그 앤 드롭 코드를 공유 할 수 있습니까? –

0

가 자신의 값을 설정할 수 있습니다

public class OnSwipeTouchListener implements OnTouchListener { 
private final GestureDetector gestureDetector = new GestureDetector(new GestureListener()); 

public boolean onTouch(final View view, final MotionEvent motionEvent) { 

    return gestureDetector.onTouchEvent(motionEvent); 
} 

private final class GestureListener extends SimpleOnGestureListener { 

    private static final int SWIPE_THRESHOLD = 100; 
    private static final int SWIPE_VELOCITY_THRESHOLD = 100; 

    @Override 
    public boolean onDown(MotionEvent e) { 
     return true; 
    } 

    @Override 
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
     boolean result = false; 
     try { 
      float diffY = e2.getY() - e1.getY(); 
      float diffX = e2.getX() - e1.getX(); 
      if (Math.abs(diffX) > Math.abs(diffY)) { 
       if (Math.abs(diffX) > SWIPE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) { 
        if (diffX > 0) { 
         onSwipeRight(); 
        } else { 
         onSwipeLeft(); 
        } 
       } 
      } else { 
       if (Math.abs(diffY) > SWIPE_THRESHOLD && Math.abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) { 
        if (diffY > 0) { 
         onSwipeBottom(); 
        } else { 
         onSwipeTop(); 
        } 
       } 
      } 
     } catch (Exception exception) { 
      exception.printStackTrace(); 
     } 
     return result; 
    } 
} 

public boolean onSwipeRight() { 
    return false; 
} 

public boolean onSwipeLeft() { 
    return false; 
} 

public boolean onSwipeTop() { 
    return false; 
} 

public boolean onSwipeBottom() { 
    return false; 
}} 

슬쩍 터치 청취자에 대한 사용자 정의를 사용하여 그것을 :)입니다 SWIPE_THRESHOLD 및 SWIPE_VELOCITY_THRESHOLD

에 대한 는

당신은 당신이시를 재정 의하여이 코드 조각을 사용할 수 있습니다

 findViewById(R.id.inner_content).setOnTouchListener(new OnSwipeTouchListener(){ 
     public boolean onSwipeTop() { 
       Toast.makeText(SampleActivity.this, "top", Toast.LENGTH_SHORT).show(); 
       return true; 
      } 
      public boolean onSwipeRight() { 
       Toast.makeText(SampleActivity.this, "right", Toast.LENGTH_SHORT).show();      
       return true; 
      } 
      public boolean onSwipeLeft() { 
       Toast.makeText(SampleActivity.this, "left", Toast.LENGTH_SHORT).show(); 
       return true; 
      } 
      public boolean onSwipeBottom() { 
       Toast.makeText(SampleActivity.this, "bottom", Toast.LENGTH_SHORT).show(); 
       return true; 
      } 
    }); 
+0

이것은 기본적인 동작입니다. 내가 한 일은 관성이 있고 손가락이 올라간 후에도 손가락 제스처를 따르는 것입니다. – user809486

-2

다음 코드를 사용하여 구현할 수 있습니다 mpleOnGestureListener

package com.ViewFlipperDemo; 

import android.app.Activity; 
import android.content.Context; 
import android.content.res.Configuration; 
import android.gesture.GestureLibraries; 
import android.gesture.GestureLibrary; 
import android.gesture.GestureOverlayView; 
import android.gesture.GestureOverlayView.OnGesturePerformedListener; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.os.Bundle; 
import android.view.GestureDetector; 
import android.view.KeyEvent; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.GestureDetector.SimpleOnGestureListener; 
import android.view.View.OnTouchListener; 
import android.view.animation.AnimationUtils; 
import android.widget.ImageView; 
import android.widget.Toast; 
import android.widget.ViewFlipper; 

//import com.ViewFlipperDemo.ViewFlipperSampleActivity.MyGestureDetector; 

public class FlipActivity extends Activity { 

    private static final int SWIPE_MIN_DISTANCE = 60; 
    private static final int SWIPE_THRESHOLD_VELOCITY = 100; 

    private ViewFlipper vf; 
    private Context mContext; 
    private final GestureDetector detector = new GestureDetector(
      new MyGestureDetector()); 


    @Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) { 
     return true; 
    } 
    @Override 
    public boolean onKeyLongPress(int keyCode, KeyEvent event) { 
     return true; 
    } 
    @Override 
    public boolean onKeyUp(int keyCode, KeyEvent event) { 
     return true; 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     Configuration config = getResources().getConfiguration(); 
     config.hardKeyboardHidden=1; 
     mContext = this; 
     vf = (ViewFlipper) this.findViewById(R.id.vfShow); 
     vf.setOnTouchListener(new OnTouchListener() { 
      @Override 
      public boolean onTouch(final View view, final MotionEvent event) { 
       detector.onTouchEvent(event); 
       return true; 
      } 
     }); 

     vf.addView(addImageView(R.drawable.scott)); 
     vf.addView(addImageView(R.drawable.ricardo)); 

    } 

    View addImageView(int resId) { 
     ImageView iv = new ImageView(this); 
     iv.setImageResource(resId); 

     return iv; 
    } 

    class MyGestureDetector extends SimpleOnGestureListener { 
     GestureLibrary mLibrary; 

     Canvas cv=new Canvas(); 
     Paint pp=new Paint(); 



     public boolean onDoubleTap(MotionEvent e1){ 


      return false; 

     } 

     @Override 
     public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, 
       float velocityY) { 
      try { 


      /* mLibrary = GestureLibraries.fromRawResource(this, R.raw.gestures); 
        if (!mLibrary.load()) { 
        finish(); 
        } 

        GestureOverlayView gestures = (GestureOverlayView) findViewById(R.id.gestures); 
        gestures.addOnGesturePerformedListener((OnGesturePerformedListener) this); 
       */pp.setColor(Color.RED); 

       // right to left swipe 
       if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE 
         && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 



        cv.drawLine(e1.getX(), e1.getY(), e2.getX(), e1.getY(),pp); 

        Toast.makeText(FlipActivity.this,"jj", 
          Toast.LENGTH_SHORT).show(); 
       // vf.setInAnimation(AnimationUtils.loadAnimation(mContext,R.anim.left_in)); 
      // vf.setOutAnimation(AnimationUtils.loadAnimation(mContext,R.anim.left_out)); 
       // vf.showNext(); 
        return true; 
       } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE 
         && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
        //Toast.makeText(FlipActivity.this,"hi", 
          // Toast.LENGTH_SHORT).show(); 

        cv.drawLine(e1.getX(), e1.getY(), e2.getX(), e1.getY(),pp); 
       // vf.setInAnimation(AnimationUtils.loadAnimation(mContext,R.anim.right_in)); 
       // vf.setOutAnimation(AnimationUtils.loadAnimation(mContext,R.anim.right_out)); 
       // vf.showPrevious(); 
        return true; 
       } 

      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

      return false; 
     } 
    } 
}