Android使用Rotate3dAnimation实现3D旋转动画效果的实例代码

利用Android的ApiDemos的Rotate3dAnimation实现了个图片3D旋转的动画,围绕Y轴进行旋转,还可以实现Z轴的缩放。点击开始按钮开始旋转,点击结束按钮停止旋转。

代码如下::

Rotate3dAnimation.java

public class Rotate3dAnimation extends Animation {
 private final float mFromDegrees;
 private final float mToDegrees;
 private final float mCenterX;
 private final float mCenterY;
 private final float mDepthZ;
 private final boolean mReverse;
 private Camera mCamera;
 /**
 * 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 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
 * @param reverse true if the translation should be reversed, false otherwise
 */
 public Rotate3dAnimation(float fromDegrees, float toDegrees,
 float centerX, float centerY, float depthZ, boolean reverse) {
 mFromDegrees = fromDegrees;
 mToDegrees = toDegrees;
 mCenterX = centerX;
 mCenterY = centerY;
 mDepthZ = depthZ;
 mReverse = reverse;
 }
 @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初始状态,用于restore()
 camera.save();
 if (mReverse) {
 camera.translate(0.0f, 0.0f, mDepthZ * interpolatedTime);
 } else {
 camera.translate(0.0f, 0.0f, mDepthZ * (1.0f - interpolatedTime));
 }
 //围绕Y轴旋转degrees度
 camera.rotateY(degrees);
 //行camera中取出矩阵,赋值给matrix
 camera.getMatrix(matrix);
 //camera恢复到初始状态,继续用于下次的计算
 camera.restore();
 matrix.preTranslate(-centerX, -centerY);
 matrix.postTranslate(centerX, centerY);
 }
}

Test3DRotateActivity.java

public class Test3DRotateActivity extends Activity {
 /** Called when the activity is first created. */
 private final String TAG="Test3DRotateActivity";
 private ImageView image;
 private Button start ,stop;
 private Rotate3dAnimation rotation;
 private StartNextRotate startNext;
 @Override
 public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.main);
 image = (ImageView) findViewById(R.id.image);
 start=(Button) findViewById(R.id.start);
 stop = (Button) findViewById(R.id.stop);
 start.setOnClickListener(new OnClickListener() {
 public void onClick(View v) {
 // TODO Auto-generated method stub
 //进行360度的旋转
 startRotation(0,360);
 }
 });
 stop.setOnClickListener(new OnClickListener() {
 public void onClick(View v) {
 // TODO Auto-generated method stub
 image.clearAnimation();
 }
 });
 }
 private void startRotation(float start, float end) {
 // 计算中心点
 final float centerX = image.getWidth() / 2.0f;
 final float centerY = image.getHeight() / 2.0f;
 Log.d(TAG, "centerX="+centerX+", centerY="+centerY);
 // Create a new 3D rotation with the supplied parameter
 // The animation listener is used to trigger the next animation
 //final Rotate3dAnimation rotation =new Rotate3dAnimation(start, end, centerX, centerY, 310.0f, true);
 //Z轴的缩放为0
 rotation =new Rotate3dAnimation(start, end, centerX, centerY, 0f, true);
 rotation.setDuration(2000);
 rotation.setFillAfter(true);
 //rotation.setInterpolator(new AccelerateInterpolator());
 //匀速旋转
 rotation.setInterpolator(new LinearInterpolator());
 //设置监听
 startNext = new StartNextRotate();
 rotation.setAnimationListener(startNext);
 image.startAnimation(rotation);
 }
 private class StartNextRotate implements AnimationListener{
 public void onAnimationEnd(Animation animation) {
 // TODO Auto-generated method stub
 Log.d(TAG, "onAnimationEnd......");
 image.startAnimation(rotation);
 }
 public void onAnimationRepeat(Animation animation) {
 // TODO Auto-generated method stub
 }
 public void onAnimationStart(Animation animation) {
 // TODO Auto-generated method stub
 }
 }
}

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 android:orientation="vertical" >
 <Button
 android:id="@+id/start"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:text="开始" />
 <Button
 android:id="@+id/stop"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:text="结束" />
 <ImageView
 android:id="@+id/image"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:src="@drawable/t1"
 />
</LinearLayout>

