1. 程式人生 > >Android 3D旋轉動畫之Camera 和 Matrix

Android 3D旋轉動畫之Camera 和 Matrix

前面兩篇博文講解的都是Android 的2D動畫效果,要想做出非常炫酷的3D動畫效果怎麼辦?android 並沒有提供3D動畫介面給使用者,所以我們得自己重寫這樣一個3D介面動畫。

效果圖:


介面如下:

/*
 * @Title: My3dAnimation.java
 * @Description: TODO<請描述此檔案是做什麼的>
 * @author: xjp
 * @data: 2014年9月15日 上午8:54:10
 * @version: V1.0
 */
package com.xjp.animator;

import android.graphics.Camera;
import android.graphics.Matrix;
import android.view.animation.Animation;
import android.view.animation.Transformation;

/**
 * TODO<請描述這個類是幹什麼的>
 * 
 * @author xjp
 * @data: 2014年9月15日 上午8:54:10
 * @version: V1.0
 */
public class My3dAnimation extends Animation {

	private final float mFromDegrees;
	private final float mToDegrees;
	private final float mCenterX;
	private final float mCenterY;
	private final float mDepthZ;
	private Camera mCamera;
	private int mDirection;
	private final static int ROTATE_X = 0;//沿著x軸旋轉
	private final static int ROTATE_Y = 1;//沿著y軸旋轉

	/**
	 * Creates a new 3D rotation on the Y axis. The rotation is defined by its
	 * start angle and its end angle. Both angles are in degrees. The rotation
	 * is performed around a center point on the 2D space, definied by a pair of
	 * X and Y coordinates, called centerX and centerY. When the animation
	 * starts, a translation on the Z axis (depth) is performed. The length of
	 * the translation can be specified, as well as whether the translation
	 * should be reversed in time.
	 * 
	 * @param direction
	 *            the direction of the 3D rotation
	 * @param fromDegrees
	 *            the start angle of the 3D rotation
	 * @param toDegrees
	 *            the end angle of the 3D rotation
	 * @param centerX
	 *            the X center of the 3D rotation
	 * @param centerY
	 *            the Y center of the 3D rotation
	 */
	public My3dAnimation(int direction, float fromDegrees, float toDegrees,
			float centerX, float centerY, float depthZ) {
		mDirection = direction;
		mFromDegrees = fromDegrees;
		mToDegrees = toDegrees;
		mCenterX = centerX;
		mCenterY = centerY;
		mDepthZ = depthZ;
	}

	@Override
	public void initialize(int width, int height, int parentWidth,
			int parentHeight) {
		super.initialize(width, height, parentWidth, parentHeight);
		mCamera = new Camera();
	}

	@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 (centerX!=0){
			if (interpolatedTime < 0.5) {
				camera.translate(0.0f, 0.0f, mDepthZ * interpolatedTime);
			} else {
				camera.translate(0.0f, 0.0f, mDepthZ * (1.0f - interpolatedTime));
			}
		}
		
		switch (mDirection) {
		case ROTATE_X:
			camera.rotateX(degrees);
			break;
		case ROTATE_Y:
			camera.rotateY(degrees);
			break;
		}

		camera.getMatrix(matrix);
		camera.restore();
		matrix.preTranslate(-centerX, -centerY);
		matrix.postTranslate(centerX, centerY);
	}
}

示例程式碼如下:

package com.xjp.animator;

import com.xjp.animator.R;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.LinearInterpolator;
import android.widget.ImageView;
import android.app.Activity;

public class MainActivity extends Activity implements
		android.view.View.OnClickListener {

	private ImageView img1;
	private ImageView img2;
	private ImageView img3;
	private ViewGroup mContainer;
	private final static int ROTATE_X = 0;
	private final static int ROTATE_Y = 1;
	private My3dAnimation my3dAnimation;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		findViews();
	}

	/**
	 * TODO<請描述這個方法是幹什麼的>
	 * 
	 * @throw
	 * @return void
	 * @param
	 */
	private void findViews() {
		// TODO Auto-generated method stub
		mContainer = (ViewGroup) findViewById(R.id.container);
		mContainer
				.setPersistentDrawingCache(ViewGroup.PERSISTENT_ANIMATION_CACHE);

		img1 = (ImageView) findViewById(R.id.img_left);
		img1.setOnClickListener(this);
		img2 = (ImageView) findViewById(R.id.img_right);
		img2.setOnClickListener(this);

		img3 = (ImageView) findViewById(R.id.img_3);
		img3.setOnClickListener(this);
	}

	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		float centerX = v.getWidth() / 2.0f;
		float centerY = v.getHeight() / 2.0f;
		if (v.getId() == R.id.img_left) {
			my3dAnimation = new My3dAnimation(ROTATE_X, 0, 180, centerX,
					centerY, 310f);
		}
		if (v.getId() == R.id.img_right) {
			my3dAnimation = new My3dAnimation(ROTATE_Y, 0, 180, centerX,
					centerY, 310f);
		}
		if (v.getId() == R.id.img_3) {
			centerX = 0;
			my3dAnimation = new My3dAnimation(ROTATE_Y, 0, 20, centerX,
					centerY, 310f);
		}
		my3dAnimation.setDuration(1000);
		my3dAnimation.setInterpolator(new LinearInterpolator());
		my3dAnimation.setFillAfter(true);
		v.startAnimation(my3dAnimation);
	}
}
<a target=_blank href="https://github.com/xujinping/D3AnimaDemo">原始碼地址</a>
完結。

相關推薦

Android 3D旋轉動畫Camera Matrix

