android开发之为view和activity添加过渡动画

动画可以增强产品的用户体验,也可以带来很多乐趣。今天我将演示如何为view和Activity添加左右滑动的动画。注:不是属性动画,而是安卓早期引入的补间动画,对于此处的应用场景来说足够了。

首先来看看我们将要创建的动画效果。Activity根据导航的方向滑入滑出:

在这里插入图片描述

定义动画

我们总共需要四个动画,将在xml中定义它们。这四个动画其实可以分为两组。第一组是将View移动出视野,第二组是把View从视野之外移进来。
slide_to_left.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:interpolator="@android:anim/accelerate_decelerate_interpolator"
               android:duration="@integer/slide_animation_duration"/>
</set>

slide_to_right.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:interpolator="@android:anim/accelerate_decelerate_interpolator"
               android:duration="@integer/slide_animation_duration"/>
</set>

slide_from_left.xml:
从左边滑入

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

slide_from_right.xml:
从右边滑入

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

每个动画的持续时间都为@integer/slide_animation_duration,定义在integers.xml中,如下:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <integer name="slide_animation_duration">300</integer>
</resources>

这样可以让动画保持连贯性,所有的动画都以相同的速度移动。

应用到View上

对一个View应用动画很简单,我们只需把从xml加载的动画应用到View就可以了:

view.startAnimation(AnimationUtils.loadAnimation(
        context, R.anim.slide_to_right
));

我喜欢为这些相关的动画组创建一个工具类,尤其是它们在应用中使用的比较普遍的情况下。

public class SlideAnimationUtil {
 
    /**
     * Animates a view so that it slides in from the left of it's container.
     *
     * @param context
     * @param view
     */
    public static void slideInFromLeft(Context context, View view) {
        runSimpleAnimation(context, view, R.anim.slide_from_left);
    }
 
    /**
     * Animates a view so that it slides from its current position, out of view to the left.
     *
     * @param context
     * @param view
     */
    public static void slideOutToLeft(Context context, View view) {
        runSimpleAnimation(context, view, R.anim.slide_to_left);
    }
 
    /**
     * Animates a view so that it slides in the from the right of it's container.
     *
     * @param context
     * @param view
     */
    public static void slideInFromRight(Context context, View view) {
        runSimpleAnimation(context, view, R.anim.slide_from_right);
    }
 
    /**
     * Animates a view so that it slides from its current position, out of view to the right.
     *
     * @param context
     * @param view
     */
    public static void slideOutToRight(Context context, View view) {
        runSimpleAnimation(context, view, R.anim.slide_to_right);
    }
 
    /**
     * Runs a simple animation on a View with no extra parameters.
     *
     * @param context
     * @param view
     * @param animationId
     */
    private static void runSimpleAnimation(Context context, View view, int animationId) {
        view.startAnimation(AnimationUtils.loadAnimation(
                context, animationId
        ));
    }
}

工具类创建好了之后,我们就可以在应用中任意的使用了,如下:

SlideAnimationUtil.slideInFromLeft(context, view);

应用到Activity之间

在Activity之间使用动画也很简单。Activity类为我们提供了一个叫做overridePendingTransition的方法,我们可以用它来设置进入和退出动画。如下:

Intent intent = new Intent(this, SomeActivity.class);
startActivity(intent);
overridePendingTransition(enterAnimationId, exitAnimationId);

在调用startActivity之后调用overridePendingTransition可以让新的Activity运行enterAnimationId,而当前Activity运行exitAnimationId。

把我们早先定义好的动画放进来,我们就可以让新的Activity从右边滑进来,而当前的Activity滑离至左边视野之外,如下:

startActivity(intent);
overridePendingTransition(R.anim.slide_from_right, R.anim.slide_to_left);

类似的,当新的Activity结束之后,我们可以执行相反的动画,让结束的Activity滑出至右边视野之外,而之前的Activity从左边滑回来:

finish();
overridePendingTransition(R.anim.slide_from_left, R.anim.slide_to_right);

这样就能做到Activity之间来回流畅的切换,比Activity默认的动画要好。

保持一致

我绝大多数应用都创建了一个BaseActivity类,把一些可以共享的常见的功能都放在里面,比如log和显示fragment。因为我想让所有的activity切换效果都保持一致,所以我觉得把它放在BaseActivity实在再合适不过了:

public class BaseActivity extends Activity {
    
    @Override
    public void finish() {
        super.finish();
        overridePendingTransitionExit();
    }
    
    @Override
    public void startActivity(Intent intent) {
        super.startActivity(intent);
        overridePendingTransitionEnter();
    }
    
    /**
     * Overrides the pending Activity transition by performing the "Enter" animation.
     */
    protected void overridePendingTransitionEnter() {
        overridePendingTransition(R.anim.slide_from_right, R.anim.slide_to_left);
    }
 
    /**
     * Overrides the pending Activity transition by performing the "Exit" animation.
     */
    protected void overridePendingTransitionExit() {
        overridePendingTransition(R.anim.slide_from_left, R.anim.slide_to_right);
    }
    
}

你也可以像我这样重写startActivity和finish,这样就不需要直接调用了。记住要调用super方法,并重写所有衍生方法,比如startActivityForResult。

现在你如果想改变动画效果,只需在更新一个地方就行了。

注:本文内容为转载内容,原文地址:原文地址

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值