android左右旋转动画效果图,Android新姿势:3D翻转效果原理
首先,android里是沒有3D翻轉的動畫效果的,但是呢,android有提供一個Camera的類,可以利用這個類來實現。
先看代碼,Rotate3d是繼承了Animation的一個動畫類,多余的代碼我就不給出了,只看applyTransformation方法內是怎么實現的。
public class Rotate3d extends Animation {
...
@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();
// 左右翻轉
camera.rotateY(degrees);
// 取得變換后的矩陣
camera.getMatrix(matrix);
camera.restore();
matrix.preTranslate(-centerX, -centerY);
matrix.postTranslate(centerX, centerY);
}
...
}
接下來解析下原理。
1、先獲取視圖的Matrix:
final Matrix matrix = t.getMatrix();
2、利用camera改變matrix的參數:
camera.rotateY(degrees);//翻轉一定的角度
camera.getMatrix(matrix);//改變matrix
PS:注意這里是用getMatrix的方法來改變,順便普及一下小知識,java的方法傳入的參數如果是對象的話,是可以在方法內改變對象的屬性值的;不過如果傳入的是一個int、float、String之類的基礎類型,則不會改變。舉例:
假如有個方法 set(int i){ i++; } 然后用了 int i=3; set(i); 這時打印出的 i 還是3。
但是 假如有個方法 set(C c){ c.i++; } 然后用了 c = new C(); c.i=3; set(c); 這時打印出 c 對象的 i 就是4了。
3、繼續,一般上面的步驟已經可以見到3D翻轉效果了,但是很難看,因為這種翻轉是沒有中心點的,接下來就是將翻轉后的視圖弄到一個位置上去(其實這么說也不太對)。
matrix.preTranslate(-centerX, -centerY);
matrix.postTranslate(centerX, centerY);
這個的話其實我也研究了好久最后沒研究出個所以然來,反正記住這樣寫就可以設置以某個坐標為中心進行翻轉了。
---------------------------我叫分割線--------------------------
最近搞的一個項目需要用到有3D翻轉效果的gallery,卡了我好久。
上面給出的代碼是制作一個3D翻轉的動畫效果,但是如果要在gallery中用到這種動畫效果的話自然不行。主要是翻轉角度的計算問題。
animation動畫類中可以根據動畫發生的時間點來計算角度,而gallery就不行,因為gallery是隨手勢滑動發生動畫的,時間不固定,還可以左右來回滑動。
不過只要解決了角度的問題,3D翻轉效果自然不是問題。先看代碼。
@Override
protected boolean getChildStaticTransformation(View child, Transformation t) {
final float centerX = App.width / 2;
final float centerY = App.height / 2;
final Camera camera = mCamera;
camera.save();
float rotate = -child.getLeft() * 90 / 480;
camera.rotateY(rotate);
camera.getMatrix(t.getMatrix());
camera.restore();
t.getMatrix().preTranslate(-centerX, -centerY);
t.getMatrix().postTranslate(centerX, centerY);
return true;
}
這是重寫gallery的一個方法,具體的角度計算,其實就是根據當前視圖View child與左屏幕的距離來計算(也可以當成是x坐標)。
好~效果出來了!還是挺有成就感的~~ >v<
總結
以上是生活随笔為你收集整理的android左右旋转动画效果图,Android新姿势:3D翻转效果原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: s41-70怎么u盘启动 联想S41-7
- 下一篇: 疯狂android源码中文乱码无gbk,