Android的Activity屏幕切換動畫(二)-左右滑動深入與實戰
https://blog.csdn.net/wangjia55/article/details/8104586
上一篇文章將了 Android的左右滑動切換(見 Android的Activity屏幕切換動畫(一)-左右滑動切換),實現過程是非常簡單,一些新手可能會向深入了了解Activity切換的原理,下麵主要對左右滑動進行深入的探討,並以項目中的一個切換效果來進一步了解。
Activity的切換效果使用的是Android的動畫效果,Android的動畫在官方有相關資料:https://developer.android.com/guide/topics/graphics/animation.html和https://developer.android.com/guide/topics/resources/animation-resource.html,Activity的切換動畫實際上是Android的View Animation(視圖動畫)中的Tween Animation效果,Tween Animation分為4種動畫效果,分別是:alpha (透明變化) translate(位置移動) scale(縮放) rotate(旋轉), 而左右滑動切換使用的是 translate(位置移動)的效果,在下一篇我們再討論一下 alpha (透明變化) 、scale(縮放)、 rotate(旋轉) 這三種效果,本篇隻將 translate(位置移動)。
Translate動畫是非常好理解,就是定義一個開始的位置和一個結束位置,定義移動時間,然後就能自動產生移動動畫。Android的translate移動方向有 橫向(X) 豎向(Y), 左右滑動使用了橫向移動效果,對於豎向(Y)的位置如下:
定義一個向上退出的動畫(從位置2 移動位置3)和從下麵進入(從位置1移動位置2)的動畫定義文件如下:
out_to_up.xml (從屏幕上麵退出)
<?xml version="1.0" encoding="utf-8"?> <translate xmlns:android="https://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="https://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_interpolator" android:fromYDelta="100%p" android:toYDelta="0%p" android:duration="1000"> </translate> |
接下來講一講translate的幾個重要的屬性:
android:interpolator: 加速器,非常有用的屬性,可以簡單理解為動畫的速度,可以是越來越快,也可以是越來越慢,或者是先快後忙,或者是均勻的速度等等,對於值如下:
@android:anim/accelerate_interpolator: 越來越快 @android:anim/decelerate_interpolator:越來越慢 @android:anim/accelerate_decelerate_interpolator:先快後慢 @android:anim/anticipate_interpolator: 先後退一小步然後向前加速 @android:anim/overshoot_interpolator:快速到達終點超出一小步然後回到終點 @android:anim/anticipate_overshoot_interpolator:到達終點超出一小步然後回到終點 @android:anim/bounce_interpolator:到達終點產生彈球效果,彈幾下回到終點 @android:anim/linear_interpolator:均勻速度。 |
android:duration: 動畫運行時間,定義在多次時間(ms)內完成動畫
android:startOffset: 延遲一定時間後運行動畫
fromXDelta: X軸方向開始位置,可以是%,也可以是具體的像素 具體見圖
toXDelta: X軸方向結束位置,可以是%,也可以是具體的像素
fromYDelta: Y軸方向開始位置,可以是%,也可以是具體的像素
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="https://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="https://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="https://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="https://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" /> |
最後更新:2017-04-02 00:06:55