Android动画-补间动画与Activity转场动画

Android动画

补间动画

Tween (补间)动画可以在一个视图容器内执行一系列简单变换(位置、大小、旋转、透明度)。 譬如,如果你有一个 TextView 对象,您可以让这个TextView移动、旋转、缩放、透明度,当然,如果它有一个背景图像,背景图像会随着文本变化。
补间动画通过 XML 或 Android 代码定义,建议使用 XML 文件定义,因为它更具可读性、可重用性。

补间动画相关:

类名xml关键字描述信息
AlphaAnimation<alpha>渐变透明度
RotateAnimation<rotate>旋转
ScaleAnimation<scale>渐变缩放
TranslateAnimation<translate>平移
AnimationSet<set>动画集合

动画属性

xml 属性描述
android:detachWallpaper是否在壁纸上运行
android:duration动画持续时间,毫秒为单位
android:fillAfter控件动画结束时是否保持动画最后的状态
android:fillBefore控件动画结束时是否还原到开始动画前的状态
android:fillEnabled与android:fillBefore效果相同
android:interpolator设定插值器(指定的动画效果,譬如回弹等)
android:repeatCount重复次数
android:repeatMode重复类型:reverse表示倒序回放,restart表示从头播放
android:startOffset调用start函数之后等待开始运行的时间,单位为毫秒
android:zAdjustment表示被设置动画的内容运行时在Z轴上的位置(top/bottom/normal),默认为normal

Alpha属性

xml属性描述
android:fromAlpha动画开始的透明度(0.0到1.0,0.0是全透明,1.0是不透明)
android:toAlpha动画结束时的透明度

Rotate 属性

xml 属性描述
android:fromDegrees旋转开始角度,正代表顺时针度数,负代表逆时针度数
android:toDegrees旋转结束角度,其它同上
android:pivotX缩放起点X坐标(数值、百分数、百分数p,譬如50表示以当前View左上角坐标加50px为初始点、50%表示以当前View的左上角加上当前View宽高的50%做为初始点、50%p表示以当前View的左上角加上父控件宽高的50%做为初始点)
android:pivotY缩放起点Y坐标,其它同上

Scale 属性

xml 属性描述
android:fromXScale初始化X轴缩放比例,1.0表示无变化
android:toXScale结束X轴缩放比例 1.0-0.0
android:fromYScale初始化Y轴缩放比例
android:toYScale结束Y轴缩放比例
android:pivotX缩放起点X轴坐标,同旋转
android:pivotY缩放起点Y轴坐标,同上

Translate 属性

xml 属性描述
android:fromXDelta起始点X轴坐标,同旋转
android:fromYDelta起始点Y轴坐标 ,同上
android:toXDelta结束点X轴坐标 ,同上
android:toYDelta结束点Y轴坐标 ,同上

相关代码 == 动画集合形式

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@anim/interpolator_resource"
    android:shareInterpolator=["true" | "false"] >
    <alpha
        android:fromAlpha="float"
        android:toAlpha="float" />
    <scale
        android:fromXScale="float"
        android:toXScale="float"
        android:fromYScale="float"
        android:toYScale="float"
        android:pivotX="float"
        android:pivotY="float" />
    <translate
        android:fromXDelta="float"
        android:toXDelta="float"
        android:fromYDelta="float"
        android:toYDelta="float" />
    <rotate
        android:fromDegrees="float"
        android:toDegrees="float"
        android:pivotX="float"
        android:pivotY="float" />
    <set>
        ...
    </set>
</set>
//使用
ImageView Image = (ImageView) findViewById(R.id.ipImage);
Animation JumpAnimation = AnimationUtils.loadAnimation(this, R.anim.space_jump);
Image.startAnimation(JumpAnimation);

视图动画插值器 Interpolator

使用:

<alpha android:interpolator="@android:anim/accelerate_interpolator">
    ...
</alpha >

系统自带的插值器:
在这里插入图片描述
自定义插值器:

