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)

[html] view plaincopy

 
      1. <?xml version="1.0" encoding="utf-8"?>
      2. <set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_interpolator">
      3. <translate android:fromXDelta="0%p" android:toXDelta="-100%p"
      4. android:duration="500" />
      5. </set>

(从 位置3 移动到 位置2)

<?xml version="1.0" encoding="utf-8"?>

  1. <set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_interpolator">
  2. <translate android:fromXDelta="100%p" android:toXDelta="0%p"
  3. android:duration="500" />
  4. </set>

android:fromXDelta 动画开始的位置,  android:duration动画的时间。

Android 代码如下:

[java] view plaincopy

 
    1. public class LeftRightSlideActivity extends Activity {
    2. @Override
    3. public void onCreate(Bundle savedInstanceState) {
    4. super.onCreate(savedInstanceState);
    5. setContentView(R.layout.main);
    6. Button button = (Button)findViewById(R.id.button1);
    7. button.setOnClickListener(new View.OnClickListener() {
    8. @Override
    9. public void onClick(View v) {
    10. Intent intent = new Intent();
    11. intent.setClass(LeftRightSlideActivity.this, SlideSecondActivity.class);
    12. startActivity(intent);
    13. //设置切换动画,从右边进入,左边退出
    14. overridePendingTransition(R.anim.in_from_right, R.anim.out_to_left);
    15. }
    16. });
    17. }
    18. }

效果图如下:

    

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

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

代码见:点击打开链接

Activity的切换效果使用的是Android的动画效果,Android的动画在官方有相关资料:http://developer.android.com/guide/topics/graphics/animation.htmlhttp://developer.android.com/guide/topics/resources/animation-resource.html,Activity
的切换动画实际上是Android的View
Animation(视图动画)中的Tween Animation效果,Tween Animation分为4种动画效果,分别是:alpha
(透明变化) translate(位置移动) scale(缩放) rotate(旋转), 而左右滑动切换使用的是
translate(位置移动)的效果。Translate动画是非常好理解,就是定义一个开始的位置和一个结束位置,定义移动时间,然后就能自动产生移动动画。Android的translate移动方向有
横向(X) 竖向(Y), 左右滑动使用了横向移动效果,对于竖向(Y)的位置如下:

定义一个向上退出的动画(从位置2 移动位置3)和从下面进入(从位置1移动位置2)的动画定义文件如下:

out_to_up.xml (从屏幕上面退出)

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <translate xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:interpolator="@android:anim/accelerate_interpolator"
  4. android:fromYDelta="0%p"
  5. android:toYDelta="-100%p"
  6. android:duration="1000">
  7. </translate>

in_from_down.xml (从屏幕下面进入)

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <translate xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:interpolator="@android:anim/accelerate_interpolator"
  4. android:fromYDelta="100%p"
  5. android:toYDelta="0%p"
  6. android:duration="1000">
  7. </translate>

接下来讲一讲translate的几个重要的属性:

android:interpolator: 加速器,非常有用的属性,可以简单理解为动画的速度,可以是越来越快,也可以是越来越慢,或者是先快后忙,或者是均匀的速度等等,对于值如下:

  1. @android:anim/accelerate_interpolator: 越来越快
  2. @android:anim/decelerate_interpolator:越来越慢
  3. @android:anim/accelerate_decelerate_interpolator:先快后慢
  4. @android:anim/anticipate_interpolator: 先后退一小步然后向前加速
  5. @android:anim/overshoot_interpolator:快速到达终点超出一小步然后回到终点
  6. @android:anim/anticipate_overshoot_interpolator:到达终点超出一小步然后回到终点
  7. @android:anim/bounce_interpolator:到达终点产生弹球效果,弹几下回到终点
  8. @android:anim/linear_interpolator:均匀速度。

android:duration: 动画运行时间,定义在多次时间(ms)内完成动画

android:startOffset: 延迟一定时间后运行动画

fromXDelta: X轴方向开始位置,可以是%,也可以是具体的像素 具体见图

toXDelta:   X轴方向结束位置,可以是%,也可以是具体的像素

fromYDelta: Y轴方向开始位置,可以是%,也可以是具体的像素

toYDelta:    Y轴方向结束位置,可以是%,也可以是具体的像素

当你了解上面的属性后,你可以组合出很多有趣的位置移动效果。比如使用加速器:@android:anim/bounce_interpolator 可以产生弹球落地时的效果。

