Android手势识别ViewFlipper触摸动画

本文介绍如何在Android应用中实现主页面的左右滑动效果。通过使用ViewFlipper组件结合GestureDetector手势识别,可以轻松地在不同视图间切换,并添加了动画效果提升用户体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天给大家介绍一下如何实现Android主页面的左右拖动效果。实现起来很简单,就是使用ViewFlipper来将您要来回拖动的View装在一起,然后与GestureDetector手势识别类来联动,确定要显示哪个View,加上一点点动画效果即可。比如当手指向左快速滑动时跳转到上一个View,手指向右快速滑动时跳转到下一个View,本例中使用图片作为各个View的页面,实现左右快速滑动显示不同的图片。

Java代码:
Java代码 收藏代码
  1. <linearlayoutandroidandroid:layout_height="fill_parent"
  2. android:layout_width="fill_parent"
  3. android:orientation="vertical"
  4. xmlns:android="http://schemas.android.com/apk/res/android">
  5. <viewflipper
  6. androidandroid:id="@+id/flipper"
  7. android:layout_below="@+id/CockpitLayout"
  8. android:layout_height="fill_parent"
  9. android:layout_width="fill_parent">
  10. <includeandroid:id="@+id/firstlayout"layout="@layout/first">
  11. <includeandroid:id="@+id/secondlayout"layout="@layout/second">
  12. <includeandroid:id="@+id/thirdlayout"layout="@layout/third">
  13. <includeandroid:id="@+id/fourthlayout"layout="@layout/fourth">
  14. </include>
  15. </include>
  16. </include>
  17. </include>
  18. </viewflipper>
  19. </linearlayout>


在ViewFlipper中放置多个layout(接下来会在不同的layout中来回滑动),ViewFlipper在同一个页面就显示其中一个layout。

Java代码:
Java代码 收藏代码
  1. <linearlayout
  2. androidandroid:gravity="center_vertical"
  3. android:layout_height="fill_parent"
  4. android:layout_width="fill_parent"
  5. xmlns:android="http://schemas.android.com/apk/res/android">
  6. <imageview
  7. androidandroid:layout_height="wrap_content"
  8. android:layout_width="wrap_content"
  9. android:src="@drawable/v1">
  10. </imageview>
  11. </linearlayout>


接下来我们来看看 Activity,我们的 Activity需要实现两个接口 OnGestureListener,OnTouchListener

