先上效果图:

我这里用的是GifCam来制作的gif动画,能够在http://download.csdn.net/detail/baidu_nod/7628461下载,

制作过程是先起一个模拟器,然后把GifCam的框拖到模拟器上面。点击Rec的new先,然后点击Rec,然后就save到本地成gif文件

这里做一个左右旋转。上下旋转,和左右移动的动画。先自己建立一个View的类,作为操作的对象:

public class MyView extends View {private Paint mPaint;int width = 0;int height = 0;public MyView(Context context, AttributeSet attrs) {super(context, attrs);mPaint = new Paint();mPaint.setStrokeWidth(5);mPaint.setColor(Color.RED);this.setBackgroundColor(Color.RED);width = context.getResources().getDimensionPixelSize(R.dimen.width);height = context.getResources().getDimensionPixelSize(R.dimen.height);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);//width 300 height 300canvas.drawLine(0, 0, width, 0, mPaint);canvas.drawLine(width, 0, width, height, mPaint);canvas.drawLine(width, height, 0, height, mPaint);canvas.drawLine(0, height, 0, 0, mPaint);canvas.save();} }

左右旋转动画:

public class RotateLeftRightAnimation 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;private InterpolatedTimeListener listener;  public RotateLeftRightAnimation(float fromDegrees, float toDegrees, float centerX, float centerY, float depthZ,boolean reverse) {mFromDegrees = fromDegrees;mToDegrees = toDegrees;mCenterX = centerX;mCenterY = centerY;mDepthZ = depthZ;mReverse = reverse;}public static interface InterpolatedTimeListener {  public void interpolatedTime(float interpolatedTime);  }  public void setInterpolatedTimeListener(InterpolatedTimeListener listener) {  this.listener = listener;  }@Overridepublic void initialize(int width, int height, int parentWidth, int parentHeight) {super.initialize(width, height, parentWidth, parentHeight);mCamera = new Camera();}@Overrideprotected void applyTransformation(float interpolatedTime, Transformation t) {if (listener != null) {listener.interpolatedTime(interpolatedTime);}final float fromDegrees = mFromDegrees;float degrees = fromDegrees + ((mToDegrees - fromDegrees) * interpolatedTime);boolean overHalf = (interpolatedTime > 0.5f);  if (overHalf) {  degrees = degrees - 180;  }  final float centerX = mCenterX;final float centerY = mCenterY;final Camera camera = mCamera;final Matrix matrix = t.getMatrix();camera.save();if (mReverse) {camera.translate(0.0f, 0.0f, mDepthZ * interpolatedTime);} else {camera.translate(0.0f, 0.0f, mDepthZ * (1.0f - interpolatedTime));}<span style="color:#ff0000;">camera.rotateY(degrees); //这个Y轴旋转就是左右旋转</span>camera.getMatrix(matrix);camera.restore();matrix.preTranslate(-centerX, -centerY);matrix.postTranslate(centerX, centerY);//这两句的意思是把View移到原点后旋转完再移动到如今的位置}
}

假设是上线旋转就把camera.rotateY(degrees)改成camera.rotateX(degrees)

假设是移动的话

<span style="color:#330033;">public class MoveAnimation extends Animation {private Camera mCamera;private float mMoveDistance;private InterpolatedTimeListener listener;  public MoveAnimation(float moveDistance) {mMoveDistance = moveDistance;}public static interface InterpolatedTimeListener {  public void interpolatedTime(float interpolatedTime);  }  public void setInterpolatedTimeListener(InterpolatedTimeListener listener) {  this.listener = listener;  }@Overridepublic void initialize(int width, int height, int parentWidth, int parentHeight) {super.initialize(width, height, parentWidth, parentHeight);mCamera = new Camera();}@Overrideprotected void applyTransformation(float interpolatedTime, Transformation t) {if (listener != null) {listener.interpolatedTime(interpolatedTime);}final Camera camera = mCamera;final Matrix matrix = t.getMatrix();camera.save();camera.getMatrix(matrix);camera.restore();matrix.postTranslate(mMoveDistance, 0);}
}</span>

然后主程序这样来调用:

 final MyView myView = (MyView) findViewById(R.id.myview);Button btn = (Button) findViewById(R.id.btn_move);btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {MoveAnimation anim = new MoveAnimation(200);anim.setDuration(500);myView.startAnimation(anim);}});Button btn_up_down_rotate = (Button) findViewById(R.id.btn_up_down_rotate);btn_up_down_rotate.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {RotateUpDownAnimation anim = new RotateUpDownAnimation(0,180, v.getWidth() / 2, v.getHeight() / 2, 0, false);anim.setDuration(500);myView.startAnimation(anim);}});Button btn_left_right_rotate = (Button) findViewById(R.id.btn_left_right_rotate);btn_left_right_rotate.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {RotateLeftRightAnimation anim = new RotateLeftRightAnimation(0,180, v.getWidth() / 2, v.getHeight() / 2, 0, false);anim.setDuration(500);myView.startAnimation(anim);}});

