前段时间在公司做了一个模块,不使用第三方动画效果类,直接通过Canvas 进行图像的绘制,并通过Thread实现动画的效果

该模块主要是实现车辆运行时候的道路运行效果,在进行实施前做了一个相关的Demo

在Demo中主要实现的是道路的直线行驶的显示,和拐弯时候的图像变化

对于该项目准备分两篇进行描述

这篇就主要内容是针对道路的直线行驶,我的思路是在路中间进行虚线的绘制(虚线可用多个长条形的矩形拼接而成),通过虚线的移动来模拟道路的移动

废话少说上代码(比较早期时候的代码,笔者也懒得规范,请多见谅)

首先建立一个类LineView 继承View

public class LineView extends View {private int a = 0;private int b = -600;private int c = 600;private boolean isRun;public LineView(Context context){super(context);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);Paint paint1 = new Paint();paint1.setColor(Color.BLACK);paint1.setStrokeWidth((float) 3.0);canvas.drawLine(50, 0, 50, 1300, paint1);canvas.drawLine(600, 0, 600, 1300, paint1);Paint paint = new Paint();paint.setColor(Color.BLACK);paint.setStyle(Paint.Style.STROKE);canvas.drawRect(303, b, 333, b+200, paint);canvas.drawRect(303, b+300, 333, b+500, paint);canvas.drawRect(303, a, 333, a+200, paint);canvas.drawRect(303, a+300, 333, a+500, paint);canvas.drawRect(303, c, 333, c+200, paint);canvas.drawRect(303, c+300, 333, c+500,paint);}public void moveView(){if(isRun == false ){isRun  = true;}else if(isRun==true){isRun = false;}new Thread(moveThread).start();}private final Runnable moveThread = new Runnable() {@Overridepublic void run() {a = 0;b = -600;c = 600;while(isRun = true){a+=5;b+=5;c+=5;if(c>=1200){c=-600;}if(b>=1200){b=-600;}if(a>=1200){a = -600;}try {Thread.sleep(30);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}postInvalidate();}}};}

部分代码的解释:

其中私有变量表示为第一个矩形的上边的横坐标,b与c分别表示两个最高和最低被隐藏的矩形的横坐标,如右图(有图便于理解)

boolean型参数用于判断该图是否在运动

在重写的onDraw()方法中

创建一个Paint对象用于绘制两旁的道路,并定义其属性,都是比较简单的方法,这里就不逐一介绍了

drawLine()方法中的参数说明

canvas.drawLine(startX, startY, stopX, stopY, paint);

分别表示起始的横坐标,纵坐标,线终止的横纵坐标,并将之前定义好的Paint对象传入到该方法中

同样的,定义一个Paint变量用于绘制矩形

绘制矩形使用drawRect()方法,该方法中的参数说明:

canvas.drawRect(left, top, right, bottom, paint);

分别代表左上右下的坐标,并传入一个Paint对象

线程moveThread的解释:

线程启动后把图像置于默认的位置,并且当状态为true时,开始移动View

即除了两旁的道路,所有的图像都开始向下移动,以模拟开车时道路的效果。

并且这里有个精妙的设计——通过判断语句,辨别矩形是否移动到低端看不见的位置,如果达到该位置,又会将其移动到View的最顶端,就是说通过六个方块的不断移动,形成道路的移动效果。

并且将时间设置为30ms更新一次,并且通过postInvalidate()方法将界面进行刷新。

