Android 动画学习笔记(二)

引言

学习动画的过程中,发现并没有那么简单。
以前只知道补间动画,属性动画,现在觉得真是弟弟。
话不多说,开始总结。

本文引用了一些网络图片,在此感谢各位作者。

转场动画

Android提供了三种现成的动画:explode、slide、fade

explodeslidefade

实现转场动画步骤如下:
1.设置windowContentTransitions属性为true
java:

getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);

XML:

 <item name="android:windowContentTransitions">true</item>

2.设置Enter(进入) / Exit(退出) 效果

setExitTransition() - 当A startB时,使A中的View退出场景的transition 在A中设置

setEnterTransition() - 当A startB时,使B中的View进入场景的transition 在B中设置

setReturnTransition() - 当B 返回A时,使B中的View退出场景的transition 在B中设置

setReenterTransition() - 当B 返回A时,使A中的View进入场景的transition 在A中设置

java:

Slide slide = new Slide(Gravity.BOTTOM);
slide.setDuration(200);
getWindow().setEnterTransition(slide);

XML:
首先在res/下建立transition目录,将以下xml放入transition目录下。

<?xml version="1.0" encoding="utf-8"?>
<fade xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="1000">
</fade>

然后在Activity中设置transition

Transition transition = TransitionInflater.from(this).inflateTransition(R.transition.activity_fade);
getWindow().setExitTransition(transition );

3.跳转界面时调用startActivity(Intent intent, Bundle options)方法
必须调用这个方法才有效果。

startActivity(intent,ActivityOptions.makeBasic().toBundle());

共享元素

共享元素会实现跳转时的无缝动画。

效果

可以看到其中的共享因素为头像及昵称

实现步骤:

设置windowContentTransitions属性为true,上文有。

我们假设A 界面跳转到 B界面

1.A界面
在跳转到B界面时,需要传入ActivityOptions作为参数

ActivityOptions transitionActivityOptions = ActivityOptions.makeSceneTransitionAnimation(this,
                        Pair.create(findViewById(R.id.tv_share), "share_text"),
                        Pair.create(findViewById(R.id.img_share), "share"));
                startActivity(intent,transitionActivityOptions.toBundle());

这里的Pair是共享元素,调用Pair <A, B> create(A a, B b) 方法添加一个共享元素,如:

Pair.create(findViewById(R.id.img_share), "share"));

这里的两个参数分别为:

1.所要共享的View控件 2.标识符(这里的标识符要与B界面的共享元素xml中transitionName属性一致)

B界面:
Java代码无需操作,只需要在布局XML中为目标控件设置transitionName

如下:

注意一下android:transitionName属性的值要与传过来的Pair中的标识符一致

 <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:transitionName="share_text"
        android:text="Share TXT"
        />

这样就完成啦。

揭示动画

效果

主要方法:

ViewAnimationUtils.createCircularReveal(View view, int centerX,  int centerY, float startRadius, float endRadius)

参数说明:第一个为目标View,第二、三个是揭露动画中心点坐标,第四个是开始的半径,第五个为结束半径。

结束半径一般为对角线长度(因为只有半径为对角线长度才不会有少揭示的动画)

注意:

使用时揭示动画一般会切换View的显示状态

1.从Visible 到Invisible要在结束时设置setVisiblity(View.INVISIBLE);
2.从Invisible到Visible要在显示的时候设置setVisiblity(View.VISIBLE);

原因是从显示到隐藏是在最后动画结束的时候隐藏,而隐藏到显示是需要在开始的时候就将View设可见的,不然是没有效果的。

触摸反馈动画

1.如何修改默认颜色?

使用Rippe标签的XML文件自定义Ripple颜色

<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="@color/colorPrimary">
</ripple>

设置background即可

2.有边界与无边界如何使用?

有边界:

android:background="?android:attr/selectableItemBackground"

无边界:

android:background="?android:attr/selectableItemBackgroundBorderless"

3.形状控制矩形、圆形及设置默认颜色

<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="@color/colorPrimary">

    <item>
        <shape android:shape="rectangle"
            >
            <solid android:color="@color/colorPrimaryDark"/>
        </shape>
    </item>

</ripple>

ripple标签下的color是设置水波纹颜色,shape标签的shape控制形状,shape->solid ->color是默认背景颜色

矢量图动画(SVG)

1.为什么要使用SVG图?

(1)SVG图不会随着分辨率变化而失真
(2)用XML语言描述,易于修改
(3)跨平台

2.如何使用SVG图
(1)获取SVG图途径
Android Studio编译器自带New->Vector Assets选择对应图片,填写大小就完成啦

从阿里图库获取阿里矢量图

(2)使用SVG图

vector标签

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportWidth="24.0"
    android:viewportHeight="24.0">
 
        <path
            android:fillColor="#FF000000"
            android:pathData="M12,3v9.28c-0.47,-0.17 -0.97,-0.28 -1.5,-0.28C8.01,12 6,14.01 6,16.5S8.01,21 10.5,21c2.31,0 4.2,-1.75 4.45,-4H15V6h4V3h-7z" />
 
</vector>

设置background即可

3.SVG 动画

vector.xml SVG图资源

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportWidth="24.0"
    android:viewportHeight="24.0">
    <group
        android:name="test"
        android:rotation="0"
        android:pivotX="12"
        android:pivotY="12"
        >
        <path
            android:fillColor="#FF000000"
            android:pathData="M12,3v9.28c-0.47,-0.17 -0.97,-0.28 -1.5,-0.28C8.01,12 6,14.01 6,16.5S8.01,21 10.5,21c2.31,0 4.2,-1.75 4.45,-4H15V6h4V3h-7z" />
    </group>
</vector>

objectionAnimator属性动画控制属性

<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="4000"
    android:propertyName="rotation"
    android:valueFrom="0"
    android:valueTo="360">

</objectAnimator>

胶水animated-vector,作用:将属性动画与Vector图资源连接在一起

<?xml version="1.0" encoding="utf-8"?>
<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/ic_audiotrack_black_24dp">
    <target
        android:name="test"
        android:animation="@animator/anim" />

</animated-vector>

JAVA代码使用:

Drawable drawable = img.getDrawable();
                if(drawable instanceof Animatable) {
                    ((Animatable) drawable).start();
                }

除了使用这种形式的动画,还可以用一般的动画实现效果。

注意:

1.target中的name名称要与vector0>group下的name属性一致。

2.如果是旋转动画或者缩放动画要制定坐标即android:pivotX,android:pivotY其中的值对应android:viewportWidth,android:viewportHeight,如果是中心点,即两个值的一半,如上面的情况要填24/2=12。

3.android:propertyName这里的值要与group下需要变化的值相同。

特殊属性

1.fillAfter 覆盖最后的状态,意思是动画结束后保持最后的效果。
2.fillBefore 覆盖最开始的小姑哦,意思是动画结束后保持最开始的效果。
3.repeatMode 重复模式reverse(从结束的位置继续)、restart(重新开始)
4.repeatCount 重复次数,-1为一直循环
5.objectAnimator属性的valueType 值类型:intType、floatType、colorType、pathType
6.objectAnimator属性的valueFrom,valueTo与valueType一起使用,从某个值到某个值。
7.interpolator 插值器,数据变化速率控制器
8.propertyName 属性名称,使用此动画的控件需要有该名称的set方法,如properName = “size” 控件需要有对应的setSize方法。

为objectAnimator xml绑定View:

Animator animator = AnimatorInflater.loadAnimator(this, R.animator.alpha);
animator.setTarget(imageView);
animator.start();
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值