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

首頁(yè) > 系統(tǒng) > Android > 正文

Android實(shí)現(xiàn)3D翻轉(zhuǎn)動(dòng)畫效果

2019-10-22 18:18:11
字體:
供稿:網(wǎng)友

Android中并沒有提供直接做3D翻轉(zhuǎn)的動(dòng)畫,所以關(guān)于3D翻轉(zhuǎn)的動(dòng)畫效果需要我們自己實(shí)現(xiàn),那么我們首先來分析一下Animation 和 Transformation。

Animation動(dòng)畫的主要接口,其中主要定義了動(dòng)畫的一些屬性比如開始時(shí)間,持續(xù)時(shí)間,是否重復(fù)播放等等。而Transformation中則包含一個(gè)矩陣和alpha值,矩陣是用來做平移,旋轉(zhuǎn)和縮放動(dòng)畫的,而alpha值是用來做alpha動(dòng)畫的,要實(shí)現(xiàn)3D旋轉(zhuǎn)動(dòng)畫我們需要繼承自Animation類來實(shí)現(xiàn),我們需要重載getTransformation和applyTransformation,在getTransformation中Animation會(huì)根據(jù)動(dòng)畫的屬性來產(chǎn)生一系列的差值點(diǎn),然后將這些差值點(diǎn)傳給applyTransformation,這個(gè)函數(shù)將根據(jù)這些點(diǎn)來生成不同的Transformation。下面是

具體實(shí)現(xiàn):