Android 中通过Canvas 与线程结合实现动画效果相关推荐

  1. Android 中的 Canvas API

    使用 Android Widget 组中不存在的自定义 UI 元素并想知道它是如何制作的? 这是 Android 中存在的 Canvas API 的魔力.我认为画布这个名字本身就定义了它是艺术家的游乐 ...

  2. 掌握Android中的进程和线程

    进程和线程是现代网络操作系统的核心概念.Android作为一种优秀的.承袭Linux的移动操作系统,其进程和线程的概念是开发者和安全工作人员需要深入了解的问题.本文将详细介绍Android中的进程.线 ...

  3. android 多线程 js,android中的jstack,见见线程都在干嘛

    android中的jstack,看看线程都在干嘛 之前做java开发的时候,遇到进程卡住的情况都会用jstack来打印一个进程里的线程活动情况.到了安卓开发,发现没有这个命令了,很不习惯. googl ...

  4. android tabhost 动画,Android中使用TabHost 与 Fragment 制作页面切换效果

    三个标签页置于顶端 效果图: 在文件BoardTabHost.java中定义页面切换的效果:切换页面时,当前页面滑出,目标页面滑入.这是2个不同的动画设定动画时要区分对待 import android ...

  5. android开发上下翻转动画,怎么在android中利用FlipAnimation实现一个3D垂直翻转动画...

    怎么在android中利用FlipAnimation实现一个3D垂直翻转动画 发布时间:2021-02-20 17:08:30 来源:亿速云 阅读:122 作者:Leah 这期内容当中小编将会给大家带 ...

  6. Android矢量图动画特效,Android使用SVG矢量图打造酷炫动画效果

    一个真正Android使用SVG矢量图打造酷炫动效往往让人虎躯一震,话不多说,咱们先看看效果: 这个效果我们需要考虑以下几个问题: 1. 这是图片还是文字: 2. 如果是图片该如何拿到图形的边沿线坐标 ...

  7. android菊花动画,Android实现仿iOS菊花加载圈动画效果

    常见的实现方式 切图,做旋转动画 自定义View,绘制效果 gif图 1.切图会增加体积,但相对简单,不过在换肤的场景下,会使用不同颜色,需要准备多张图,不够灵活. 2.由于自定义的好处,不同颜色只需 ...

  8. php3D动画,html5的canvas实现几何模型3D运动动画效果

    html5的canvas实现几何模型3D运动动画效果 JS片段: var {atan2,sqrt,sin,cos,PI,acos} = Math; function project3D(x,y,z,v ...

  9. html 结合3d效果,HTML和CSS3中的2D、3D结合实现动画效果

    这篇文章给大家介绍的内容是关于HTML和CSS3中的2D.3D结合实现动画效果,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 虽然我们我们在前端工作中,对于2D.3D动画效果一般来说 ...

最新文章

  1. LINUX文件、目录权限及相关操作命令
  2. EditPlue使用进阶之正则表达式
  3. amd同步多线程_AMD下一代锐龙APU实锤!Zen3、RDNA2绝配
  4. html文件url_for加载静态文件
  5. 防火墙技术指标---并发连接数/吞吐量
  6. [转载] 多线程详解java.util.concurrent
  7. mysql将不同行数结果合并成多列_将多行合并到mysql中的一行和多列
  8. apache伪静态综述
  9. easyui框架中关于dialog自带关闭事件的使用
  10. 项不会计算为接受 0 个参数的函数_玩转excel函数:详解四种计数函数,从基础到提高...
  11. 【ZBrush笔刷】实用笔刷和Alpah下载,及笔刷使用方法
  12. Cisco Packet Tracer思科模拟器中无线网络的基本配置
  13. 互联网+创新创业大赛反思总结
  14. 我也可以很极地很阳光
  15. OpenGL基本图元的绘制
  16. 用MATLAB实现转子的故障诊断,单盘转子故障诊断报告(附matlab程序).doc
  17. 手机上网占多大流量?WiFi要不要进行限速?
  18. suptitle()--matplotlib
  19. Linux操作系统常见命令
  20. kibana笔记 -- KQL

热门文章

  1. 深入浅出数据结构C语言版(10)——树的简介
  2. python open a_python中使用open()函数打开指定文件
  3. 一些拍案叫绝的运维小技巧
  4. 基于Linux的三种文件共享方式
  5. ssh登陆到别的主机上,ssh登陆被禁止
  6. winpe加载raid_WINPE3.0集成RAID阵列卡驱动的实现方法
  7. 安装nginx—并创建域名主机
  8. 【图片新闻】2019年6月19日伊朗击落一架美军MQ-4 Triton无人侦察机
  9. 常见的IO模型_晏无心_新浪博客
  10. Flutter问题记录 - Unable to find bundled Java version(续)