这个例子是用手势实现翻页效果,相当酷,个人觉得比gallery漂亮,可以用于广告场合。思路:把Activity的TouchEvent交给GestureDetector处理。
这个程序使用了ViewFlipper组件,其实这个组件就是容器组件,可以调用addView(View v)添加多个组件,然后就可以用ViewFlipper使用动画控制多个组件之间的切换效果
首先第一步是布局main.xml文件
View Code
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/flipper"
9 android:layout_width="wrap_content"
10 android:layout_height="120dp"/>
11 </LinearLayout>
第二步:添加照片和在res文件夹下建立一个anim文件,里面放四个动画xml文件,分别为left_in.xml,left_out.xml,right_in.xml.right_out.xml
View Code
1 <?xml version="1.0" encoding="utf-8"?>
2 <!-- 左边的进来left_in -->
3 <set
4 xmlns:android="http://schemas.android.com/apk/res/android">
5 <translate
6 android:fromXDelta="100%p"
7 android:toXDelta="0"
8 android:duration="500" />
9 <alpha
10 android:fromAlpha="0.0"
11 android:toAlpha="1.0"
12 android:duration="500" />
13 </set>
14
15
16 <?xml version="1.0" encoding="utf-8"?>
17 <!-- 左边的出去left_out -->
18 <set
19 xmlns:android="http://schemas.android.com/apk/res/android">
20 <translate
21 android:fromXDelta="0"
22 android:toXDelta="-100%p"
23 android:duration="500" />
24 <alpha
25 android:fromAlpha="1.0"
26 android:toAlpha="0.0"
27 android:duration="500" />
28 </set>
29
30 <?xml version="1.0" encoding="utf-8"?>
31 <!-- 右边的出去left_in -->
32 <set
33 xmlns:android="http://schemas.android.com/apk/res/android">
34 <translate
35 android:fromXDelta="-100%p"
36 android:toXDelta="0"
37 android:duration="500" />
38 <alpha
39 android:fromAlpha="0.0"
40 android:toAlpha="1.0"
41 android:duration="500" />
42 </set>
43
44 <?xml version="1.0" encoding="utf-8"?>
45 <!-- 右边的出去left_out -->
46 <set
47 xmlns:android="http://schemas.android.com/apk/res/android">
48 <translate
49 android:fromXDelta="0"
50 android:toXDelta="100%p"
51 android:duration="500" />
52 <alpha
53 android:fromAlpha="1.0"
54 android:toAlpha="0.0"
55 android:duration="500" />
56 </set>
第三步:编写GestureActivity.java文件
View Code
1 package cn.shaoyangjiang.com;
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.View;
9 import android.view.animation.Animation;
10 import android.view.animation.AnimationUtils;
11 import android.widget.ImageView;
12 import android.widget.ViewFlipper;
13
14 public class GestureActivity extends Activity implements OnGestureListener{
15 // ViewFlipper实例
16 ViewFlipper flipper;
17 // 定义手势检测器实例
18 GestureDetector detector;
19 //定义一个动画数组,用于为ViewFlipper指定切换动画效果
20 Animation[] animations = new Animation[4];
21 //定义手势动作两点之间的最小距离
22 final int FLIP_DISTANCE = 50;
23 @Override
24 public void onCreate(Bundle savedInstanceState) {
25 super.onCreate(savedInstanceState);
26 setContentView(R.layout.main);
27 //创建手势检测器
28 detector = new GestureDetector(this);
29 // 获得ViewFlipper实例
30 flipper = (ViewFlipper)findViewById(R.id.flipper);
31 // 为ViewFlipper添加5个ImageView组件
32 flipper.addView(addImageView(R.drawable.katong));
33 flipper.addView(addImageView(R.drawable.meinv));
34 flipper.addView(addImageView(R.drawable.shan));
35 flipper.addView(addImageView(R.drawable.tian));
36 flipper.addView(addImageView(R.drawable.touming));
37 //初始化Animation数组
38 animations[0] = AnimationUtils.loadAnimation(this,R.anim.left_in);
39 animations[1] = AnimationUtils.loadAnimation(this,R.anim.left_out);
40 animations[2] = AnimationUtils.loadAnimation(this,R.anim.right_in);
41 animations[3] = AnimationUtils.loadAnimation(this,R.anim.right_in);
42
43 }
44 // 定义添加ImageView的工具方法
45 private View addImageView(int resId){
46 ImageView imageView = new ImageView(this);
47 imageView.setImageResource(resId);
48 imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
49 return imageView;
50 }
51
52 @Override
53 public boolean onDown(MotionEvent arg0) {
54 // TODO Auto-generated method stub
55 return false;
56 }
57 @Override
58 public boolean onFling(MotionEvent event1, MotionEvent event2, float velocityX,
59 float velocityY) {
60 /*
61 * 如果第一个触点事件的X座标大于第二个触点事件的X座标超过FLIP_DISTANCE
62 * 也就是手势从右向左滑。
63 */
64 if (event1.getX() - event2.getX() > FLIP_DISTANCE)
65 {
66 // 为flipper设置切换的的动画效果
67 flipper.setInAnimation(animations[0]);
68 flipper.setOutAnimation(animations[1]);
69 flipper.showPrevious();
70 return true;
71 }
72 /*
73 * 如果第二个触点事件的X座标大于第一个触点事件的X座标超过FLIP_DISTANCE
74 * 也就是手势从右向左滑。
75 */
76 else if (event2.getX() - event1.getX() > FLIP_DISTANCE)
77 {
78 // 为flipper设置切换的的动画效果
79 flipper.setInAnimation(animations[2]);
80 flipper.setOutAnimation(animations[3]);
81 flipper.showNext();
82 return true;
83 }
84 return false;
85 }
86 @Override
87 public void onLongPress(MotionEvent event) {
88
89 }
90 @Override
91 public boolean onScroll(MotionEvent arg0, MotionEvent arg1, float arg2,
92 float arg3) {
93 return false;
94 }
95 @Override
96 public void onShowPress(MotionEvent arg0) {
97
98 }
99 @Override
100 public boolean onSingleTapUp(MotionEvent event) {
101 return false;
102 }
103
104 @Override
105 public boolean onTouchEvent(MotionEvent event) {
106 //将该Activity上的触碰事件交给GestureDetector处理
107 return detector.onTouchEvent(event);
108 }
109 }
效果图: