这段时间一直在忙Android的项目,总算抽出点时间休息一下,准备把一些项目用到的Android经验分享一下。

在Android开发过程中,经常会碰到Activity之间的切换效果的问题,下面介绍一下如何实现左右滑动的切换效果,首先了解一下Activity切换的实现,从Android2.0开始在Activity增加了一个方法:

public void overridePendingTransition (int enterAnim, int exitAnim)

其中:

enterAnim 定义Activity进入屏幕时的动画

exitAnim 定义Activity退出屏幕时的动画

overridePendingTransition 方法必须在startActivity()或者 finish()方法的后面。

Android已经内置了几种动画效果,可以见 android.R.anim 类。一般情况下我们需要自己定义屏幕切换的效果。首先我们先了解Activity的位置定义,如下图:

从上图可以看出,以手机屏幕下面边未X轴,屏幕左边为Y轴,当Activity在X轴值为-100%p时,刚好在屏幕的左边(位置1),当X轴值为0%p时,刚好再屏幕内(位置2),当X=100%p时刚好在屏幕右边(位置3)。

清楚了位置后,我们就可以实现左右滑动的切换效果,首先让要退出的Activity从位置2移动到位置1,同时让进入的Activity从位置3移动位置2,这样就能实现从左右切换效果。

实现过程如下,首先定义2个动画,在 res目录创建anim目录, 然后在目录创建动画的xml文件:out_to_left.xml (从左边退出动画) 、in_from_right.xml(从右边进入动画)

out_to_left.xml (从 位置2 移动到 位置1)

<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="<a href="http://my.oschina.net/asia" class="referer" target="_blank">@android</a> :anim/accelerate_interpolator"><translate android:fromXDelta="0%p" android:toXDelta="-100%p"android:duration="500" /></set>

  

in_from_right.xml (从 位置3 移动到 位置2)

<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="<a href="http://my.oschina.net/asia" class="referer" target="_blank">@android</a> :anim/accelerate_interpolator"><translate android:fromXDelta="100%p" android:toXDelta="0%p"        android:duration="500" /></set>

注: android:fromXDelta 动画开始的位置,  android:toXDelta 动画结束的位置,android:duration动画的时间。

Android 代码如下:

public class LeftRightSlideActivity extends Activity {

    @Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

        setContentView(R.layout.main);  

        Button button = (Button)findViewById(R.id.button1);

        button.setOnClickListener(new View.OnClickListener() { 

            @Override

public void onClick(View v) {

                Intent intent = new Intent();

                intent.setClass(LeftRightSlideActivity.this, SlideSecondActivity.class);

                startActivity(intent);

//设置切换动画,从右边进入,左边退出

                overridePendingTransition(R.anim.in_from_right, R.anim.out_to_left);               

            }

        });

    }

}

效果图如下:

     

虽然左右滑动切换的实现很简单,但是对于原理的理解很重要,掌握了原理可以充分发挥想象力设计出各种各样的动画效果,希望对一些入门的新手有帮助。

以后在慢慢整理一些项目中用到的切换动画效果。

Android中实现滑动翻页—使用ViewFlipper

分类: 07 Android2012-01-19 09:31 2368人阅读 评论(4) 收藏 举报

有一些场景,我们需要向用户展示一系列的页面。比如我们正在开发一个看漫画的应用,可能就需要向用户展示一张一张的漫画图片,用户使用手指滑动屏幕,可以在前一幅漫画和后一幅漫画之间切换。这个时候ViewFlipper就是一个很好的选择。

1)View切换的控件—ViewFlipper介绍

ViewFilpper类继承于ViewAnimator类。而ViewAnimator类继承于FrameLayout。

查看ViewAnimator类的源码可以看出此类的作用主要是为其中的View切换提供动画效果。该类有如下几个和动画相关的方法。

setInAnimation:设置View进入屏幕时候使用的动画。该方法有两个重载方法,即可以直接传入Animation对象,也可以传入定义的Animation文件的resourceID。

setOutAnimation:设置View退出屏幕时候使用的动画。使用方法和setInAnimation方法一样。

showNext:调用该方法可以显示FrameLayout里面的下一个View。

showPrevious:调用该方法可以来显示FrameLayout里面的上一个View。

查看ViewFlipper的源码可以看到,ViewFlipper主要用来实现View的自动切换。该类提供了如下几个主要的方法。

setFilpInterval:设置View切换的时间间隔。参数为毫秒。

startFlipping:开始进行View的切换,时间间隔是上述方法设置的间隔数。切换会循环进行。

stopFlipping:停止View切换。

setAutoStart:设置是否自动开始。如果设置为“true”,当ViewFlipper显示的时候View的切换会自动开始。