代码中用Camera来实现动画,Camera就是一个摄像机,一个物体原地不动,我们带着摄像机按设定的角度进行移动,之后从Camera中取出完成该动画的Matrix,然后画我们的物体,这个就是这个3D动画实现的原理。
具体的解释见代码中注释部分,重点说一下Rotate3dAnimation.java中的

matrix.preTranslate(-centerX, -centerY);
matrix.postTranslate(centerX, centerY); 

由于旋转是以(0,0)为中心的,所以为了把界面的中心与(0,0)对齐,就要preTranslate(-centerX, -centerY),旋转完成后,调用postTranslate(centerX, centerY),再把图片移回来,这样看到的动画效果就是activity的界面图片从在centerX为中心绕Y轴旋转了。
你还可以把上面代码改成

matrix.preTranslate(-centerX, 0);
matrix.postTranslate(centerX, 0); 

看有什么不同效果。

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • Android酷炫动画效果之3D星体旋转效果

    在Android中,如果想要实现3D动画效果一般有两种选择:一是使用Open GL ES,二是使用Camera.Open GL ES使用起来太过复杂,一般是用于比较高级的3D特效或游戏,并且这个也不是开源的,像比较简单的一些3D效果,使用Camera就足够了. 一些熟知的Android 3D动画如对某个View进行旋转或翻转的 Rotate3dAnimation类,还有使用Gallery( Gallery目前已过时,现在都推荐使用 HorizontalScrollView或 RecyclerVi

  • android开发之横向滚动/竖向滚动的ListView(固定列头)

    由于项目需要,我们需要一个可以横向滚动的,又可以竖向滚动的 表格.而且又要考虑大数据量(行)的展示视图.经过几天的研究终于搞定,做了一个演示.贴图如下:      好吧.让我们看思路是什么样的: 1. 上下滚动直接使用 listView来实现. 2. 左右滚动使用HorizontalScrollView,来处理滚动.我写一个类MyHScrollView继承 自它. 2.1 . ListView里的每行(row)分为 两部分,不滚动的和可滚动的区域.比如本demo的第一列,就是静态的.而后面的所有

  • Android RecycleView使用(CheckBox全选、反选、单选)

    本文实例为大家分享了CheckBox全选.反选.单选的具体代码,供大家参考,具体内容如下 MainActiivity package com.bwie.day06; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.Recyc

  • Android TV开发:使用RecycleView实现横向的Listview并响应点击事件的代码

    本文讲述了Android TV开发:使用RecycleView实现横向的Listview并响应点击事件的代码.分享给大家供大家参考,具体如下: 1.先贴出自己的效果图(可横向滚动,并响应item点击事件): 2.关于点击事件的实现细节 核心:使用接口回调 在adapter中自己定义了个接口,然后在onBindViewHolder中去为holder.itemView去设置相应的监听最后回调我们设置的监听. class HomeAdapter extends RecyclerView.Adapter

  • Android编程实现3D立体旋转效果的实例代码

    说明:之前在网上到处搜寻类似的旋转效果 但搜到的结果都不是十分满意 原因不多追述(如果有人找到过相关 比较好的效果 可以发一下连接 一起共同进步) 一 效果展示 : 如非您所需要的效果 也希望能给些微帮助 具体操作以及实现 效果 请看项目例子 二 使用方式 此空间继承与FrameLayout 子空间直接添加如同framelayout 相同 如要如图效果 唯一要求子空间必须位于父控件中心且宽高等大小 为了方便扩展而做 如有其他需求可自行更改 (注 所有子控件 最好添加上背景 由于绘制机制和动画原因

  • android开发教程之listview使用方法

    首先是布局文件,这里需要两个布局文件,一个是放置列表控件的Activity对应的布局文件 main.xml,另一个是ListView中每一行信息显示所对应的布局  list_item.xml    这一步需要注意的问题是ListView 控件的id要使用Android系统内置的 android:id="@android:id/list"   [注意形式] main.xml 复制代码 代码如下: <?xml version="1.0" encoding=&quo

  • Android TV开发:实现3D仿Gallery效果的实例代码

    本文讲述了Android TV开发:实现3D仿Gallery效果的实例代码.分享给大家供大家参考,具体如下: 1.实现效果: 滚动翻页+ 页面点击+页码指示器+焦点控制 2.实现这个效果之前必须要了解 Android高级图片滚动控件实现3D版图片轮播器这篇文章,我是基于他的代码进行修改的,主要为了移植到电视上做了按键事件和焦点控制. 3.具体代码: public class Image3DSwitchView extends LinearLayout { private int currentP

  • Android使用Rotate3dAnimation实现3D旋转动画效果的实例代码

    利用Android的ApiDemos的Rotate3dAnimation实现了个图片3D旋转的动画,围绕Y轴进行旋转,还可以实现Z轴的缩放.点击开始按钮开始旋转,点击结束按钮停止旋转. 代码如下:: Rotate3dAnimation.java public class Rotate3dAnimation extends Animation { private final float mFromDegrees; private final float mToDegrees; private fi

  • Android仿IOS上拉下拉弹性效果的实例代码

    用过iphone的朋友相信都体验过页面上拉下拉有一个弹性的效果,使用起来用户体验很好:Android并没有给我们封装这样一个效果,我们来看下在Android里如何实现这个效果.先看效果,感觉有些时候还是蛮实用的. 思路:其实原理很简单,实现一个自定义的Scrollview方法(来自网上大神),然后在布局文件中使用自定义方法Scrollview就可以了. 代码: 自定义View,继承自Scrollview.MyReboundScrollView类 package com.wj.myrebounds

  • iOS自带动画效果的实例代码

     1.普通动画: [UIView beginAnimations:nil context:nil]; [UIView setAnimationDuration:2]; frame.origin.x += 150; [img setFrame:frame]; [UIView commitAnimations]; 2.连续动画(一系列图像): NSArray *myImages = [NSArray arrayWithObjects: [UIImage imageNamed:@"myImage1.p

  • vue使用transition组件动画效果的实例代码

    transition文档地址 定义一个背景弹出层实现淡入淡出效果 <template> <div> <button @click="show = !show"> Toggle </button> <transition name="fadeBg"> <div class="bg" v-if="show">hello</div> </tra

  • Android 3D旋转动画效果实现分解

    这篇文章主要介绍一下如何实现View的3D旋转效果,实现的主要原理就是围绕Y轴旋转,同时在Z轴方面上有一个深入的缩放. 演示的demo主要有以下几个重点: 1,自定义旋转动画 2,动画做完后,重置ImageView 先看一下程序的运行效果:  1,自定义动画类 这里实现了一个Rotate3dAnimation的类,它扩展了Animation类,重写applyTransformation()方法,提供指定时间的矩阵变换,我们在这个方法里,就可以利用Camera类得得到一个围绕Y轴旋转的matrix

  • Android仿视频加载旋转小球动画效果的实例代码

    先上个效果图,以免大家跑错地了. 嗯,除了只能录三秒,其他没啥问题. 下面分析一下怎么实现上面这个效果. 理性分析后我们可以看到是几个小球绕着一个圆进行运动,那这里面的重点我们看看什么. 绘制五个球,没什么难度,让球绕圆进行运动,这个好像我们没有见到是怎么去实现了,那下就说这个. 从本质上看,球绕圆运动,其实我们可以看作是一个物体绕指定的路劲运动,那我们就有下面几个东西需要说一下: 1:Path 2:ValueAnimator 3:PathMeasure 前两个大家应该都见过,一个是路径,就是可

  • Android开发返回键明暗点击效果的实例代码

    1:在很多APP里点击返回键,都可以看到返回键由亮变为暗 2:实现方法也是很简单的 (1)新建一个页面 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="65dp" android:background="#258a

  • Android仿今日头条顶部导航栏效果的实例代码

    随着时间的推移现在的软件要求显示的内容越来越多,所以要在小的屏幕上能够更好的显示更多的内容,首先我们会想到底部菜单栏,但是有时候像今日头条新闻客户端要显示的内容太多,而且又想在主界面全部显示出来,所以有加了顶部导航栏. 今日头条顶部导航栏区域的主要部分是一个导航菜单.导航菜单是一组标签的集合,在新闻客户端中,每个标签标示一个新闻类别,对应下面ViewPager控件的一个分页面.当用户在ViewPager区域滑动页面时,对应的导航菜单标签也会相应的被选中,选中的标签通过一个矩形红框高亮显示,红框背

  • jQuery实现动画效果的实例代码

    复制代码 代码如下: <style type="text/css">       table{border:1px solid #666;}       table td{border:1px solid #eee;width:200px;height:200px;}       img{width:200px;height:200px;border:none;position:relative;}    </style> <script src=&quo

随机推荐