国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android仿荷包APP啟動動畫

2019-10-23 19:46:38
字體:
來源:轉載
供稿:網友

用荷包App的時候發現啟動動畫做的挺好玩的,于是便模仿實現了一下。

gif效果圖:

Android仿荷包啟動動畫,Android仿荷包APP啟動動畫,Android啟動動畫

animation.gif

實現思路:

仔細觀察,可以看出動畫的執行分為兩個階段:
第一階段為硬幣掉落。
第二階段為錢包反彈。

布局xml文件如下:

<?xml version="1.0" encoding="utf-8"?><FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"       xmlns:tools="http://schemas.android.com/tools"       android:layout_width="match_parent"      android:layout_height="match_parent"      android:orientation="vertical"      tools:context=".MainActivity">  <ImageView    android:id="@+id/coin_iv"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:layout_gravity="center"    android:src="@mipmap/coin"/>  <ImageView    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:layout_gravity="center"    android:layout_marginBottom="70dp"    android:layout_marginLeft="70dp"    android:src="@mipmap/version"/>  <ImageView    android:id="@+id/wallet_iv"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:layout_gravity="center"    android:src="@mipmap/wallet"/>  <Button    android:id="@+id/start_btn"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:layout_gravity="center|bottom"    android:layout_marginBottom="10dp"    android:text="start"/></FrameLayout>

硬幣掉落:

硬幣掉落的過程中執行兩種動畫,位移和旋轉。
位移動畫使用了補間動畫,xml文件如下:

<?xml version="1.0" encoding="utf-8"?><translate  xmlns:android="http://schemas.android.com/apk/res/android"  android:fromYDelta="-50%p"  android:interpolator="@android:anim/accelerate_interpolator"  android:toYDelta="0%"/>

旋轉動畫采用了重寫Animation并利用android.hardware.Camera類來實現。

public class ThreeDRotateAnimation extends Animation {  int centerX, centerY;  Camera camera = new Camera();   @Override  public void initialize(int width, int height, int parentWidth, int parentHeight) {    super.initialize(width, height, parentWidth, parentHeight);    // 中心點坐標  centerX = width / 2;    centerY = height / 2;   setDuration(500);    setInterpolator(new LinearInterpolator());  }  @Override  protected void applyTransformation(float interpolatedTime, Transformation t) {    final Matrix matrix = t.getMatrix();  camera.save();   // 繞y軸旋轉  camera.rotateY(360 * interpolatedTime);    camera.getMatrix(matrix);    // 設置翻轉中心點   matrix.preTranslate(-centerX, -centerY);   matrix.postTranslate(centerX, centerY);     camera.restore();   }}

這里簡單說下animation里面的preTranslate和postTranslate方法,preTranslate是指在rotateY前平移,postTranslate是指在rotateY后平移,注意他們參數是平移的距離,而不是平移目的地的坐標!
由于旋轉是以(0,0)為中心的,所以為了把硬幣的中心與(0,0)對齊,就要preTranslate(-centerX, -centerY), rotateY完成后,調用postTranslate(centerX, centerY),再把圖片移回來,這樣看到的動畫效果就是硬幣從中心不停的旋轉了。
最后同時執行以上兩種動畫,實現掉落旋轉效果。

private void startCoin() {// 掉落Animation animationTranslate = AnimationUtils.loadAnimation(this,R.anim.anim_top_in);// 旋轉ThreeDRotateAnimation animation3D = new ThreeDRotateAnimation();animation3D.setRepeatCount(10);AnimationSet animationSet = new AnimationSet(true);animationSet.setDuration(800);animationSet.addAnimation(animation3D);animationSet.addAnimation(animationTranslate);mCoinIv.startAnimation(animationSet);}

錢包反彈:

在執行硬幣掉落的同時,啟動一個ValueAnimator動畫,來判斷錢包反彈的時機。

private void setWallet() {final ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, 1);valueAnimator.setDuration(800);valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {   @Override  public void onAnimationUpdate(ValueAnimator animation) {    float fraction = animation.getAnimatedFraction();    // 大概掉落到錢包的上邊緣位置的時候,取消ValueAnimator動畫,并執行錢包反彈效果    if (fraction >= 0.75) {      valueAnimator.cancel();      startWallet();    }   }});valueAnimator.start();}

最后執行錢包反彈效果動畫,這里采用了ObjectAnimator 。

private void startWallet() {  // x軸縮放  ObjectAnimator objectAnimator1 = ObjectAnimator.ofFloat(mLogoIv, "scaleX", 1, 1.1f, 0.9f, 1);  objectAnimator1.setDuration(600);  // y軸縮放   ObjectAnimator objectAnimator2 = ObjectAnimator.ofFloat(mLogoIv, "scaleY", 1, 0.75f, 1.25f, 1);  objectAnimator2.setDuration(600);  AnimatorSet animatorSet = new AnimatorSet();  animatorSet.setInterpolator(new LinearInterpolator());   // 同時執行x,y軸縮放動畫   animatorSet.playTogether(objectAnimator1, objectAnimator2);  animatorSet.start();}

這樣一個簡單的荷包啟動動畫效果就差不多出來了,唯一遺憾的是對錢包進行y軸縮放的時候會對整個y軸進行縮放,要想保持錢包底部不動,只有錢包上部反彈,暫時還沒有想到什么好的方法,小弟不才還望大神賜教!謝謝!

完整源碼:

完整源碼在GitHub
如果覺得還不錯,記得star╰( ̄▽ ̄)╮喲~

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 德昌县| 贵港市| 福海县| 明光市| 岳池县| 肥城市| 淮滨县| 卓资县| 基隆市| 洛浦县| 通城县| 霸州市| 赤壁市| 宜川县| 科技| 四子王旗| 太仆寺旗| 塔城市| 游戏| 彩票| 南安市| 罗源县| 额敏县| 尚志市| 广宁县| 洛南县| 辽阳市| 剑阁县| 屏东市| 偃师市| 和政县| 沁源县| 罗田县| 宜昌市| 保康县| 秀山| 额济纳旗| 江孜县| 集贤县| 老河口市| 洪雅县|