之間,我想創建一個動畫:Android的衝突OnTouchListener SimpleOnGestureListener和setOnClickListener
使用案例: 1.用戶刷卡/拖動物品到右(水平),項目被添加進籃。如果他再次滑動,則會在籃筐中再添加一個相同的物品。 2.用戶向左(水平)滑動/拖拽項目,項目從籃筐中移除,如果之前添加,如果籃筐中沒有項目,我們將其保留原樣。
拖動效果:當用戶拖動時,項目隨手指一起移動。只要他離開它,物品就會回到原來的位置。
縮放效果:當用戶點擊該項目時,項目會縮放,讓用戶知道該項目已添加到購物籃中。 (右拖的複製方法)。
我想專門使用OnSwipeTouchListener類用於此目的:
import android.content.Context;
import android.view.GestureDetector;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import PointF;
public class OnSwipeTouchListener implements OnTouchListener {
private final GestureDetector gestureDetector;
PointF DownPT = null;
PointF StartPT = null;
float startX;
float startY;
public OnSwipeTouchListener(Context context , float x, float y) {
gestureDetector = new GestureDetector(context, new GestureListener());
DownPT = new PointF();
StartPT = new PointF();
this.startX = x;
this.startY = y;
}
public void onSwipeLeft() {
}
public void onSwipeRight() {
}
public boolean onTouch(View v, MotionEvent event) {
int eid = event.getAction();
switch (eid) {
case MotionEvent.ACTION_MOVE:
PointF mv = new PointF(event.getX() - DownPT.x, event.getY() - DownPT.y);
v.setX((int) (StartPT.x + mv.x));
v.setY(this.startY);
StartPT = new PointF(v.getX(), v.getY());
break;
case MotionEvent.ACTION_DOWN:
DownPT.x = event.getX();
DownPT.y = event.getY();
StartPT = new PointF(v.getX(), v.getY());
break;
case MotionEvent.ACTION_UP:
// Move image back to its original position.
v.setX(this.startX);
v.setY(this.startY);
break;
default:
v.setX(this.startX);
v.setY(this.startY);
break;
}
return gestureDetector.onTouchEvent(event);
}
private final class GestureListener extends SimpleOnGestureListener {
private static final int SWIPE_DISTANCE_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) {
float distanceX = e2.getX() - e1.getX();
float distanceY = e2.getY() - e1.getY();
if (Math.abs(distanceX) > Math.abs(distanceY) && Math.abs(distanceX) > SWIPE_DISTANCE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
if (distanceX > 0)
onSwipeRight();
else
onSwipeLeft();
return true;
}
return false;
}
}
}
當我的方法OnTouch就像下面,我onSwipeRight()和onSwipeLeft()被觸發,但是當我在已經實現onTouch如上代碼,這兩種方法不會被觸發。
public boolean onTouch(View v, MotionEvent event) {
return gestureDetector.onTouchEvent(event);
}
關於Click事件的縮放效果。
在我的片段中,我縮放這樣的圖像。
offerimg1.setOnClickListener(新View.OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
zoomAnimation(v, offerimg1);
}
});
而且我zoomAnimation方法是:
private void zoomAnimation(View view,ImageView image) {
Animation animation = AnimationUtils.loadAnimation(getActivity().getApplicationContext(), R.anim.zoom);
image.startAnimation(animation);
}
我變焦的工作,除非我沒有在我的零散實現:
offerimg1.setOnTouchListener(new OnSwipeTouchListener(getActivity().getApplicationContext(),offerimg1.getX(),offerimg1.getY()) {
@Override
public void onSwipeLeft() {
Log.d("onTouch "," swipe left");
}
@Override
public void onSwipeRight() {
Log.d("onTouch "," swipe right");
}
});
我不確定這些事件之間有什麼碰撞,我需要實現在我的上面的用例中,每個事件都應該在每個圖像上工作。因爲我的圖像處於片段的滾動視圖中。
如果你想我可以在這裏分享更多的代碼。如果我無法澄清我的問題,請讓我知道。
我真的很感謝你的幫助。
問候, 沙善普拉塔普
是否有任何人誰可以提供幫助。我試圖解決這個問題幾個小時,但無法取得成功。如果有任何可以指出的錯誤,沒有給出任何代碼示例。我會接受這個答案。 – shank2111
好吧,我能夠解決onClick事件的問題,使用建議由http://stackoverflow.com/questions/9965695/how-to-distinguish-between-move-and-click-in-ontouchevent/29933115# 29933115但我仍然堅持onSwipeLeft()和onSwipeRight()..觸發事件後觸發,它應傳播到這兩種方法。 – shank2111
是的,我發現onSwipeLeft()和onSwipeRight()這個問題..因爲我的圖像與我的手指一起移動,這就是distanceX顯示爲零的原因,它總是小於靜態SWIPE_DISTANCE_THRESHOLD。在代碼中,我們說如果distanceX是負數,它的swipeLeft()else swipeRight()。任何評論請.. – shank2111