Android手势学习之单点手势
04import android.os.Bundle;
05import android.util.Log;
06import android.view.GestureDetector;
07import android.view.GestureDetector.OnGestureListener;
08import android.view.MotionEvent;
09import android.view.View;
10import android.view.View.OnTouchListener;
11import android.view.animation.AnimationUtils;
12import android.widget.ImageView;
13import android.widget.Toast;
14import android.widget.ViewFlipper;
15
16public class SlideAndGestureActivity extends Activity {
17 private ViewFlipper mFlipper;
18 private GestureDetector mDetector;
19 /** Called when the activity is first created. */
20 @Override
21 public void onCreate(Bundle savedInstanceState) {
22 super.onCreate(savedInstanceState);
23 setContentView(R.layout.slide);
24
25 mDetector = new GestureDetector(getApplicationContext(),new FlingListener());
26 mFlipper = (ViewFlipper )findViewById(R.id.viewFlipper1);
27
28 mFlipper.addView(addTextView(R.drawable.one));
29 mFlipper.addView(addTextView(R.drawable.two));
30 mFlipper.addView(addTextView(R.drawable.three));
31 mFlipper.addView(addTextView(R.drawable.four));
32 mFlipper.addView(addTextView(R.drawable.five));
33
34 }
35
36 private View addTextView(int resId){
37 ImageView view = new ImageView(this);
38 view.setImageResource(resId);
39 return view;
40 }
41
42 @Override
43 public boolean onTouchEvent(MotionEvent event) {
44 return mDetector.onTouchEvent(event);
45 }
46
47 private class FlingListener extends GestureDetector.SimpleOnGestureListener{
48 @Override
49 public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
50 float velocityY) {
51 String msg = e1:+e1.getX()+,+e1.getY()+e2:+e2.getX()+,+e2.getY();
52 Log.i(MotionSlide, msg);
53 if (e1.getX() - e2.getX() > 120) {
54 mFlipper.setInAnimation(AnimationUtils.loadAnimation(getApplicationContext(), R.anim.push_left_in));
55 mFlipper.setOutAnimation(AnimationUtils.loadAnimation(getApplicationContext(), R.anim.push_left_out));
56 mFlipper.showNext();
57 return true;
58 } else if (e1.getX() - e2.getX() -120) {
59 mFlipper.setInAnimation(AnimationUtils.loadAnimation(getApplicationContext(), R.anim.push_right_in));
60 mFlipper.setOutAnimation(AnimationUtils.loadAnimation(getApplicationContext(), R.anim.push_right_out));
61 mFlipper.showPrevious();
62 return true;
63 }
64 return false;
65 }
66
67 }
68
69}
在实际的项目开发中会遇到这样一样问题。
比如。上面 例子添加的ImageView默认也许不处理事件。所以 可以 正常的滑动。
但是在我的实际的开发中,的发现如ViewFlipper上面有一个GridView,GridView上面排列有Button.然后滑动手势
的事件就不会传播到ViewFlipper中去啊。于是我开始是在GridView上面 设置 一个margin
在margin区域里滑动事件 就会传递给ViwFlipper。(严格来说应该是mDetecotor.onTouchEvent()中去。
然后我就在想这个事件 传播的问题,然后我想到因为其实主要调用mDetecotor的时候,
也是在Activity中的OnTouchEvent(MotionEvent)方法 中。
中将这个MotionEvent事件以这样return mDetector.onTouchEvent(event)方法处理返回 。
于是 想在button中事件中的ACTION_MOVE中也调用mDetector.OnTouchEvent()
但是结果 不行。后来我就不区分ACTION_MOVE等等了。
于是,最后,我在对button和gridView做了如下处理。
1button.setOnTouchListener(new OnTouchListener() {
2 @Override
3 public boolean onTouch(View v, MotionEvent event) {
4 return mDetector.onTouchEvent(event);
5
6 }
7});
1gridView.setOnTouchListener(new OnTouchListener() {
2 @Override
3 public boolean onTouch(View v, MotionEvent event) {
4 return mDetector.onTouchEvent(event);
5 }
6});
我想,因为Fliing这样事件不仅仅是ACTION_MOVE他还有开始的OnDown等等一系列事件组合起来的。
评论