用ViewFlipper和GestureDetector实现手势翻页的效果

  首先在布局文件中要有个ViewFlipper,这个可以用来加载View。可以在加载的View中做动画,但只能显示一个View。具体的API中是这样说的:

    Simple ViewAnimator that will animate between two or more views that have been added to it. Only one child is shown at a time. If requested, can automatically flip between each child at a regular interval.

  所以我在布局文件中放一个ViewFlipper就可以了,然后在向里面加入View:

  
    
1 <? xml version="1.0" encoding="utf-8" ?>
2   < LinearLayout xmlns:android ="http://schemas.android.com/apk/res/android"
3 android:orientation ="vertical"
4 android:layout_width ="fill_parent"
5 android:layout_height ="fill_parent"
6 >
7   < ViewFlipper
8 android:id ="@+id/myviewflipper"
9 android:layout_width ="match_parent"
10 android:layout_height ="match_parent"
11 />
12   </ LinearLayout >
13  

 

  在代码中加入5个View,TextView是这样的:

 

  
    
1 private TextView addTextView(String str) {
2 TextView tv = new TextView(this);
3 tv.setText(str);
4 tv.setGravity(1);
5 return tv;
6 }

 

  
    
1 vf.addView(addTextView("step1"));
2 vf.addView(addTextView("step2"));
3 vf.addView(addTextView("step3"));
4 vf.addView(addTextView("step4"));
5 vf.addView(addTextView("step5"));

继承OnGestureListener,同时重写一个onTouchEvent方法:

  
    
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
return this.gd.onTouchEvent(event);
}

 

  然后在onFling方法里面做操作,让ViewFlipper显示上一个View还是显示下一个View:

  
    
1 public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
2 float velocityY) {
3 // TODO Auto-generated method stub
4 if((e1.getX() - e2.getX()) > 100) {
5 this.vf.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.push_right_in));
6 this.vf.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.push_left_out));
7 this.vf.showPrevious();
8 return true;
9 } else if((e1.getX() -e2.getX()) < -100 ) {
10 this.vf.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.push_left_in));
11 this.vf.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.push_right_out));
12 this.vf.showNext();
13 return true;
14 }
15 return false;
16 }

 

  同时在里面加入了动画,分为从左边进入,从左边出去,从右边进入,从右边出去:

  animation_left_in:

  
    
1 <? xml version="1.0" encoding="utf-8" ?>
2   < set xmlns:android ="http://schemas.android.com/apk/res/android" >
3 < translate
4 android:fromXDelta ="-100%p"
5 android:toXDelta ="0%p"
6 android:duration ="500" />
7 < alpha
8 android:fromAlpha ="0.1"
9 android:toAlpha ="1.0"
10 android:duration ="500" />
11   </ set >
12  

 

  animation_left_out:

 

  
    
1 <? xml version="1.0" encoding="utf-8" ?>
2   < set xmlns:android ="http://schemas.android.com/apk/res/android" >
3 < translate
4 android:fromXDelta ="0%p"
5 android:toXDelta ="-100%p"
6 android:duration ="500" />
7 < alpha
8 android:fromAlpha ="1.0"
9 android:toAlpha ="0.1"
10 android:duration ="500" />
11   </ set >
12  

 

  animation_right_in:

  
    
1 <? xml version="1.0" encoding="utf-8" ?>
2   < set xmlns:android ="http://schemas.android.com/apk/res/android" >
3 < translate
4 android:fromXDelta ="100%p"
5 android:toXDelta ="0%p"
6 android:duration ="500" />
7 < alpha
8 android:fromAlpha ="0.1"
9 android:toAlpha ="1.0"
10 android:duration ="500" />
11   </ set >
12

 

  animation_right_out:

 

  
    
1 <? xml version="1.0" encoding="utf-8" ?>
2 < set xmlns:android ="http://schemas.android.com/apk/res/android" >
3 < translate
4 android:fromXDelta ="0%p"
5 android:toXDelta ="100%p"
6 android:duration ="500" />
7 < alpha
8 android:fromAlpha ="1.0"
9 android:toAlpha ="0.1"
10 android:duration ="500" />
11 </ set >
12

 

  Activity:

 

  
    
1 package com.android.test;
2
3 import android.app.Activity;
4 import android.os.Bundle;
5 import android.view.GestureDetector;
6 import android.view.GestureDetector.OnGestureListener;
7 import android.view.MotionEvent;
8 import android.view.animation.AnimationUtils;
9 import android.widget.TextView;
10 import android.widget.ViewFlipper;
11
12 public class TestViewFlipActivity extends Activity implements OnGestureListener {
13
14 private GestureDetector gd;
15 private ViewFlipper vf;
16
17 @Override
18 public void onCreate(Bundle savedInstanceState) {
19 super.onCreate(savedInstanceState);
20 setContentView(R.layout.main);
21 gd = new GestureDetector(this);
22 vf = (ViewFlipper) findViewById(R.id.myviewflipper);
23 vf.addView(addTextView("step1"));
24 vf.addView(addTextView("step2"));
25 vf.addView(addTextView("step3"));
26 vf.addView(addTextView("step4"));
27 vf.addView(addTextView("step5"));
28 }
29
30 private TextView addTextView(String str) {
31 TextView tv = new TextView(this);
32 tv.setText(str);
33 tv.setGravity(1);
34 return tv;
35 }
36
37 @Override
38 public boolean onTouchEvent(MotionEvent event) {
39 // TODO Auto-generated method stub
40 return this.gd.onTouchEvent(event);
41 }
42
43 @Override
44 public boolean onDown(MotionEvent arg0) {
45 // TODO Auto-generated method stub
46 return false;
47 }
48
49 @Override
50 public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
51 float velocityY) {
52 // TODO Auto-generated method stub
53 if((e1.getX() - e2.getX()) > 100) {
54 this.vf.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.push_right_in));
55 this.vf.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.push_left_out));
56 this.vf.showPrevious();
57 return true;
58 } else if((e1.getX() -e2.getX()) < -100 ) {
59 this.vf.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.push_left_in));
60 this.vf.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.push_right_out));
61 this.vf.showNext();
62 return true;
63 }
64 return false;
65 }
66
67 @Override
68 public void onLongPress(MotionEvent arg0) {
69 // TODO Auto-generated method stub
70
71 }
72
73 @Override
74 public boolean onScroll(MotionEvent arg0, MotionEvent arg1, float arg2,
75 float arg3) {
76 // TODO Auto-generated method stub
77 return false;
78 }
79
80 @Override
81 public void onShowPress(MotionEvent arg0) {
82 // TODO Auto-generated method stub
83
84 }
85
86 @Override
87 public boolean onSingleTapUp(MotionEvent arg0) {
88 // TODO Auto-generated method stub
89 return false;
90 }
91 }

你可能感兴趣的:(gesturedetector)