android旋转动画和平移动画具体解释,补充说一下假设制作gif动画放到csdn博客上...相关推荐

  1. android 左移动画_android旋转动画和平移动画详解,补充说一下如果制作gif动画放到csdn博客上...

    先上效果图: 制作过程是先起一个模拟器,然后把GifCam的框拖到模拟器上面,点击Rec的new先,然后点击Rec,然后就save到本地成gif文件 这里做一个左右旋转,上下旋转,和左右移动的动画,先 ...

  2. Android应用开发-小巫CSDN博客客户端开发开篇,玩转MySQL

    本篇博客是关于这款应用的开发的起始篇,主要简单介绍一下整个项目的概况,整体大纲如下: 1. 项目起因 2. 项目效果展示 3. 项目文档结构和依赖库说明 4. 项目功能简介 5. 系列博客分享后期计划 ...

  3. Android应用开发-小巫CSDN博客客户端之获取评论列表

    Android应用开发-小巫CSDN博客客户端之获取评论列表 上一篇博客介绍了博文详细内容的业务逻辑实现,本篇博客介绍小巫CSDN博客客户端的最后一项功能,获取评论列表,这个功能的实现跟前面获取文章列 ...

  4. Android应用开发-小巫CSDN博客客户端UI篇

    Android应用开发-小巫CSDN博客客户端UI篇 上一篇是给童鞋们介绍整个项目的概况,从这篇博文开始,后续也会详细介绍整个客户端的开发,但不会贴很多代码,我会贴核心代码然后提供实现思路,想看里面更 ...

  5. Android应用开发-小巫CSDN博客客户端之嵌入有米广告

    Android应用开发-小巫CSDN博客客户端之嵌入有米广告 上一篇博客给大家介绍如何集成友盟社会化组件,本篇继续带来干货,教大家如何嵌入广告到应用中去.小巫自称专业对接30年,熟悉各大渠道SDK的接 ...

  6. Android应用开发-小巫CSDN博客客户端之显示博文详细内容

    Android应用开发-小巫CSDN博客客户端之显示博文详细内容 上篇博文给大家介绍的是如何嵌入有米广告并且获取收益,本篇博客打算讲讲关于如何在一个ListView里显示博文的详细信息,这个可能是童鞋 ...

  7. Android应用开发-小巫CSDN博客客户端UI篇,kotlin安卓开发教程视频

    ** ** (图5-博文评论列表) 以上给大家展示的是小巫CSDN博客客户端的主要界面效果,下面来讲解如何布局这样的界面: 启动界面布局 /BlogClient/res/layout/splash.x ...

  8. Android应用开发-小巫CSDN博客客户端之集成友盟社会化分享组件,2021最新Android框架体系架构面试题

    下面是详细的集成过程: 首先来到官网:http://www.umeng.com/ 选择社会化分享,进入查看这个产品的介绍,下载对应平台的SDK,笔者这里自然是选择Android平台: 笔者集成友盟社会 ...

  9. Android应用开发-小巫CSDN博客客户端Jsoup篇

    Android应用开发-小巫CSDN博客客户端Jsoup篇 距上一篇博客已经过去了两个星期,小巫也觉得非常抱歉,因为在忙着做另外一个项目,几乎抽不出空来,这不小巫会把剩下的博文全部在国庆补上.本篇博客 ...

最新文章

  1. GBDT原来是这么回事
  2. 学习是一个漫长不能松懈的过程
  3. MASK-RCNN学习一:(数据集/原理介绍)
  4. Python--三元表达式、列表推导式、生成器表达式、递归、匿名函数、内置函数...
  5. java 在底图上绘制线条_使用底图和geonamescache绘制k表示聚类
  6. Overleaf v2 评测
  7. python read函数报错_python 使用read_csv读取 CSV 文件时报错
  8. webpack和 php配合,javascript - webpack和laravel-elixir-webpack的正确配合方式?
  9. 千峰教育2218期2022.10.19日
  10. word打印高清图片
  11. pc端软件怎么做性能测试,企点PC端性能测试——UI卡顿分析
  12. python数组冒号使用_python矩阵冒号
  13. 苹果手机白屏_安卓卡顿苹果闪退,手机换代的动力原来是这些
  14. 多周期时间序列分解算法——MSTL原理
  15. python装饰器带参数函数二阶导数公式_SICP Python 描述 1.6 高阶函数
  16. 关于微信小程序本机调试可以运行,真机无法运行的问题
  17. 计算机编程好难啊,揭秘|为什么我们觉得编程好难?
  18. 苹果手机语音备忘录在哪_苹果手机删除的备忘录怎样找回?方法简单,3秒学会!赶紧来看...
  19. 手机分辨率PPI和DPI的区别
  20. Gridmanager

热门文章

  1. 常见索引结构—二叉搜索树
  2. CentOS7手动修改系统时间
  3. 安装nvm管理多版本nodejs
  4. 二十一、Hadoop学记笔记————kafka的初识
  5. redis 事务,持久化,日志,主从,VM
  6. Silverlight简介
  7. javascript中动态添加事件
  8. 64位进程调用32位dll的解决方法 / 程序64位化带来的问题和思考
  9. java线程基础巩固---线程生命周期以及start方法源码剖析
  10. R语言paste函数