Java代码:
Java代码 收藏代码
  1. importandroid.app.Activity;
  2. importandroid.os.Bundle;
  3. importandroid.view.GestureDetector;
  4. importandroid.view.MotionEvent;
  5. importandroid.view.View;
  6. importandroid.view.GestureDetector.OnGestureListener;
  7. importandroid.view.View.OnTouchListener;
  8. importandroid.view.animation.AccelerateInterpolator;
  9. importandroid.view.animation.Animation;
  10. importandroid.view.animation.TranslateAnimation;
  11. importandroid.widget.ViewFlipper;
  12. publicclassViewFlipperDemoextendsActivityimplementsOnGestureListener,OnTouchListener{
  13. privateViewFlippermFlipper;
  14. GestureDetectormGestureDetector;
  15. privateintmCurrentLayoutState;
  16. privatestaticfinalintFLING_MIN_DISTANCE=100;
  17. privatestaticfinalintFLING_MIN_VELOCITY=200;
  18. @Override
  19. publicvoidonCreate(BundlesavedInstanceState){
  20. super.onCreate(savedInstanceState);
  21. setContentView(R.layout.main);
  22. mFlipper=(ViewFlipper)findViewById(R.id.flipper);
  23. //注册一个用于手势识别的类
  24. mGestureDetector=newGestureDetector(this);
  25. //给mFlipper设置一个listener
  26. mFlipper.setOnTouchListener(this);
  27. mCurrentLayoutState=0;//允许长按住ViewFlipper,这样才能识别拖动等手势
  28. mFlipper.setLongClickable(true);
  29. }
  30. /***此方法在本例中未用到,可以指定跳转到某个页面*@paramswitchTo*/
  31. publicvoidswitchLayoutStateTo(intswitchTo){
  32. while(mCurrentLayoutState!=switchTo){
  33. if(mCurrentLayoutState>switchTo){
  34. mCurrentLayoutState--;
  35. mFlipper.setInAnimation(inFromLeftAnimation());
  36. mFlipper.setOutAnimation(outToRightAnimation());
  37. mFlipper.showPrevious();
  38. }
  39. else{
  40. mCurrentLayoutState++;
  41. mFlipper.setInAnimation(inFromRightAnimation());
  42. mFlipper.setOutAnimation(outToLeftAnimation());
  43. mFlipper.showNext();
  44. }
  45. };
  46. }
  47. /***定义从右侧进入的动画效果*@return*/
  48. protectedAnimationinFromRightAnimation(){
  49. AnimationinFromRight=newTranslateAnimation(Animation.RELATIVE_TO_PARENT,+1.0f,Animation.RELATIVE_TO_PARENT,0.0f,Animation.RELATIVE_TO_PARENT,0.0f,Animation.RELATIVE_TO_PARENT,0.0f);
  50. inFromRight.setDuration(500);
  51. inFromRight.setInterpolator(newAccelerateInterpolator());
  52. returninFromRight;
  53. }
  54. /***定义从左侧退出的动画效果*@return*/
  55. protectedAnimationoutToLeftAnimation(){
  56. AnimationouttoLeft=newTranslateAnimation(Animation.RELATIVE_TO_PARENT,0.0f,Animation.RELATIVE_TO_PARENT,-1.0f,Animation.RELATIVE_TO_PARENT,0.0f,Animation.RELATIVE_TO_PARENT,0.0f);
  57. outtoLeft.setDuration(500);
  58. outtoLeft.setInterpolator(newAccelerateInterpolator());
  59. returnouttoLeft;
  60. }
  61. /***定义从左侧进入的动画效果*@return*/
  62. protectedAnimationinFromLeftAnimation(){
  63. AnimationinFromLeft=newTranslateAnimation(Animation.RELATIVE_TO_PARENT,-1.0f,Animation.RELATIVE_TO_PARENT,0.0f,Animation.RELATIVE_TO_PARENT,0.0f,Animation.RELATIVE_TO_PARENT,0.0f);
  64. inFromLeft.setDuration(500);
  65. inFromLeft.setInterpolator(newAccelerateInterpolator());
  66. returninFromLeft;
  67. }
  68. /***定义从右侧退出时的动画效果*@return*/
  69. protectedAnimationoutToRightAnimation(){
  70. AnimationouttoRight=newTranslateAnimation(Animation.RELATIVE_TO_PARENT,0.0f,Animation.RELATIVE_TO_PARENT,+1.0f,Animation.RELATIVE_TO_PARENT,0.0f,Animation.RELATIVE_TO_PARENT,0.0f);
  71. outtoRight.setDuration(500);
  72. outtoRight.setInterpolator(newAccelerateInterpolator());
  73. returnouttoRight;
  74. }
  75. publicbooleanonDown(MotionEvente){
  76. //TODOAuto-generatedmethodstubreturnfalse;
  77. }
  78. /**用户按下触摸屏、快速移动后松开即触发这个事件*e1:第1个ACTION_DOWNMotionEvent*e2:最后一个ACTION_MOVEMotionEvent*velocityX:X轴上的移动速度,像素/秒*velocityY:Y轴上的移动速度,像素/秒*触发条件:*X轴的坐标位移大于FLING_MIN_DISTANCE,且移动速度大于FLING_MIN_VELOCITY个像素/秒*/
  79. publicbooleanonFling(MotionEvente1,MotionEvente2,floatvelocityX,floatvelocityY){
  80. if(e1.getX()-e2.getX()>FLING_MIN_DISTANCE&&Math.abs(velocityX)>FLING_MIN_VELOCITY){
  81. //当像左侧滑动的时候
  82. //设置View进入屏幕时候使用的动画
  83. mFlipper.setInAnimation(inFromRightAnimation());
  84. //设置View退出屏幕时候使用的动画
  85. mFlipper.setOutAnimation(outToLeftAnimation());
  86. mFlipper.showNext();
  87. }
  88. elseif(e2.getX()-e1.getX()>FLING_MIN_DISTANCE&&Math.abs(velocityX)>FLING_MIN_VELOCITY){
  89. //当像右侧滑动的时候
  90. mFlipper.setInAnimation(inFromLeftAnimation());
  91. mFlipper.setOutAnimation(outToRightAnimation());
  92. mFlipper.showPrevious();
  93. }
  94. returnfalse;
  95. }
  96. publicvoidonLongPress(MotionEvente){
  97. //TODOAuto-generatedmethodstub
  98. }
  99. publicbooleanonScroll(MotionEvente1,MotionEvente2,floatdistanceX,floatdistanceY){
  100. returnfalse;
  101. }
  102. publicvoidonShowPress(MotionEvente){
  103. //TODOAuto-generatedmethodstub
  104. }
  105. publicbooleanonSingleTapUp(MotionEvente){
  106. //TODOAuto-generatedmethodstubreturnfalse;
  107. }
  108. publicbooleanonTouch(Viewv,MotionEventevent){
  109. //一定要将触屏事件交给手势识别类去处理(自己处理会很麻烦的)
  110. returnmGestureDetector.onTouchEvent(event);
  111. }
  112. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值