在实际项目中需要在进行只使用“左右上下滑动”的效果可能还不够炫,希望在切换时能产生更动态的效果,比如开始切换时第1个Activity先向后退一
步,然后在向左方向退出屏幕。然后第2个Activity紧跟后面从右边进入屏幕,到达终点时有一个动态效果。在了解了动画加速器后,大家都知道可以采
用:anticipate_overshoot_interpolator
、anticipate_interpolator、overshoot_interpolator这三个加速器实现左右滑动切换时启动或者结束的动态效
果。

动画文件定义如下:

dync_out_to_left.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <translate xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:duration="500"
  4. android:fromXDelta="0%p"
  5. android:interpolator="@android:anim/anticipate_interpolator"
  6. android:toXDelta="-100%p" />

dync_in_from_right.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <translate xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:duration="500"
  4. android:fromXDelta="100%p"
  5. android:interpolator=" @android:anim/anticipate_overshoot_interpolator "
  6. android:toXDelta="0%p" />

但是再使用以上动画配置,会出现以下问题:

1.     第1个Activity使用anticipate_interpolator时,开始移动时先向后退一步,然后向前移动。但向后退一步步伐太大,略显夸张,实际应用中只希望退后一小小步就行了。

2.     由于开始向后退一步,额外增加了移动时间,导致前一Activity和后一个Activity的时间不同步。

为了解决以上问题,重新定义动态效果,将第1个Activity的移动分为2个动画效果:(1)用200毫秒时间先向后移动2%p的位置 (2)
延迟200毫秒后从2%p位置向前移动到-100%p位置。 然后第2个Activity从延迟200毫秒然后从102%p位置移动到0%p位置。

动画定义如下:

new_dync_out_to_left.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <set xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:shareInterpolator="false" >
  4. <translate
  5. android:duration="200"
  6. android:fromXDelta="0%p"
  7. android:interpolator="@android:anim/accelerate_decelerate_interpolator"
  8. android:toXDelta="2%p" />
  9. <translate
  10. android:duration="1000"
  11. android:fromXDelta="2%p"
  12. android:interpolator="@android:anim/accelerate_interpolator"
  13. android:startOffset="200"
  14. android:toXDelta="-100%p" />
  15. </set>

new_dync_in_from_right.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <translate xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:duration="1000"
  4. android:fromXDelta="102%p"
  5. android:interpolator="@android:anim/anticipate_overshoot_interpolator"
  6. android:startOffset="200"
  7. android:toXDelta="0%p" />

补充:

android
- anim translate中 fromXDelta、toXDelta、fromYDelta、toXDelta属性

  1. <set xmlns:android="http://schemas.android.com/apk/res/android">
  2. <translate
  3. android:fromXDelta="0"
  4. android:toXDelta="100%"
  5. android:duration="300"/>
  6. <alpha
  7. android:fromAlpha="0.0"
  8. android:toAlpha="1.0"
  9. android:duration="300" />
  10. </set>

其中:

translate 位置转移动画效果  

            整型值:  

                fromXDelta 属性为动画起始时 X坐标上的位置  

                toXDelta   属性为动画结束时 X坐标上的位置  

                fromYDelta 属性为动画起始时 Y坐标上的位置  

                toYDelta   属性为动画结束时 Y坐标上的位置  

                注意:  

                         没有指定,  

                         默认是以自己为相对参照物  

            长整型值:  

                duration  属性为动画持续时间

说明:   时间以毫秒为单位

在这些属性里面还可以加上%和p,例如:

android:toXDelta="100%",表示自身的100%,也就是从View自己的位置开始。

android:toXDelta="80%p",表示父层View的80%,是以它父层View为参照的。

