Activity切换动效之translate

原文:http://blog.csdn.net/menxu_work/article/details/10258787
http://www.oschina.net/question/97118_34523
一、简介
我们通过Activity的overridePendingTransition方法可以定制从一个activity跳转到另外一个activity时的动画。
public void overridePendingTransition (int enterAnim, int exitAnim)
这个函数有两个参数,一个参数enterAnim是要切换进入的那个activity进入时的动画,另外一个参数exitAnim则是要切换退出的那个activity退出时的动画。
Activity的切换效果使用的是Android的动画效果,Android的动画在官方有相关资料: http://developer.android.com/guide/topics/graphics/animation.html
Activity的切换动画实际上是Android的View Animation(视图动画)中的Tween Animation效果,Tween Animation分为4种动画效果,分别是:alpha (透明变化) translate(位置移动) scale(缩放) rotate(旋转), 而左右滑动切换使用的是 translate(位置移动)的效果,在下一篇我们再讨论一下 alpha (透明变化) 、scale(缩放)、 rotate(旋转) 这三种效果,本篇只将 translate(位置移动)。
Translate动画是非常好理解,就是定义一个开始的位置和一个结束位置,定义移动时间,然后就能自动产生移动动画。Android的translate移动方向有 横向(X) 竖向(Y),。
左右滑动使用了横向移动效果,对于横向(X)的位置如下
Activity切换动效 - hubingforever - 民主与科学
 从上图可以看出,以手机屏幕下面边未X轴,屏幕左边为Y轴,当Activity在X轴值为-100%p时,刚好在屏幕的左边(位置1),当X轴值为0%p时,刚好再屏幕内(位置2),当X=100%p时刚好在屏幕右边(位置3)。
上下滑动使用了竖向移动效果对于竖向(Y)的位置如下:
Activity切换动效 - hubingforever - 民主与科学
 
二、左右滑动切换动画
实现过程如下,首先定义2个动画,在 res目录创建anim目录, 然后在目录创建动画的xml文件:out_to_left.xml (从左边退出动画) 、in_from_right.xml(从右边进入动画)
out_to_left.xml (从左边退出动画)

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

in_from_right.xml(从右边进入动画)

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

注: android:fromXDelta动画开始X方向的位置,  android:toXDelta 动画结束X方向的位置,android:duration动画的时间。
Android 代码如下:

package com . example . test ;
import android . app . Activity ;
import android . content . Context ;
import android . content . Intent ;
import android . os . Bundle ;
import android . view . View ;
import android . view . View .*;
import android . widget . Button ;
import android . widget . TextView ;
public class Activity1 extends Activity {
    @Override
    protected void onCreate ( Bundle savedInstanceState ) {
        super . onCreate ( savedInstanceState );
        setContentView ( R . layout . activity1_main );
        TextView tv =( TextView ) this . findViewById ( R . id . content );
        tv . setText ( "Activity1" );
        Button btnNext =( Button ) this . findViewById ( R . id . goActivity2 );
        btnNext . setOnClickListener ( new OnClickListener (){
@Override
public void onClick ( View v ) {
// TODO Auto-generated method stub
Intent intent=new Intent();
intent.setClass(getApplicationContext(), Activity2.class);
startActivity(intent);
overridePendingTransition(R.anim.out_to_left,R.anim.in_from_right);
}
       
        });
    }
}

三、上下滑动切换动画
实现过程如下,首先定义2个动画,在 res目录创建anim目录, 然后在目录创建动画的xml文件:out_to_up.xml (从上边退出动画) 、in_from_down.xml从下边进入动画)
out_to_up.xml (从上边退出动画)

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

in_from_down.xml(从下边进入动画)

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

注: android: fromYDelta动画开始的Y方向位置,   android:toYDelta动画结束的Y方向位置,android:duration动画的时间。
Android 代码如下:

package com . example . test ;
import android . app . Activity ;
import android . content . Intent ;
import android . os . Bundle ;
import android . view . View ;
import android . view . View . OnClickListener ;
import android . widget . Button ;
import android . widget . TextView ;
public class Activity2 extends Activity {
    @Override
    protected void onCreate ( Bundle savedInstanceState ) {
        super . onCreate ( savedInstanceState );
        setContentView ( R . layout . activity2_main );
        TextView tv =( TextView ) this . findViewById ( R . id . content );
        tv . setText ( "Activity2" );
        Button btnNext =( Button ) this . findViewById ( R . id . btnExit );
        btnNext . setOnClickListener ( new OnClickListener (){
@Override
public void onClick ( View v ) {
// TODO Auto-generated method stub
finish();
overridePendingTransition(R.anim.in_from_down,R.anim.out_to_up);
}
       
        });
    }
}

、translate的重要属性
1、interpolator
android:interpolator 用于设置插值器 interpolator  。关于插值器interpolator的更多内容请参考 Tween Animation动画之插值器interpolator
2、duration
android:duration表示动画运行时间,定义在多次时间(ms)内完成动画
3、startOffset
android:startOffset表示延迟一定时间后运行动画
4、fromXDelta
fromXDelta表示X轴方向开始位置,可以是%,也可以是具体的像素 具体见图
5、toXDelta
toXDelta表示X轴方向结束位置,可以是%,也可以是具体的像素
6、fromYDelta
fromYDelta表示Y轴方向开始位置,可以是%,也可以是具体的像素
7、toYDelta
toYDelta表示Y轴方向结束位置,可以是%,也可以是具体的像素
 当你了解上面的属性后,你可以组合出很多有趣的位置移动效果。比如使用加速器:@android:anim/bounce_interpolator 可以产生弹球落地时的效果。

在实际项目中需要在进行只使用“左右上下滑动”的效果可能还不够炫,希望在切换时能产生更动态的效果,比如开始切换时第1个Activity先向后退一步,然后在向左方向退出屏幕。然后第2个Activity紧跟后面从右边进入屏幕,到达终点时有一个动态效果。在了解了动画加速器后,大家都知道可以采用:anticipate_overshoot_interpolator 、anticipate_interpolator、overshoot_interpolator这三个加速器实现左右滑动切换时启动或者结束的动态效果。
动画文件定义如下:
dync_out_to_left.xml 
   
   
<? xml version = "1.0" encoding = "utf-8" ?>
<translate xmlns:android = "http://schemas.android.com/apk/res/android"
    android:duration = "500"
    android:fromXDelta = "0%p"
    android:interpolator = "@android:anim/anticipate_interpolator"
    android:toXDelta = "-100%p" />

dync_in_from_right.xml

<? xml version = "1.0" encoding = "utf-8" ?>
<translate xmlns:android = "http://schemas.android.com/apk/res/android"
    android:duration = "500"
    android:fromXDelta = "100%p"
    android:interpolator = " @android:anim/anticipate_overshoot_interpolator "
    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

<? xml version = "1.0" encoding = "utf-8" ?>
<set xmlns:android = "http://schemas.android.com/apk/res/android"
    android:shareInterpolator = "false" >
    <translate
        android:duration = "200"
        android:fromXDelta = "0%p"
        android:interpolator = "@android:anim/accelerate_decelerate_interpolator"
        android:toXDelta = "2%p" />
    <translate
        android:duration = "1000"
        android:fromXDelta = "2%p"
        android:interpolator = "@android:anim/accelerate_interpolator"
        android:startOffset = "200"
        android:toXDelta = "-100%p" />
</set>

new_dync_in_from_right.xml

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

结束
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值