当自定义View的时候,可以利用Canvas给View添加一些动画效果。

下面的例子,是在屏幕上绘制一个红色的小方块,这个小方块会在屏幕上面“乱跳”。

知识点

使用到的知识点:

(1) 在View的子类的draw()中调用invalidate(),可以让View对象一直保持重绘状态,从而可以使Canvas一直处于绘画过程中。

(2) Canvas的绘制功能,例如绘制Rect、Circle、Path等。

(3) 小方块碰撞屏幕边缘的算法。

实现

小方块视图。

继承View类,重写onDraw()方法,并提供一些setter和getter方法,用于设置小方块的属性。判断碰撞事件的逻辑在moveTo()方法中。代码如下:

  1. public class Rectangle extends View {
  2. public static final int MAX_SIZE = 40;
  3. private static final int ALPHA = 255;
  4. private int mCoordX = 0;
  5. private int mCoordY = 0;
  6. private int mRealSize = 40;
  7. private int mSpeedX = 3;
  8. private int mSpeedY = 3;
  9.  
  10. private boolean goRight = true;
  11. private boolean goDown = true;
  12. private DrawView mDrawView;
  13.  
  14. private Paint mInnerPaint;
  15. private RectF mDrawRect;
  16.  
  17. public Rectangle(Context context, DrawView drawView) {
  18. super(context);
  19. mDrawView = drawView;
  20.  
  21. mInnerPaint = new Paint();
  22.  
  23. mDrawRect = new RectF();
  24.  
  25. /* Red is default */
  26. mInnerPaint.setARGB(ALPHA, 255, 0, 0);
  27. mInnerPaint.setAntiAlias(true);
  28. }
  29.  
  30. public void setARGB(int a, int r, int g, int b) {
  31. mInnerPaint.setARGB(a, r, g, b);
  32. }
  33.  
  34. public void setX(int newValue) {
  35. mCoordX = newValue;
  36. }
  37.  
  38. public float getX() {
  39. return mCoordX;
  40. }
  41.  
  42. public void setY(int newValue) {
  43. mCoordY = newValue;
  44. }
  45.  
  46. public float getY() {
  47. return mCoordY;
  48. }
  49.  
  50. public void move() {
  51. moveTo(mSpeedX, mSpeedY);
  52. }
  53.  
  54. private void moveTo(int goX, int goY) {
  55.  
  56. // check the borders, and set the direction if a border has reached
  57. if (mCoordX > (mDrawView.width - MAX_SIZE)) {
  58. goRight = false;
  59. }
  60.  
  61. if (mCoordX < 0) {
  62. goRight = true;
  63. }
  64.  
  65. if (mCoordY > (mDrawView.height - MAX_SIZE)) {
  66. goDown = false;
  67. }
  68. if (mCoordY < 0) {
  69. goDown = true;
  70. }
  71.  
  72. // move the x and y
  73. if (goRight) {
  74. mCoordX += goX;
  75. } else {
  76. mCoordX -= goX;
  77. }
  78. if (goDown) {
  79. mCoordY += goY;
  80. } else {
  81. mCoordY -= goY;
  82. }
  83.  
  84. }
  85.  
  86. public int getSpeedX() {
  87. return mSpeedX;
  88. }
  89.  
  90. public void setSpeedX(int speedX) {
  91. mSpeedX = speedX;
  92. }
  93.  
  94. public int getmSpeedY() {
  95. return mSpeedY;
  96. }
  97.  
  98. public void setSpeedY(int speedY) {
  99. mSpeedY = speedY;
  100. }
  101.  
  102. @Override
  103. protected void onDraw(Canvas canvas) {
  104. super.onDraw(canvas);
  105.  
  106. mDrawRect.set(mCoordX, mCoordY, mCoordX + mRealSize, mCoordY
  107. + mRealSize);
  108. canvas.drawRoundRect(mDrawRect, 0, 0, mInnerPaint);
  109.  
  110. }
  111.  
  112. public void setSize(int newSize) {
  113. mRealSize = newSize;
  114. }
  115.  
  116. public int getSize() {
  117. return mRealSize;
  118. }
  119. }

外层视图。

小方块是一个独立的视图,这里不直接把小方块显示在Actiity中,在它的外面又“包”了一层。代码如下:

  1. public class DrawView extends View {
  2. private Rectangle mRectangle;
  3.  
  4. public int width;
  5.  
  6. public int height;
  7.  
  8. public DrawView(Context context) {
  9. super(context);
  10. mRectangle = new Rectangle(context, this);
  11. mRectangle.setARGB(255, 255, 0, 0);
  12. mRectangle.setSpeedX(3);
  13. mRectangle.setSpeedY(3);
  14.  
  15. }
  16.  
  17. @SuppressLint("WrongCall")
  18. @Override
  19. protected void onDraw(Canvas canvas) {
  20. super.onDraw(canvas);
  21. invalidate();
  22.  
  23. mRectangle.move();
  24. mRectangle.onDraw(canvas);
  25.  
  26. }
  27.  
  28. }

主界面。

获取屏幕的尺寸,并把相应的尺寸赋值给DrawView对象。最后,显示DrawView对象。代码如下:

  1. public class MainActivity extends Activity {
  2.  
  3. private DrawView mDrawView;
  4.  
  5. @Override
  6. protected void onCreate(Bundle savedInstanceState) {
  7. super.onCreate(savedInstanceState);
  8.  
  9. Display display = getWindowManager().getDefaultDisplay();
  10. mDrawView = new DrawView(this);
  11. mDrawView.height = display.getHeight();
  12. mDrawView.width = display.getWidth();
  13. setContentView(mDrawView);
  14. }
  15.  
  16. }