Android的Activity屏幕切换动画左右滑动切换的更多相关文章

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

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

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

    (国内知名Android开发论坛eoe开发者社区推荐:http://www.eoeandroid.com/) Android的Activity屏幕切换动画(一)-左右滑动切换 在Android开发过程 ...

  3. 仿美团外卖,饿了吗 两个ListView联动,左边点击切换右边,右边滑动切换左边

    先上效果图: 实现思路: 1.先说右边标题: 首先,右边的数据源集合中的Javabean中含有三个属性name,type,title,而每个条目中会默认含有一个标题. 如果这是第一个条目,就让标题显示 ...

  4. Android的Activity屏幕切换滑动动画

    Activity的切换效果使用的是Android的动画效果,Android的动画在官方有相关资料:http://developer.android.com/guide/topics/graphics/ ...

  5. Activity 切换动画和页面切换动画

    public class MainActivity extends Activity { private ViewFlipper viewFlipper; private float startX; ...

  6. Android的Activity跳转动画各种效果整理

    Android的Activity跳转就是很生硬的切换界面.其实Android的Activity跳转可以设置各种动画,本文整理了一些,还有很多动画效果,就要靠我们发挥自己的想象力 大家使用Android ...

  7. 微信小程序tab切换,可滑动切换,导航栏跟随滚动实现

    简介 看到今日头条小程序页面可以滑动切换,而且tab导航条也会跟着滚动,点击tab导航,页面滑动,切导航栏也会跟着滚动,就想着要怎么实现这个功能 像商城类商品类目如果做成左右滑动切换类目用户体验应该会 ...

  8. Android实现Activity页面跳转切换动画特效

    了解Android程序设计的人应该知道,在Android 2.0之后有了overridePendingTransition(),其中里面两个参数,一个是前一个activity的退出,另一个activi ...

  9. StarRatingBar星星切换动画《IT蓝豹》

    StarRatingBar星星切换动画 StarRatingBar星星切换动画,很久没有学习一下这个RatingBar了,今天来看看这个RatingBar的动画切换效果,本例子主要是RatingBar ...

随机推荐

  1. 通过媒体查询来实现 WPF 响应式设计

    WPF 客户端经常需要运行在各种不同大小屏幕下,为了显示友好,所以开发的时候都需要考虑响应式设计. 布局往往通过指定比例,而不直接指定准确的大小来实现响应式布局(如 Width="3*&qu ...

  2. Linux命令 之 “救命稻草”

    一.前言 虽然Linux操作系统图形界面已经退出,但由于大量的操作在终端操作比较快捷,所以,对linux命令的使用必不可少.在linux系统日常的学习和工作中,常常会出现有些命令忘记了或者该命令的参数 ...

  3. C#/VB.NET 将Html转为Excel

    本文介绍通过C#和VB.NET代码展示将Html转为Excel文档的方法. dll引用 方法1 将 Spire.XLS for .NET 下载到本地,解压,安装.完成安装后,在安装路径下找到BIN文件 ...

  4. 所有整数型包装类对象值的比较,使用equals方法进行比较

    一.整数型包装类对象值的比较,使用equals方法进行比较 题眼:整型包装类.值的比较 注:== :对于基本类型,比较的是值:对于引用类型,比较的是地址值. // 组一Integer i1=new I ...

  5. 用注册表清除Office Word文档杀手病毒

    不久前,笔者打开word文件时遇到了一件离奇的怪事,常用的Word文件怎么也打不开,总是出现提示框:"版本冲突:无法打开高版本的word文档".再仔细查看,文件夹里竟然有两个名字一 ...

  6. Caffeine缓存详解

    概要 Caffeine是一个高性能,高命中率,低内存占用,near optimal 的本地缓存,简单来说它是 Guava Cache 的优化加强版,有些文章把 Caffeine 称为"新一代 ...

  7. 【Calculate】Calculate Linux安装操作记录

    镜像下载.域名解析.时间同步请点击 阿里云开源镜像站 一.Calculate简介 Calculate Linux 是一个基于 Gentoo的发行版本. Calculate 目录服务器 (CDS) 是一 ...

  8. Linux上搭建meterSphere

    镜像下载.域名解析.时间同步请点击 阿里云开源镜像站 一.安装Docker (1)安装CentOS Docker curl -fsSL https://get.docker.com | bash -s ...

  9. RabbitMQ Go客户端教程2——任务队列/工作队列

    本文翻译自RabbitMQ官网的Go语言客户端系列教程,本文首发于我的个人博客:liwenzhou.com,教程共分为六篇,本文是第二篇--任务队列. 这些教程涵盖了使用RabbitMQ创建消息传递应 ...

  10. 使用数据库连接工具DBeaver连接H2数据库

    H2数据库第一次听说,学习了. H2数据库自带了一个浏览器web操作,但是非常的不好用,用DBeaver看着好用多了. 1.点击带+的连接图标 2.选择ALL点击H2 Embedded.(如果本地没有 ...