Android編程實(shí)現(xiàn)3D滑動旋轉(zhuǎn)效果的方法
本文實(shí)例講述了Android編程實(shí)現(xiàn)3D滑動旋轉(zhuǎn)效果的方法。分享給大家供大家參考,具體如下:
這里我們通過代碼實(shí)現(xiàn)一些滑動翻頁的動畫效果。
Animation實(shí)現(xiàn)動畫有兩個方式:幀動畫(frame-by-frame animation)和補(bǔ)間動畫(tweened animation)
本示例通過繼承Animation自定義Rotate3D,實(shí)現(xiàn)3D翻頁效果。效果圖如下:

1、Rotate3D(Animation)
首先,自定義Animation的3D動畫類Rotate3D
public class Rotate3D extends Animation {
private float fromDegree; // 旋轉(zhuǎn)起始角度
private float toDegree; // 旋轉(zhuǎn)終止角度
private float mCenterX; // 旋轉(zhuǎn)中心x
private float mCenterY; // 旋轉(zhuǎn)中心y
private Camera mCamera;
public Rotate3D(float fromDegree, float toDegree, float centerX, float centerY) {
this.fromDegree = fromDegree;
this.toDegree = toDegree;
this.mCenterX = centerX;
this.mCenterY = centerY;
}
@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 FromDegree = fromDegree;
float degrees = FromDegree + (toDegree - fromDegree) * interpolatedTime; // 旋轉(zhuǎn)角度(angle)
final float centerX = mCenterX;
final float centerY = mCenterY;
final Matrix matrix = t.getMatrix();
if (degrees <= -76.0f) {
degrees = -90.0f;
mCamera.save();
mCamera.rotateY(degrees); // 旋轉(zhuǎn)
mCamera.getMatrix(matrix);
mCamera.restore();
} else if (degrees >= 76.0f) {
degrees = 90.0f;
mCamera.save();
mCamera.rotateY(degrees);
mCamera.getMatrix(matrix);
mCamera.restore();
} else {
mCamera.save();
mCamera.translate(0, 0, centerX); // 位移x
mCamera.rotateY(degrees);
mCamera.translate(0, 0, -centerX);
mCamera.getMatrix(matrix);
mCamera.restore();
}
matrix.preTranslate(-centerX, -centerY);
matrix.postTranslate(centerX, centerY);
}
}
然后,實(shí)例化Rotate3D的旋轉(zhuǎn)方向
public void initAnimation() {
// 獲取旋轉(zhuǎn)中心
DisplayMetrics dm = new DisplayMetrics();
dm = getResources().getDisplayMetrics();
mCenterX = dm.widthPixels / 2;
mCenterY = dm.heightPixels / 2;
// 定義旋轉(zhuǎn)方向
int duration = 1000;
lQuest1Animation = new Rotate3D(0, -90, mCenterX, mCenterY); // 下一頁的【question1】旋轉(zhuǎn)方向(從0度轉(zhuǎn)到-90,參考系為水平方向?yàn)?度)
lQuest1Animation.setFillAfter(true);
lQuest1Animation.setDuration(duration);
lQuest2Animation = new Rotate3D(90, 0, mCenterX, mCenterY); // 下一頁的【question2】旋轉(zhuǎn)方向(從90度轉(zhuǎn)到0,參考系為水平方向?yàn)?度)(起始第一題)
lQuest2Animation.setFillAfter(true);
lQuest2Animation.setDuration(duration);
rQuest1Animation = new Rotate3D(0, 90, mCenterX, mCenterY); // 上一頁的【question1】旋轉(zhuǎn)方向(從0度轉(zhuǎn)到90,參考系為水平方向?yàn)?度)
rQuest1Animation.setFillAfter(true);
rQuest1Animation.setDuration(duration);
rQuest2Animation = new Rotate3D(-90, 0, mCenterX, mCenterY); // 上一頁的【question2】旋轉(zhuǎn)方向(從-90度轉(zhuǎn)到0,參考系為水平方向?yàn)?度)
rQuest2Animation.setFillAfter(true);
rQuest2Animation.setDuration(duration);
}
2、Activity
首先,定義兩個布局文件,用于旋轉(zhuǎn)的畫面切換
main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/layout_main" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical"> ... </LinearLayout>
next.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/layout_next" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical"> ... </LinearLayout>
限于篇幅,完整布局文件請?jiān)斠娫创a ^_^
然后,初始化兩個旋轉(zhuǎn)的布局文件資源
private void initMain(){
setContentView(R.layout.main);
layoutmain = (LinearLayout)findViewById(R.id.layout_main);
btn_MainLast = (Button)findViewById(R.id.main_last);
btn_MainNext = (Button)findViewById(R.id.main_next);
btn_MainLast.setOnClickListener(listener);
btn_MainNext.setOnClickListener(listener);
}
private void initNext(){
setContentView(R.layout.next);
layoutnext = (LinearLayout)findViewById(R.id.layout_next);
btn_NextLast = (Button)findViewById(R.id.next_last);
btn_NextNext = (Button)findViewById(R.id.next_next);
btn_NextLast.setOnClickListener(listener);
btn_NextNext.setOnClickListener(listener);
}
最后,設(shè)置布局文件中的按鈕監(jiān)聽事件,響應(yīng)3D旋轉(zhuǎn)動畫和方向
private View.OnClickListener listener = new View.OnClickListener() {
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.main_last: // 上一頁
layoutmain.startAnimation(lQuest1Animation); // 當(dāng)前頁向左旋轉(zhuǎn)(0,-90)
initNext();
layoutnext.startAnimation(lQuest2Animation); // 下一頁向左旋轉(zhuǎn)(90, 0)
break;
case R.id.main_next: // 下一頁
layoutmain.startAnimation(rQuest1Animation); // 當(dāng)前頁向右旋轉(zhuǎn)(0,90)
initNext();
layoutnext.startAnimation(rQuest2Animation); // 下一頁向右旋轉(zhuǎn)(-90, 0)
break;
case R.id.next_last:
layoutnext.startAnimation(lQuest1Animation);
initMain();
layoutmain.startAnimation(lQuest2Animation);
break;
case R.id.next_next:
layoutnext.startAnimation(rQuest1Animation);
initMain();
layoutmain.startAnimation(rQuest2Animation);
break;
}
}
};
完整實(shí)例代碼代碼點(diǎn)擊此處本站下載。
希望本文所述對大家Android程序設(shè)計(jì)有所幫助。
- Android實(shí)現(xiàn)3D翻轉(zhuǎn)動畫效果
- Android實(shí)現(xiàn)3D推拉門式滑動菜單源碼解析
- Android高級圖片滾動控件實(shí)現(xiàn)3D版圖片輪播器
- Android酷炫動畫效果之3D星體旋轉(zhuǎn)效果
- Android使用Rotate3dAnimation實(shí)現(xiàn)3D旋轉(zhuǎn)動畫效果的實(shí)例代碼
- Android編程實(shí)現(xiàn)3D立體旋轉(zhuǎn)效果的實(shí)例代碼
- Android動畫之3D翻轉(zhuǎn)效果實(shí)現(xiàn)函數(shù)分析
- Android 3D旋轉(zhuǎn)動畫效果實(shí)現(xiàn)分解
- Android 使用Gallery實(shí)現(xiàn)3D相冊(附效果圖+Demo源碼)
- Android TV開發(fā):實(shí)現(xiàn)3D仿Gallery效果的實(shí)例代碼
相關(guān)文章
Android?懸浮按鈕之實(shí)現(xiàn)兔兔按鈕示例
這篇文章主要為大家介紹了Android?懸浮按鈕之實(shí)現(xiàn)兔兔按鈕示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02
Android自定義實(shí)現(xiàn)BaseAdapter的優(yōu)化布局
這篇文章主要為大家詳細(xì)介紹了Android自定義實(shí)現(xiàn)BaseAdapter的優(yōu)化布局,感興趣的小伙伴們可以參考一下2016-08-08
Android淺析viewBinding和DataBinding
這篇文章主要介紹了Android淺析viewBinding和DataBinding,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-09-09
30分鐘搞清楚Android Touch事件分發(fā)機(jī)制
30分鐘搞清楚Android Touch事件分發(fā)機(jī)制,Touch事件分發(fā)中只有兩個主角:ViewGroup和View,想要深入學(xué)習(xí)的朋友可以參考本文2016-03-03
Android簽名文件轉(zhuǎn)化為pk8和pem的實(shí)現(xiàn)
這篇文章主要介紹了Android簽名文件轉(zhuǎn)化為pk8和pem的實(shí)現(xiàn),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03
Android通話默認(rèn)打開揚(yáng)聲器的方法
這篇文章主要介紹了Android通話默認(rèn)打開揚(yáng)聲器的方法.小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-08-08
Android開發(fā)之滑動數(shù)值選擇器NumberPicker用法示例
這篇文章主要介紹了Android開發(fā)之滑動數(shù)值選擇器NumberPicker用法,結(jié)合實(shí)例形式分析了Android滑動數(shù)值選擇器NumberPicker的功能、相關(guān)函數(shù)、事件監(jiān)聽、界面布局等操作技巧,需要的朋友可以參考下2019-03-03
Android實(shí)現(xiàn)彩信附件的添加與刪除功能
這篇文章主要介紹了Android實(shí)現(xiàn)彩信附件的添加與刪除功能,涉及Android針對常見多媒體文件的操作技巧,具有一定參考借鑒價值,需要的朋友可以參考下2016-06-06

