1. 程式人生 > >安卓學習筆記之-camera實現圖片的3D旋轉

安卓學習筆記之-camera實現圖片的3D旋轉

</pre>這幾天寫了一個關於圖片的3D旋轉的動畫效果,在寫這個動畫的時候,我遇到了許多的問題,在這期間我查詢了許多資料,弄懂了一些東西,也有一些東西沒有弄懂。比如:<p></p><p><span style="font-size:24px">matrix.preTranslate(-centerX, -centerY);matrix.postTranslate(centerX, centerY);</span></p><p><span style="font-size:24px"></span></p><p><span style="font-size:24px">這兩句的原理我到現在也沒有弄懂。下面我就開始說我已經弄懂了的東西:</span></p><p><span style="font-size:24px">先上程式碼:</span></p><p><span style="font-size:24px"></span></p><pre name="code" class="java" style="font-size: 24px;">public void initialize(int width, int height, int parentWidth,
		int parentHeight) {
	// TODO Auto-generated method stub
		super.initialize(width, height, parentWidth, parentHeight);
		centerX = width /2;
		centerY = height/2;
		setDuration(DURATION);
		camera = new Camera();
	
	}
這個函式是一個回撥函式,顧名思義,初始化initalize ,在一個圖片呼叫動畫的時候,系統會自動的回撥這個函式,將圖片的基本資訊傳入其中。比如圖片的寬高。
public boolean getTransformation(long currentTime,
		Transformation outTransformation) {
		// TODO Auto-generated method stub
		return super.getTransformation(currentTime, outTransformation);
	}
在就是transformation函式,transformation代表的是圖片的矩陣還有alpha值,使用這個函式得到圖片的矩陣。

最後最重要的就是

protected void applyTransformation(float interpolatedTime, Transformation t) {
	// TODO Auto-generated method stub
		super.applyTransformation(interpolatedTime, t);
		float from = 0.0f,to = 180.0f;
		//翻轉角度 interpolatedTime 基本上就是進度的意思
		float degree = from + (to - from)*interpolatedTime;
		if(degree == 180){
			return ;
		}
		if(interpolatedTime > 0.5f){
			//動畫進度過半,將角度調整,以防出現映象效果
			degree = degree - 180;
		}
		float depth = (0.5f - Math.abs(interpolatedTime - 0.5f))*DEPTH_Z; //深度
		
		final Matrix matrix  = t.getMatrix();
		camera.save();
		camera.translate(0.0f, 0.0f, depth);
		camera.rotateY(DEPTH_Z);
		camera.getMatrix(matrix);
		camera.restore();
		
		//確保圖片的翻轉過程一直處於中心點
		matrix.preTranslate(-centerX, -centerY);
		matrix.postTranslate(centerX, centerY);
		
		//動畫進度值
		if(listener != null){
			listener.interpolatedTime(interpolatedTime);
		}
		
	}

這個applyTransformation 函式使是繼承animation最重要的功能,通過重寫animation可以靈活的設計自己的動畫。

camera.translate(0.0f, 0.0f, depth);
這行程式碼  camera 類 的 translate 功能,是對影象進行平移  , 引數分別是  X,Y,Z, Z軸代表的是景色的深淺。因為applyTransformation 是在不停的呼叫,所以  interpolate 的值也在不停的變化,這樣 depth 的值也是不停的變化,所以使用 canera 中的 rotate 對其進行旋轉 。 最後得到最終的矩陣的值, 呼叫 restore 儲存起來。

相關推薦

學習筆記-camera實現圖片3D旋轉

</pre>這幾天寫了一個關於圖片的3D旋轉的動畫效果,在寫這個動畫的時候,我遇到了許多的問題,在這期間我查詢了許多資料,弄懂了一些東西,也有一些東西沒有弄懂。比如:<p></p><p><span style="fon

學習筆記-網路世界的探究

安卓學習筆記之-網路世界的探究 WebView的用法 1…webView:功能就是在自己的應用程式上嵌入一個瀏覽器,不用啟動瀏覽器的控制元件。 2…webView.getSettings()方法可以去設定瀏覽器的屬性。如 setJavaScripEnable()方法來實現webVie

學習筆記Fragment.

一套類似手機QQ的介面 1。現在activity_main.xml中使用一個如果做動態新增就不要在裡面寫任何內容在後面的子碎片中編寫。如果做靜態就可以直接在裡面寫。緊接著把剛進入時的主介面設計在這個xml中。 2.然後開始分 別建立對應的子佈局建幾個根據你所做的

學習筆記———五大布局

首先介紹一下安卓的五大布局分別是什麼? 線性佈局(LinearLayout) 相對佈局(RelativeLayout) 幀佈局(FrameLayout) 表格佈局(TableLayout) 絕對佈局

學習筆記理解Window與WindowManager