package com.example.textviewtest;  import android.graphics.Camera; import android.graphics.Matrix; import android.view.animation.Animation; import android.view.animation.Transformation;  public class Rotate3dAnimation extends Animation {   // 開始角度   private final float mFromDegrees;   // 結(jié)束角度   private final float mToDegrees;   // 中心點(diǎn)   private final float mCenterX;   private final float mCenterY;   private final float mDepthZ;   // 是否需要扭曲   private final boolean mReverse;   // 攝像頭   private Camera mCamera;    public Rotate3dAnimation(float fromDegrees, float toDegrees, float centerX,       float centerY, float depthZ, boolean reverse) {     mFromDegrees = fromDegrees;     mToDegrees = toDegrees;     mCenterX = centerX;     mCenterY = centerY;     mDepthZ = depthZ;     mReverse = reverse;   }    @Override   public void initialize(int width, int height, int parentWidth,       int parentHeight) {     super.initialize(width, height, parentWidth, parentHeight);     mCamera = new Camera();   }    // 生成Transformation   @Override   protected void applyTransformation(float interpolatedTime, Transformation t) {     final float fromDegrees = mFromDegrees;     // 生成中間角度     float degrees = fromDegrees         + ((mToDegrees - fromDegrees) * interpolatedTime);      final float centerX = mCenterX;     final float centerY = mCenterY;     final Camera camera = mCamera;      final Matrix matrix = t.getMatrix();      camera.save();     if (mReverse) {       camera.translate(0.0f, 0.0f, mDepthZ * interpolatedTime);     } else {       camera.translate(0.0f, 0.0f, mDepthZ * (1.0f - interpolatedTime));     }     camera.rotateY(degrees);     // 取得變換后的矩陣     camera.getMatrix(matrix);     camera.restore();      matrix.preTranslate(-centerX, -centerY);     matrix.postTranslate(centerX, centerY);   } } 

其中包括了旋轉(zhuǎn)的開始和結(jié)束角度,中心點(diǎn)、是否扭曲、和一個(gè)Camera,這里我們主要分析applyTransformation函數(shù),其中第一個(gè)參數(shù)就是通過getTransformation函數(shù)傳遞的差指點(diǎn),然后我們根據(jù)這個(gè)差值通過線性差值算法計(jì)算出一個(gè)中間角度degrees,Camera類是用來實(shí)現(xiàn)繞Y軸旋轉(zhuǎn)后透視投影的,因此我們首先通過t.getMatrix()取得當(dāng)前的矩陣,然后通過camera.translate來對(duì)矩陣進(jìn)行平移變換操作,camera.rotateY進(jìn)行旋轉(zhuǎn)。這樣我們就可以很輕松的實(shí)現(xiàn)3D旋轉(zhuǎn)效果了。

下面是布局文件main.xml:

<LinearLayout 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:background="@drawable/main_screen_bg"   android:gravity="center_horizontal"   android:orientation="vertical"   tools:context=".MainActivity" >    <Button     android:id="@+id/next_btn"     android:layout_width="wrap_content"     android:layout_height="wrap_content"     android:layout_marginTop="20dip"     android:drawableTop="@drawable/qiangpiao_dropdown"     android:text="下一個(gè)" />    <TextView     android:id="@+id/tv"     android:layout_width="300dip"     android:layout_height="300dip"     android:layout_gravity="center"     android:background="@drawable/call_show_frame_safe"     android:gravity="center"     android:textColor="#ffffff"     android:textSize="15sp" />  </LinearLayout> 

MainActivity的代碼如下:

package com.example.textviewtest;  import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.View; import android.view.animation.AccelerateInterpolator; import android.view.animation.Animation; import android.view.animation.DecelerateInterpolator; import android.widget.Button; import android.widget.TextView;  public class MainActivity extends Activity {   private TextView tv;   private Button btn;   private int count = 1;    @Override   protected void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     setContentView(R.layout.activity_main);     tv = (TextView) findViewById(R.id.tv);     tv.setText(String.valueOf(count));     btn = (Button) findViewById(R.id.next_btn);     applyRotation(0, 90);      btn.setOnClickListener(new View.OnClickListener() {        @Override       public void onClick(View v) {         applyRotation(0, 90);       }     });    }    private void applyRotation(float start, float end) {     // 計(jì)算中心點(diǎn)     final float centerX = tv.getWidth() / 2.0f;     final float centerY = tv.getHeight() / 2.0f;      final Rotate3dAnimation rotation = new Rotate3dAnimation(start, end,         centerX, centerY, 310.0f, true);     rotation.setDuration(500);     rotation.setFillAfter(true);     rotation.setInterpolator(new AccelerateInterpolator());     // 設(shè)置監(jiān)聽     rotation.setAnimationListener(new DisplayNextView());      tv.startAnimation(rotation);   }    private final class DisplayNextView implements Animation.AnimationListener {      public void onAnimationStart(Animation animation) {     }      // 動(dòng)畫結(jié)束     public void onAnimationEnd(Animation animation) {       tv.post(new SwapViews());     }      public void onAnimationRepeat(Animation animation) {     }   }    private final class SwapViews implements Runnable {      public void run() {       final float centerX = tv.getWidth() / 2.0f;       final float centerY = tv.getHeight() / 2.0f;       Rotate3dAnimation rotation = null;        tv.requestFocus();        rotation = new Rotate3dAnimation(90, 0, centerX, centerY, 310.0f,           false);       rotation.setDuration(500);       rotation.setFillAfter(true);       rotation.setInterpolator(new DecelerateInterpolator());       // 開始動(dòng)畫       tv.startAnimation(rotation);       tv.setText(String.valueOf(count++));     }   }    @Override   public boolean onCreateOptionsMenu(Menu menu) {     getMenuInflater().inflate(R.menu.activity_main, menu);     return true;   }  } 

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持VEVB武林網(wǎng)。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到Android開發(fā)頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 台南市| 崇阳县| 法库县| 高雄县| 新平| 遵化市| 昌邑市| 吐鲁番市| 门头沟区| 常熟市| 康马县| 辽阳市| 彭泽县| 绥棱县| 武陟县| 锡林浩特市| 曲周县| 米林县| 西乌珠穆沁旗| 台北县| 铜山县| 黄大仙区| 宁安市| 深州市| 新绛县| 桦南县| 武城县| 崇仁县| 威海市| 西安市| 海阳市| 五峰| 林甸县| 北票市| 乐陵市| 汽车| 惠安县| 平顶山市| 阳城县| 巫山县| 海盐县|