本程序通过GestureDetector来检测用户的手势动作,并根据手势动作来控制ViewFlipper组件包含的View组件的切换。ViewFlipper组件可使用动画控制多个组件之间的切换组件,如果对ViewFlipper组件用法不熟悉的,请自行百度之,或继续关注本人博客......
关于使用GestureDetector处理手势操作的流程,如果有不熟悉的,请参考Android学习笔记之手势(Gesture)检测。
代码如下:
首先,在界面布局管理器中定义一个ViewFlipper组件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" >
<ViewFlipper
android:id="@+id/flipper"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
然后在Activity程序中进行操作:
public class MainActivity extends Activity implements OnGestureListener
{
ViewFlipper flipper=null;
//定义手势检测器实例
GestureDetector detector;
//定义一个动画数组,用于为ViewFlipper指定切换动画效果
Animation[] animations=new Animation[4];
//定义手势动作两点之间的最小距离
final int FLIP_DISTANCE=50;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//创建手势检测器对象
this.detector=new GestureDetector(this,this);
//获得ViewFlipper实例
this.flipper=(ViewFlipper)findViewById(R.id.flipper);
//为ViewFlipper添加5个ImageView组件
flipper.addView(addImageView(R.drawable.card1));
flipper.addView(addImageView(R.drawable.card2));
flipper.addView(addImageView(R.drawable.card3));
flipper.addView(addImageView(R.drawable.card4));
flipper.addView(addImageView(R.drawable.card5));
//初始化Animation数组
animations[0]=AnimationUtils.loadAnimation(this,R.anim.left_in);
animations[1]=AnimationUtils.loadAnimation(this,R.anim.left_out);
animations[2]=AnimationUtils.loadAnimation(this,R.anim.right_in);
animations[3]=AnimationUtils.loadAnimation(this,R.anim.right_out);
}
@Override
public boolean onTouchEvent(MotionEvent event)
{
return detector.onTouchEvent(event);
}
private View addImageView(int resId)
{
ImageView imageView=new ImageView(this);
imageView.setImageResource(resId);
imageView.setScaleType(ImageView.ScaleType.CENTER);
return imageView;
}
@Override
public boolean onDown(MotionEvent e) {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY)
{
System.out.println("onFling");
//如果第一个触点事件的X坐标大于第二个触点事件的X坐标超过FLIP_DISTANCE
//也就是手势从右向左滑
if(e1.getX()-e2.getX()>FLIP_DISTANCE)
{
//为flipper设置切换的动画效果
flipper.setInAnimation(animations[0]);
flipper.setOutAnimation(animations[1]);
flipper.showPrevious();
System.out.println(e1.getX()+","+e2.getX());
return true;
}
else if(e2.getX()-e1.getX()>FLIP_DISTANCE)
{
//为flipper设置切换的动画效果
flipper.setInAnimation(animations[2]);
flipper.setOutAnimation(animations[3]);
flipper.showNext();
System.out.println(e1.getX()+","+e2.getX());
return true;
}
return false;
}
@Override
public void onLongPress(MotionEvent e) {
// TODO Auto-generated method stub
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
float distanceY) {
// TODO Auto-generated method stub
return false;
}
@Override
public void onShowPress(MotionEvent e) {
// TODO Auto-generated method stub
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
// TODO Auto-generated method stub
return false;
}
}
程序中使用到的动画资源文件需要自己手动添加,在res目录下新建anim文件夹,并在anim文件夹下定义4个动画XML文件,文件格式大致如下所示:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromXDelta="0"
android:toXDelta="100%p"
android:duration="@android:integer/config_mediumAnimTime" />
</set>