끌어서 놓기 코드를 작성했지만 지금까지 제대로 작동하지만 핑거의 속도와 방향에 따라 인식하고 작동 할 수 있어야합니다 (계속 움직입니다. 손가락이 벌써 올라간다 고해도 관성이 추가됩니다.)드래그 앤 드롭의 관성 움직임
2
A
답변
2
나는 일부 사용자 지정 onTouchEvent 수신기를 사용하고 inerce 운동의 거리를 결정하기 위해 VelocityTracker를 사용했다 : 이것의 좋은 예는 페이스 북의 chatheads 될 것이다. 그럼 간단하게 애니메이션을 번역를 사용하여 새로운 장소에 실제보기 여백을 설정 onAnimationEnd 무시하고, 그
이
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;
}
}
}
드래그 앤 드롭 코드를 공유 할 수 있습니까? –