前面兩篇博文講解的都是Android 的2D動畫效果,要想做出非常炫酷的3D動畫效果怎麼辦?android 並沒有提供3D動畫介面給使用者,所以我們得自己重寫這樣一個3D介面動畫。 效果圖: 介面如下: /* * @Title: My3dAnimation.java

Android 3D旋轉動畫效果

這篇文章主要介紹一下如何實現View的3D旋轉效果,實現的主要原理就是圍繞Y軸旋轉,同時在Z軸方面上有一個深入的縮放。 演示的demo主要有以下幾個重點: 1,自定義旋轉動畫 2,動畫做完後,重置ImageView 先看一下程式的執行效果:

Android 3D旋轉動畫——Rotate3dAnimation

在Android中如果想要實現3D效果一般有兩種選擇,一是使用Open GL ES,二是使用Camera。Open GL ES使用起來太過複雜,一般是用於比較高階的3D特效或遊戲,像比較簡單的一些3D效果,使用Camera就足夠了。 Camera中提供了三種旋轉方法,分

Android動畫InterpolatorAnimationSet(三)

AnimationSet可以加入Animation,加入之後設定AnimationSet對加入的所有Animation都有效。 AnimationSet anim=new AnimationSet(t

Android 旋轉動畫,停止持續旋轉

<rotate android:duration="2000" android:fromDegrees="0" android:interpolator="@android:anim/linear_interpolator" android

Android業務組件化GradleSonatype Nexus搭建私有maven倉庫

Android 前言: 公司的業務組件化推進的已經差不多三四個月的時間了,各個業務組件之間的解耦工作已經基本完成,各個業務組件以module的形式存在項目中,然後項目依賴本地的module,多少有點不太利於項目的並行開發維護了,本質原因就是如果是依賴本地的,必須要將依賴

Android開發詳解onTouchonClick詳解

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Android三種動畫(三)屬性動畫

 分享自Carson_Ho的簡書,這篇寫的很詳細,我就不浪費時間寫了 目錄 目錄 1. 屬性動畫出現的原因 屬性動畫(Property Animation)是在 Android 3.0(API 11)後才提供的一種全新動畫模式 那麼為什麼要提供屬性動畫

Android三種動畫(二)補間動畫

介紹說明:補間動畫是一種定義開始狀態和結束狀態,其中播放的時候還能新增設定的一種動畫,它的動畫方式有平移(TranslateAnimation)、縮放(ScaleAnimation)、旋轉(RotateAnimation)、透明度(AlphaAnimation)四個子類,四種變化,也可以將這

Android三種動畫(一)幀動畫

幀動畫介紹:就是將原有的照片一幀一幀的排列好按照一定的順序播放而達到動畫的效果 技術實現:實現的方式有兩種,一種是在資原始檔中新增圖片,一種是直接在程式碼中新增圖片 第一種:在資原始檔中新增圖片 1.在drawable裡面新建檔案frame_animation.xml&nb

HTML5 3D旋轉動畫案例

.container{ width: 200px; height: 200px; position: relative; margin:50px auto; transform: rotateY(15deg) rotateX(-15deg); transform-st

Android火車票訂購軟體註冊檔案儲存(2)

上次我們做了app啟動時的延時頁,這次我們來做登陸註冊的頁面。 xml程式碼: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.c

android自定義Viewmarginpadding的處理

說起margin和padding,想必大家都不陌生。margin就是指子控制元件與外部控制元件的距離,俗稱外邊距;padding就是指控制元件內容與控制元件邊界的距離,俗稱內邊距。當我們使用系統自帶的控制元件時,margin和padding都是生效的,因為系

Android業務元件化GradleSonatype Nexus搭建私有maven倉庫

前言:      公司的業務元件化推進的已經差不多三四個月的時間了,各個業務元件之間的解耦工作已經基本完成,各個業務元件以module的形式存在專案中,然後專案依賴本地的module,多少有點不太利於專案的並行開發維護了,本質原因就是如果是依賴本地的,必須要將依賴的module和主工程放在一個project裡

Android 3D旋轉 Layout

一款3D Layout,他可以讓任何view擁有3D效果,可以觸控展示3D效果,或者執行翻轉動畫。 廢話不多說,先上圖: 如何使用 將ThreeDLayout包裹你想要的佈局(注意:ThreeDlayout只能有一個子view)

ViewFlipper 3D旋轉動畫實現 介面切換

先來看看效果:[img]http://dl2.iteye.com/upload/attachment/0094/6152/35ad98ce-42ee-3c85-aee4-74642f902e68.png[/img]簡單介紹一下,兩個介面,以水平中線旋轉180度,切換介面。上程

Android 3D旋轉動畫庫

今天興趣來潮,擼了一個動畫特效,我把他應用在登入的介面,當然也可以用在其他地方,先來預覽一下我的特效吧 使用方法 1. 在build.gradle裡面配置如下 dependencies { compile 'com.jzp:

html5 canvas文字標籤雲3D旋轉動畫特效

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> &

Android應用效能測試CPU記憶體佔用

 最近發現自己學的很多東西沒有做好積澱的工作,也萌生了寫一些東西的念頭。本人也沒有寫部落格的習慣,下邊就寫一下手機端的效能測試。   最近公司,要我們從事對競品的效能測試,我負責CPU和記憶體的效能測試,下面就和大家來分享一下android應用程式的CPU和記憶體的效能

Android三種動畫動畫筆記

Android系統中的動畫主要可分為三類 1.幀動畫 (傳送門) 2.補間動畫(傳送門) 3.屬性動畫(傳送門) 注:下圖來源其他博主,僅此一張 1.幀動畫(Frame Animation) 幀動畫    幀動畫是一種常見的動畫形式(Frame By Fra