<?xml version="1.0" encoding="utf-8"?>
 <InterpolatorName xmlns:android="http://schemas.android.com/apk/res/android"
     android:attribute_name="value"
     />

关于插值器的属性:
<accelerateInterpolator> android:factor 浮点数,加速速率 默认为1
<anticipateInterploator>android:tension 浮点数,起始点后拉的张力数(默认值为2)
<cycleInterplolator>android:cycles 整形,循环的个数(默认为1)。
<decelerateInterpolator>android:factor 浮点数,减速的速率(默认为1)。
<overshootInterpolator>
android:tension 浮点值,超出终点后的张力(默认为2)。

//一个动画始末速率较慢、中间加速的 AccelerateDecelerateInterpolator 插值器
public class AccelerateDecelerateInterpolator extends BaseInterpolator
        implements NativeInterpolatorFactory {
    ......
    public float getInterpolation(float input) {
        return (float)(Math.cos((input + 1) * Math.PI) / 2.0f) + 0.5f;
    }
    ......
}

Ripple Effect / Touch Feedback / 触摸反馈动画

材料设计中的触摸反馈在用户和UI元素交互的点提供瞬时视觉确认。例如,当按钮被触摸时显示一个水波纹效果。 这是 Android 5.0 默认的触摸反馈动画。水波纹动画通过新的 RippleDrawable 类实现。水波纹效果可以配置在 View 边界的末端或超出 View 的边界。

//有边界
?android:attr/selectableItemBackground
//无边界 (要求API21以上)
?android:attr/selectableItemBackgroundBorderless

使用时只需要把上面这两个值作为 View 的 android:background="" 或 android:foreground="" 即可(如果已经有背景, 可以设置到前景属性中)。同时如果想要效果显示出来要保证 View 是可点击的(比如控件本身可点击、或者给控件设置点击事件、 或给控件设置 android:clickable=“true”)。

自定义 Ripple

<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="#4285f4">
    <!--ripple中color:波纹点击颜色-->
    <!--ripple中radius:波纹大小,则触摸显示的波纹为设置的固定大小,
    不会为手指触摸点开始显示-->
    <!--添加边界  存在边界就是矩形,无边界就是圆形-->
    <item android:drawable="@color/colorAccent"/>
    
</ripple>

自定义Ripple和shape结合,控制水波纹扩散的图形

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="rectangle">
    <solid android:color="#ff9d77"/>
    <corners 
        android:bottomRightRadius="100dp"/>
</shape>
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="#FF0000" >
    <item 
        android:id="@android:id/mask"
        android:drawable="@drawable/shape"/>

</ripple>

自定义Ripple和selector结合,水波纹和按钮转态切换

<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="#FF0000" >
    <item>
        <selector>
            <item
                android:drawable="@drawable/icon_bg1"
                android:state_pressed="true">
            </item>
            <item
                android:drawable="@drawable/icon_bg2"
                android:state_pressed="false">
            </item>
        </selector>
    </item>
</ripple>

Activity转场动画-overridePendingTransition(0, 0)

overridePendingTransition(0, 0);用来指定Activity之间的切换动画
Activity的切换动画指的是从一个activity跳转到另外一个activity时的动画。
它包括两个部分
一部分是第一个参数是activity退出时的动画;
另外一部分时第二个参数是activity进入时的动画;

在这里插入图片描述

在Android的2.0版本之后,有了一个函数来帮我们实现这个动画。这个函数就是overridePendingTransition
这个函数有两个参数,一个参数是MainActivity2.class进入时的动画,另外一个参数则是ShowUiActivity.this退出时的动画。
这里需要特别说明的是,关于overridePendingTransition这个函数,有两点需要主意
1.它必需紧挨着startActivity()或者finish()函数之后调用”
2.它只在android2.0以及以上版本上适用
API 21之前Activity过渡动画使用:
style文件主题里面统一定义,全局为所有Activity设置过渡动画效果。

