Lollipop動(dòng)畫
Lollipop為我們帶來不少動(dòng)畫,簡單而有效,靈活運(yùn)用提升APP逼格
過渡動(dòng)畫
Activity過渡動(dòng)畫包含兩部分 :
- Activity的進(jìn)入和退出
- 過渡過程中的共享元素
進(jìn)入和退出
explode (分解) :從屏幕中間進(jìn)進(jìn)或出,移動(dòng)視圖
slide (滑動(dòng)) : 從屏幕邊緣進(jìn)或出,移動(dòng)視圖
fade (淡入淡出) : 通過改變視圖的透明度來添加或者移除視圖
使用 :
初始Activity:startActivity(mIntent,ActivityOptions.makeSceneTransitionAnimation(this).toBundle());
目標(biāo)跳轉(zhuǎn)Activity :
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
getWindow().setExitTransition()
- 當(dāng)A 跳轉(zhuǎn)到 B時(shí)笤成,使A中的View退出場景的transitiongetWindow().setEnterTransition()
: 當(dāng)A 跳轉(zhuǎn)到 B時(shí)穴张,使B中的View進(jìn)入場景的transitiongetWindow().setReturnTransition()
: 當(dāng)B 返回到 A時(shí)鲁猩,使B中的View退出場景的transitiongetWindow().setReenterTransition()
: 當(dāng)B 返回到 A時(shí)腾供,使A中的View進(jìn)入場景的transition
上述設(shè)置需要在setContentView()
之前設(shè)置
一共就是上述三種模式: Explode
憔古、Slide
遮怜、 Fade
、
效果如圖:
共享元素
-
changeBounds
: 捕獲共享元素的layout bound鸿市,然后播放layout bound變化動(dòng)畫锯梁。ChangeBounds 是共享元素變換中用的最多的,因?yàn)榍昂髢蓚€(gè)activity中共享元素的大小和位置一般都是不同的焰情。 -
changeClipBounds
: 裁剪目標(biāo)視圖邊界,捕獲共享元素clip bounds陌凳,然后播放clip bounds變化動(dòng)畫。 -
changeTransform
: 捕獲共享元素的縮放(scale)與旋轉(zhuǎn)(rotation)屬性 内舟,然后播放縮放(scale)與旋轉(zhuǎn)(rotation)屬性變化動(dòng)畫合敦。 -
changeImageTransform
:捕獲共享元素(ImageView)的transform matrices 屬性,然后播放ImageViewtransform matrices 屬性變化動(dòng)畫验游。與ChangeBounds相結(jié)合充岛,這個(gè)變換可以讓ImageView在動(dòng)畫中高效實(shí)現(xiàn)大小,形狀或者ImageView.ScaleType 屬性平滑過度耕蝉。
效果圖:
- 使用
- 需要共享的View 在兩邊的布局 加上
android:transitionName="one"
里面的值是自己定的一個(gè)標(biāo)識(shí)崔梗,但是必須保持兩邊一致 - 在啟動(dòng)Activity中 找到 需要共享的控件并且設(shè)置好Tag就可以了(需要注意的傳入的只能是View)
- 在跳轉(zhuǎn)的目標(biāo)Activity中設(shè)置方法:
-
getWindow().setSharedElementEnterTransition();
: A->B,B進(jìn)入動(dòng)畫 -
getWindow().setSharedElementExitTransition();
: A->B,A退出動(dòng)畫 -
getWindow().setSharedElementReenterTransition();
: B->A,A進(jìn)入動(dòng)畫 -
getWindow().setSharedElementReturnTransition();
: B->A,B退出動(dòng)畫
startActivity(mIntent,
ActivityOptions.makeSceneTransitionAnimation(this,
Pair.create(ivImageI, "one"), // 設(shè)置共享的控件和他的Tag 就可以了
Pair.create(ivImageIi, "two"))
.toBundle());
動(dòng)畫效果
Ripple (波紋效果)
十分簡單在Xml中控件添加
- 有邊框波紋:
android:background="?android:attr/selectableItemBackground"
- 無邊框波紋:
android:background="?android:attr/selectableItemBackgroundBorderless"
這個(gè)是系統(tǒng)默認(rèn)的
自定義Ripple同樣簡單垒在,立即上手
- drawable文件夾新建一個(gè)Ripple資源文件
- 代碼如下:
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="#cb2eff" android:radius="500dp">
<item android:drawable="@color/blue_i"/>
</ripple>
android:background="@drawable/ripple_red"
- 這就是一個(gè)藍(lán)色底蒜魄,紅色波紋的點(diǎn)擊效果了
Circular Reveal
其實(shí)就是一個(gè)圓形路徑繪制。
和Animator的使用基本一致
API解析:
ViewAnimationUtils.createCircularReveal(view, centerX, centerY, startRadius, endRadius);
-
view
: 動(dòng)畫的作用目標(biāo) -
centerX
: 動(dòng)畫開始的中心點(diǎn)X坐標(biāo) -
centerY
: 動(dòng)畫開始的中心點(diǎn)Y坐標(biāo) -
startRadius
: 動(dòng)畫開始時(shí)的圓半徑 -
endRadius
: 動(dòng)畫結(jié)束時(shí)的圓的半徑
兩種應(yīng)用:
- 控件點(diǎn)擊的動(dòng)畫效果
- 頁面過渡的動(dòng)畫 : 就是給頂布局 設(shè)置 Circular 動(dòng)畫
//設(shè)置頂布局過渡動(dòng)畫
llRoot.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
//當(dāng)布局已經(jīng)完全展示出來再開始動(dòng)畫
@Override
public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
v.removeOnLayoutChangeListener(this);
Animator circularReveal = ViewAnimationUtils.createCircularReveal(
llRoot,
llRoot.getWidth() / 2,
llRoot.getHeight() / 2,
50,
1000);
circularReveal.setInterpolator(new AccelerateDecelerateInterpolator());
circularReveal.setDuration(1000);
circularReveal.start();
}
});
// 控件設(shè)置點(diǎn)擊動(dòng)畫效果
ivImageI.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//實(shí)現(xiàn)從左上角開始的扇形展開動(dòng)畫
Animator circularReveal = ViewAnimationUtils.createCircularReveal(
ivImageI,
0,
0,
0,
ivImageI.getWidth()+159);
circularReveal.setInterpolator(new AccelerateDecelerateInterpolator());
circularReveal.setDuration(1000);
circularReveal.start();
}
});
效果圖:
最后
Lollipop 中添加的動(dòng)畫效果還是十分不錯(cuò)的,而且使用也是十分簡單高效
將有需求的動(dòng)畫效果封裝在自己的基類文件中使用起來就更加順暢了
如果覺有有用权悟,可以點(diǎn)贊鼓勵(lì)一下哈O(∩_∩)O~~
附上:代碼Github