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

首頁 > 系統 > Android > 正文

Android仿荷包APP啟動動畫

2019-12-12 03:41:59
字體:
來源:轉載
供稿:網友

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

gif效果圖:


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

主站蜘蛛池模板: 星子县| 呼伦贝尔市| 孝义市| 井研县| 苍南县| 淮南市| 绥滨县| 安塞县| 烟台市| 凤城市| 乌什县| 铁力市| 新宾| 平远县| 深水埗区| 桂平市| 晋中市| 湖州市| 黎城县| 岳阳市| 无为县| 北海市| 宝坻区| 大足县| 徐州市| 确山县| 津市市| 墨竹工卡县| 南阳市| 泸州市| 黄平县| 阿勒泰市| 牙克石市| 泰和县| 香港 | 阿尔山市| 汝南县| 保山市| 佛坪县| 灵璧县| 高邑县|