<item name="android:windowAnimationStyle">@style/Animation.Activity.Customer</item>
    <style name="Animation.Activity.Customer" parent="@android:style/Animation.Activity">
        <!-- 进入一个新的Activity的时候,A->B B进入动画 -->
        <item name="android:activityOpenEnterAnimation">@anim/right_in</item>
        <!-- 进入一个新的Activity的时候,A->B A退出动画 -->
        <item name="android:activityOpenExitAnimation">@anim/left_out</item>
        <!-- 退出一个Activity的时候,B返回到A A进入动画 -->
        <item name="android:activityCloseEnterAnimation">@anim/left_in</item>
        <!-- 退出一个Activity的时候,B返回到A B退出动画 -->
        <item name="android:activityCloseExitAnimation">@anim/right_out</item>
    </style>
 Intent intent = new Intent(ShowUiActivity.this,MainActivity2.class);
                startActivity(intent);
                overridePendingTransition(R.anim.cat_in,R.anim.cat_out);
                //overridePendingTransition(0, 0);

API 21(5.0)后系统内置了Activity之间的切换动画,满足我们日常开发的需求,但是意味着这些动画只适用于5.0之后的系统(兼容);

关于内置Activity之间切换动画如何使用

Activity之间的切换动画,对于任意一个Activity来说,无非就是“进入”和“退出”两种情景下的动画。而“进入”分为“第一次进入Activity”和“返回当前Activity”这两种情况。另外系统还提供了一种动画,即共享元素,这是让两个Activity中的View有个过渡切换的效果。执行动画的状态如下所示:
在这里插入图片描述

Transitionz过渡动画的使用也是有前提的: API
21以上。当然你也可以不使用ActivityOptions,而是使用兼容类ActivityOptionsCompat来替换ActivityOptions。(兼容类给到我们的作用是保证程序在低版本运行不会挂掉,但是不能保证低版本也能起到响应的效果的)
必须允许Activity可以使用Transition,要么在style里面设置(true),要么直接通过代码设置(getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS)😉。

enter:用于决定第一次打开当前Activity时的动画
exit : 用于决定退出当前Activity时的动画
reenter: 用于决定如果当前Activity已经打开过,并且再次打开该Activity时的动画
shared elements:用于决定在两个Activity之间切换时,指定两个Activity中对应的View的过渡效果

三种动画效果:transition:Explode(爆炸分解),Slide(滑动),Fade(淡入淡出).
而你需要做的,首先对Activity的ThemeStyle添加windowContentTransitions属性:
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> 
  ...
  <!-- 允许使用transitions -->  
  <item name="android:windowContentTransitions">true</item>  
  <!--是否覆盖执行,其实可以理解成是否同步执行还是顺序执行-->  
  <item name="android:windowAllowEnterTransitionOverlap">false</item>  
  <item name="android:windowAllowReturnTransitionOverlap">false</item>
</style>
 //退出时使用
            getWindow().setExitTransition(explode);
            //第一次进入时使用
            getWindow().setEnterTransition(explode);
            //再次进入时使用
            getWindow().setReenterTransition(explode);

**我们有两种方式来定义过渡动画:资源文件的方式、代码的方式。
**

该xml定义了一个slide过渡动画,除了状态栏、导航栏以外其他所有的View进行滑入滑出动画效果。 android:slideEdge=”top” 设置滑动的方向

<?xml version="1.0" encoding="utf-8"?>
<slide xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="1000">
    <targets>
        <target android:excludeId="@android:id/statusBarBackground"/>
        <target android:excludeId="@android:id/navigationBarBackground"/>
    </targets>
</slide>

元素共享动画 和场景动画

参考链接:

  • https://blog.csdn.net/wuyuxing24/article/details/78857912
  • https://github.com/Trisaa/MaterialTranstion
  • https://github.com/OCNYang/Android-Animation-Set/blob/master/view-animation/ViewAnimationUseTips.md
  • OCNYang 动画合集讲解
  • 小欣儿
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值