Window的概念 對於Android的Window而言,實際上是一個相對抽象的概念。從Window的定義可以看出,Window是對窗體的一種抽象,是頂級Window的外觀與行為策略。目前僅有的實現類是PhoneWindow,可以使用它來建立Window(對系

學習筆記 -- (安裝環境) Android Studio安裝配置、環境搭建詳細步驟及基本使用 Android Studio和SDK官方開發工具下載 Android Studio教程從入門到精通 Android開發-第一個程式:HelloWorld!

1、下載Android Studio安裝配置、環境搭建詳細步驟及基本使用    https://www.cnblogs.com/yanglh6-jyx/p/Android_AS_Configuration.html https://blog.csdn.net/k491022087/ar

算法(第四版)學習筆記java實現可以動態調整數組大小的棧

length pub move sta gen font -c @override lifo 下壓(LIFO)棧:可以動態調整數組大小的實現 import java.util.Iterator; public class ResizingArrayStack&l

機器學習入門python實現圖片簡單分類

numbers org 路徑 圖片分類 jpg animal 入門 res windows 小任務:實現圖片分類 1.圖片素材 python批量壓縮jpg圖片: PIL庫 resize http://blog.csdn.net/u012234115/article/

學習筆記自定義介面卡

BaseAdapter:是所有介面卡類的父類,可以對列表項進行最大限度的定製 1.1 自定義介面卡中的方法 getCount getView getItem getItemId 1.2 LayoutInflater(佈局解析器) –LayoutInflater有三種獲得

專案實戰CoordinatorLayout實現頁面特效(一)

效果圖如下: material design控制元件簡介: 轉載自:https://blog.csdn.net/gitzzp/article/details/52573068 CoordinatorLayout CoordinatorLayout:協調者佈局。它是support

學習筆記---讓WebView不可滑動(上下左右)

遇到一個需求,原來WebView是可以自動滑動的,但是現在說讓不能WebView的上下左右滑動,就是固定的,檢視到 WebView有幾個與滾動有關的方法,設定之後,但是都無效。如:        

學習筆記】Android Studio第3課——EditText控制元件

EditText和TextView很相似,主要不同的是EditText是使用者可以在上面編輯本文的,而TextView只能用app本身去改變和顯示。做了一個簡單的登入介面:xml程式碼如下<?xml version="1.0" encoding="utf-8"?>

機器學習學習筆記--使用Keras實現圖片預測

Keras 是一個基於 Python 的高層神經網路庫,其可以使用 Tensorflow、Theano 以及 CNTK 等著名深度學習框架作為後端。 最好在Linux Ubuntu下操作,搭建環境,這樣可以省很大功夫。這裡我基於windows10下操作。 使用工具:Py

個人學習筆記---第一個Android應用程式

今天是學習Android的第二天,昨天我們主要學習瞭如何配置Android開發環境和第一個Android程式,HELLOWORLD。但是並沒有解釋清楚,我們現在來看一下,適用Eclipse開發Android應用大致需要的步驟: 1.建立1個Android專案 2.在XML佈局

學習筆記(LinearLayout屬性android:orientation)

一. LinearLayout(線性佈局)         <1. LinearLayout又稱作線性佈局,是一種非常常用的佈局。 這個佈局會將它所包含的控制元件按線性排列。預設為horizon

學習筆記(10)-自定義彈出式對話方塊

​ 之前學習彈出式對話方塊的時候,我們可以在AlertDialog中放置我們自己設計的佈局內容,如TextView,EditView,多選框,單選框等等,但是按鈕使用的都是其自帶的PositiveButton和NegativeButton,最多可使用三個按鈕

演算法(第四版)學習筆記java實現能夠動態調整陣列大小的棧

下壓(LIFO)棧:能夠動態調整陣列大小的實現 import java.util.Iterator; public class ResizingArrayStack<Item> impl

學習筆記(一)——執行緒的用法及怎樣在子執行緒中更新UI

建立執行緒方法: 1、新建一個繼承自Thread的類MyThread,然後重寫父類的run()方法,在裡面寫要執行的內容; class MyThread extends Thread { @Ove

開發筆記——多種方式實現底部選單欄(仿微信介面)

關於底部選單是什麼,我想沒必要介紹了,在市場上的APP裡太常見了,這裡提供兩種方式來實現。 記得之前寫過幾篇關於底部選單實現的方法,有興趣的朋友可以看看: 今天帶來種相對更通俗易懂的寫法,不再和過去一樣去沿用TabHost了,這次我們直接用LinearLa

學習筆記-AsyncTask

AsyncTask是安卓提供的輕量級的非同步類,可以直接繼承AsyncTask,在類中實現非同步操作,並提供介面反饋當前非同步執行的程度(可以通過介面實現UI進度更新),最後反饋執行的結果給UI主執行緒。使用的優點:簡單,快捷,過程可控使用的缺點:在使用多個非同步操作和需要進