一般情况下,我们都会使用ViewFilpper类实现View的切换,而不使用它的父类ViewAnimator类。

2)实现滑动—GestureDetector介绍

如果想要实现滑动翻页的效果,就要了解另外一个类:android.view.GestureDetector类。GestureDetector类中可以用来检测各种手势事件。该类有两个回调接口,分别用来通知具体的事件。

GestureDetector.OnDoubleTapListener:用来通知DoubleTap事件,类似于PC上面的鼠标的双击事件。

GestureDetector.OnGestureListener:用来通知普通的手势事件,该接口有六个回调方法,具体的可以查看API。这里想要实现滑动的判断,就需要用到其中的onFling()方法。

3)具体的实现

下面的代码片段详细说明了如何实现滑动翻页:

public class ViewFlipperActivity extends Activity implements OnGestureListener {  

private static final int FLING_MIN_DISTANCE = 100;  private ViewFlipper flipper;  private GestureDetector detector;  

    @Override  protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);          setContentView(R.layout.viewflipper);  // 注册一个GestureDetector          detector = new GestureDetector(this);          flipper = (ViewFlipper) findViewById(R.id.ViewFlipper);          ImageView image1 = new ImageView(this);          image1.setBackgroundResource(R.drawable.image1);  // 增加第一个view          flipper.addView(image1);          ImageView image2 = new ImageView(this);          image2.setBackgroundResource(R.drawable.image2);  // 增加第二个view          flipper.addView(image2);      }  

    @Override  public boolean onTouchEvent(MotionEvent event) {  // 将触屏事件交给手势识别类处理          return this.detector.onTouchEvent(event);      }  

    @Override  public boolean onDown(MotionEvent e) {  return false;      }  

    @Override  public void onShowPress(MotionEvent e) {      }  

    @Override  public boolean onSingleTapUp(MotionEvent e) {  return false;      }  

    @Override  public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,  float distanceY) {  return false;      }  

    @Override  public void onLongPress(MotionEvent e) {      }  

    @Override  public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,  float velocityY) {  if (e1.getX() - e2.getX() > FLING_MIN_DISTANCE) {  //设置View进入和退出的动画效果              this.flipper.setInAnimation(AnimationUtils.loadAnimation(this,                      R.anim.left_in));  this.flipper.setOutAnimation(AnimationUtils.loadAnimation(this,                      R.anim.left_out));  this.flipper.showNext();  return true;          }  if (e1.getX() - e2.getX() < -FLING_MIN_DISTANCE) {  this.flipper.setInAnimation(AnimationUtils.loadAnimation(this,                      R.anim.right_in));  this.flipper.setOutAnimation(AnimationUtils.loadAnimation(this,                      R.anim.right_out));  this.flipper.showPrevious();  return true;          }  return false;      }  }  

在这段代码里,创建了两个IamgeView(用来显示图片),加入到了ViewFlipper中。程序运行后,当用手指在屏幕上向左滑动,会显示前一个图片,用手指在屏幕上向右滑动,会显示下一个图片。实现滑动切换的主要代码都在onFling()方法中,用户按下触摸屏,快速移动后松开,就会触发这个事件。在这段代码示例中,对手指滑动的距离进行了计算,如果滑动距离大于100像素,就做切换动作,否则不做任何切换动作。

可以看到,onFling()方法有四个参数,e1和e2上面代码用到了,比较好理解。参数velocityX和velocityY是做什么用的呢?velocityX和velocityY实际上是X轴和Y轴上的移动速度,单位是像素/秒。结合这两个参数,可以判断滑动的速度,从而做更多的处理。

为了显示出滑动的效果,这里调用了ViewFlipper的setInAnimation()和setOutAnimation()方法设置了View进入和退出的动画。对于动画的使用,这里不再赘述,也不再给出具体的XML文件代码了。

另外,在上面的代码基础上说些额外的话题。

在Xml布局文件中,我们既可以设置像素px,也可以设置dp(或者dip)。

一般情况下,我们都会选择使用dp,这样可以保证不同屏幕分辨率的手机上布局一致。但是在代码中,一般是无法直接使用dp的。

拿上面的代码为例,代码中定义了滑动的距离阀值为100像素。这就会导致不同分辨率的手机上效果有差别。比如在240X320的机型上,和在480X800的机型上,想要切换View,需要手指滑动的距离是不同的。所以,一般情况下,建议在代码中,也不要用像素,也用dp。

那么既然无法直接用dp,就需要从px转换成dp了。其实px和dp之间是有公式可以相互转换的。前面我的博客中(http://blog.csdn.net/arui319/article/details/6777133)已经写过了,可以直接参考。

转载于:https://www.cnblogs.com/joey-home/archive/2012/02/12/2348073.html

转 Android的Activity屏幕切换动画(一)-左右滑动切换相关推荐

  1. Android的Activity屏幕切换动画(一)-左右滑动切换

    为什么80%的码农都做不了架构师?>>>    这段时间一直在忙Android的项目,总算抽出点时间休息一下,准备把一些项目用到的Android经验分享一下. 在Android开发过 ...

  2. Android的Activity屏幕切换动画左右滑动切换

    在Android开发过程中,经常会碰到Activity之间的切换效果的问题,下面介绍一下如何实现左右滑动的切换效果,首先了解一下Activity切换的实现,从Android2.0开始在Activity ...

  3. android finish动画,Android 关于Activity的跳转和finish时切换页面动画实现

    今天沈阳斌子在做APP时,客户的需求变更是在原有的程序上加入跳转页面的动画切换,类似IPhone的左出右进的方式,返回时是相反的效果.我知道用两种方式可以实现这样的效果,一种就是通过在startAct ...

  4. android 关闭activity进场入场动画

    1.关闭入场动画 1.1anim文件夹创建activity_in <?xml version="1.0" encoding="utf-8"?> &l ...

  5. uni-app小程序利用动画做出左右滑动切换的效果

    需求:场景类似驾校刷题,手指从左往右大幅度滑动切换至上一题,手指从右往左大幅度滑动切换至下一题.已答题目直接显示正确与否和答案状态,所选答案不存在后端,后端只保存该题是否答过.答对还是答错的状态.获取 ...

  6. html图片切换动画,js实现图片切换(动画版)

    学习了妙味课堂的图片切换(动画版) 这个小效果相对简单一点. 知识预备: [1]background-position-x background-position属性设置背景原图像(由 backgro ...

  7. html页面 tab JS滑动切换,JS+CSS实现滑动切换tab菜单效果

    本文实例讲述了JS+CSS实现滑动切换tab菜单效果.分享给大家供大家参考.具体如下: 这是风格简单的一款JS+CSS滑动门特效代码,当鼠标滑过菜单的时候,二级菜单自动切换,鼠标不需要点击,滑动门效果 ...

  8. android 设置activity启动退出动画 | 解决设置activity 动画不生效问题

    前提: 如果有动画,最好把activity 设置成透明,不然会有黑屏! <style name="Trancelust" parent="AppTheme" ...

  9. android开机动画不播放,android 设置activity启动退出动画 | 解决设置activity 动画不生效问题...

    前提: 如果有动画,最好把activity 设置成透明,不然会有黑屏! true 方法一:代码里面设置 getActivity().startActivity(intent,bundle); getA ...

最新文章

  1. LeetCode Add Digits(计算数位的和)
  2. 将JPG文件作为EXE执行
  3. java字符串去重复_java去除字符串中重复、不重复、消除重复后字符
  4. 大四学生对于晚睡的思考
  5. intellij idea 部署项目的时候 图中application context 写不写有什么关系?有什么作用?...
  6. 熊猫tv新功能介绍_您应该知道的4种熊猫绘图功能
  7. php判断中英文请求,并实现跳转
  8. 【BZOJ2456】mode,卡内存
  9. 使用commons-fileupload-1.2.1.jar等组件实现文件上传
  10. adb过滤只查看某一个app的日志
  11. Linux网络:内核中的网络参数(net.xxx.xxx)
  12. Linux下支持的视频文件格式,linux下视频格式转换与视频合并
  13. Abaqus 用户子程序 UEL
  14. python性能测试框架_python性能测试框架locust(一)
  15. Python——单因素方差分析表
  16. ValueError: Solver lbfgs supports only ‘l2‘ or ‘none‘ penalties, got l1 penalty.
  17. 计算机毕设(附源码)JAVA-SSM基于Yigo平台库房管理系统
  18. 虚拟机桌面切换命令行
  19. C++五子棋算法Ai 简单的电脑智能博弈
  20. 了解过什么是 DDD吗?一文带你掌握!(至尊典藏版)

热门文章

  1. qq五笔linux,QQ五笔 - 五笔小字典 QQ绑定很实用
  2. ibm+x3650+m4+linux+raid驱动,IBM X3650M4阵列卡驱动下载
  3. python中sorted的用法append_python sorted()排序详解
  4. 操作系统上机题目(多线程2)
  5. Qt异常结束程序无法重新运行
  6. echarts 怎么知道鼠标点击的哪根柱子
  7. nextgaussian_Java Random nextGaussian()方法与示例
  8. 顺序表(代码、分析、汇编)
  9. 常用汇编浮点操作指令
  10. python柱形图代码_Python数据可视化:基于matplotlib绘制「条形图」