欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android编程实现3D滑动旋转效果的方法

程序员文章站 2023-11-30 22:17:34
本文实例讲述了android编程实现3d滑动旋转效果的方法。分享给大家供大家参考,具体如下: 这里我们通过代码实现一些滑动翻页的动画效果。 animation实现动画有...

本文实例讲述了android编程实现3d滑动旋转效果的方法。分享给大家供大家参考,具体如下:

这里我们通过代码实现一些滑动翻页的动画效果。

animation实现动画有两个方式:帧动画(frame-by-frame animation)和补间动画(tweened animation)

本示例通过继承animation自定义rotate3d,实现3d翻页效果。效果图如下:

Android编程实现3D滑动旋转效果的方法

1、rotate3d(animation)

首先,自定义animation的3d动画类rotate3d

public class rotate3d extends animation { 
  private float fromdegree;  // 旋转起始角度 
  private float todegree;   // 旋转终止角度 
  private float mcenterx;   // 旋转中心x 
  private float mcentery;   // 旋转中心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;  // 旋转角度(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); // 旋转 
      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); 
  } 
}

然后,实例化rotate3d的旋转方向

public void initanimation() { 
  // 获取旋转中心 
  displaymetrics dm = new displaymetrics(); 
  dm = getresources().getdisplaymetrics(); 
  mcenterx = dm.widthpixels / 2; 
  mcentery = dm.heightpixels / 2; 
  // 定义旋转方向 
  int duration = 1000; 
  lquest1animation = new rotate3d(0, -90, mcenterx, mcentery);  // 下一页的【question1】旋转方向(从0度转到-90,参考系为水平方向为0度) 
  lquest1animation.setfillafter(true); 
  lquest1animation.setduration(duration); 
  lquest2animation = new rotate3d(90, 0, mcenterx, mcentery);   // 下一页的【question2】旋转方向(从90度转到0,参考系为水平方向为0度)(起始第一题) 
  lquest2animation.setfillafter(true); 
  lquest2animation.setduration(duration); 
  rquest1animation = new rotate3d(0, 90, mcenterx, mcentery);   // 上一页的【question1】旋转方向(从0度转到90,参考系为水平方向为0度) 
  rquest1animation.setfillafter(true); 
  rquest1animation.setduration(duration); 
  rquest2animation = new rotate3d(-90, 0, mcenterx, mcentery);  // 上一页的【question2】旋转方向(从-90度转到0,参考系为水平方向为0度) 
  rquest2animation.setfillafter(true); 
  rquest2animation.setduration(duration); 
}

2、activity

首先,定义两个布局文件,用于旋转的画面切换

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>

限于篇幅,完整布局文件请详见源码 ^_^

然后,初始化两个旋转的布局文件资源

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); 
}

最后,设置布局文件中的按钮监听事件,响应3d旋转动画和方向

private view.onclicklistener listener = new view.onclicklistener() { 
  @override 
  public void onclick(view v) { 
    switch (v.getid()) { 
    case r.id.main_last:  // 上一页 
      layoutmain.startanimation(lquest1animation);  // 当前页向左旋转(0,-90) 
      initnext(); 
      layoutnext.startanimation(lquest2animation);  // 下一页向左旋转(90, 0) 
      break; 
    case r.id.main_next:  // 下一页 
      layoutmain.startanimation(rquest1animation);  // 当前页向右旋转(0,90) 
      initnext(); 
      layoutnext.startanimation(rquest2animation);  // 下一页向右旋转(-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; 
    } 
  } 
};

完整实例代码代码点击此处本站下载

希望本文所述对大家android程序设计有所帮助。