源码下载:

HackSeven Canvas上的动画的更多相关文章

  1. HTML5 Canvas核心技术图形动画与游戏开发(读书笔记)----第一章,基础知识

    一,canvas元素 1 为了防止浏览器不支持canvas元素,我们设置“后备内容”(fallback content),下面紫色的字即为后备内容 <canvas id="canvas ...

  2. >炫酷的计时器效果Canvas绘图与动画<

    >炫丽的计时器效果Canvas绘图与动画< 虽然我是学习java的,但是因为最近使用html5的关系,多学习了一下前端知识. 现在,我要介绍的计时器是十分炫酷的,使用画布完成. 喜欢htm ...

  3. Android中使用SurfaceView和Canvas来绘制动画

    事实上每一个View中都有Canvas能够用来绘制动画.仅仅须要在这个View中重载onDraw()方法就能够,可是SurfaceView类是一个专门用来制动动画的类. Canvas(中文叫做&quo ...

  4. HTML5 Canvas水波纹动画特效

    HTML5的Canvas特性非常实用,我们不仅可以在Canvas画布上绘制各种图形,也可以制作绚丽的动画,比如这次介绍的水波纹动画特效.以前我们也分享过一款基于HTML5 WebGL的水波荡漾动画,让 ...

  5. 7个华丽的基于Canvas的HTML5动画

    说起HTML5,可能让你印象更深的是其基于Canvas的动画特效,虽然Canvas在HTML5中的应用并不全都是动画制作,但其动画效果确实让人震惊.本文收集了7个最让人难忘的HTML5 Canvas动 ...

  6. 用HTML和CSS实现WWDC 2015上的动画效果

    用HTML和CSS实现WWDC 2015上的动画效果 动画效果WWDC 2015   原文:https://cssanimation.rocks/wwdc15/ 译者:周晓楷(@Helkyle) 每年 ...

  7. 【自己给自己题目做】:如何在Canvas上实现魔方效果

    最终demo -> 3d魔方 体验方法: 浮动鼠标找到合适的位置,按空格键暂停 选择要翻转的3*3模块,找到相邻两个正方体,鼠标点击第一个正方体,并且一直保持鼠标按下的状态直到移到第二个正方体后 ...

  8. Canvas上绘制几何图形

    重要的类自定义View组件要重写View组件的onDraw(Canvase)方法,接下来是在该 Canvas上绘制大量的几何图形,点.直线.弧.圆.椭圆.文字.矩形.多边形.曲线.圆角矩形,等各种形状 ...

  9. 使用JavaScript在Canvas上画出一片星空

    随着Html5的迅猛发展,画布也变得越来越重要.下面我就写一个关于在canvas上画出一片星空的简单的代码的示例. 理论基础 初始化一个canvas,获得一个用于绘制图形的上下文环境context.并 ...

随机推荐

  1. MVC 控制器之间传值学习——session

    刚接触MVC不久,写的一些代码自己都不忍心看下去.路漫漫其修远兮,宝宝还需努力!之前只用过Session做登录时用户信息的储存,今天对集合类数据做了小小的尝试:利用session在控制器之间传值,以减 ...

  2. SERDES高速系统(二)

    抖动.容忍度与功耗 前面我提到SERDES的最终性能要用传输速率和传输距离考核.使用眼图可以形象化地衡量SERDES的收发性能,但是更为精确的参数化衡量手段是抖动(Jitter).容忍度(Tolera ...

  3. (转)IE=EmulateIE7 标签的作用

    本文转载自:http://www.cnblogs.com/0000/archive/2009/11/01/1593851.html 对于 Web 开发人员来说,文本兼容性是一个要考虑的重要问题.Win ...

  4. java图形用户界面练习。j2se

    总结:主要是如何布局.还是存在很大问题 package clientFrame; import java.awt.FlowLayout; import javax.swing.JButton; imp ...

  5. PHP文件操作(三)-文件的写入

    fwrite()  //对文件进行写入 fwrite(file,string,length)file:必选项,需要写入的文件string:必选项,规定要写入文件的字符串length:可选项,规定要写入 ...

  6. .gitignore non-valiate

    Git忽略规则及.gitignore规则不生效的解决办法 分享到:更多19 2015-02-12    分类:Share2人评论65,215 次人浏览 在git中如果想忽略掉某个文件,不让这个文件提交 ...

  7. leetcode728

    vector<int> selfDividingNumbers(int left, int right) { vector<int> V; for (int i = left; ...

  8. 「小程序JAVA实战」 小程序手写属于自己的第一个demo(六)

    转自:https://idig8.com/2018/08/09/xiaochengxu-chuji-06/ 自己尝试的写一个小demo,用到自定义样式,自定义底部导航,页面之间的跳转等小功能.官方文档 ...

  9. Tornado 高并发源码分析之一---启动一个web服务

    前言: 启动一个tornado 服务器基本代码 class HomeHandler(tornado.web.RequestHandler): #创建 RequesHandler 对象,处理接收到的 h ...

  10. ffmpeg-URL(转)

    ffmpeg中为方便对资源进行访问,定义了两个结构体,URLContext中是对具体资源文件进行操作的上下文,URLProtocol则是在将资源进行分类的基础上,对某一类资源操作的函数集,熟悉Linu ...