Android 中通过Canvas 与线程结合实现动画效果
前段时间在公司做了一个模块,不使用第三方动画效果类,直接通过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 与线程结合实现动画效果相关推荐
- Android 中的 Canvas API
使用 Android Widget 组中不存在的自定义 UI 元素并想知道它是如何制作的? 这是 Android 中存在的 Canvas API 的魔力.我认为画布这个名字本身就定义了它是艺术家的游乐 ...
- 掌握Android中的进程和线程
进程和线程是现代网络操作系统的核心概念.Android作为一种优秀的.承袭Linux的移动操作系统,其进程和线程的概念是开发者和安全工作人员需要深入了解的问题.本文将详细介绍Android中的进程.线 ...
- android 多线程 js,android中的jstack,见见线程都在干嘛
android中的jstack,看看线程都在干嘛 之前做java开发的时候,遇到进程卡住的情况都会用jstack来打印一个进程里的线程活动情况.到了安卓开发,发现没有这个命令了,很不习惯. googl ...
- android tabhost 动画,Android中使用TabHost 与 Fragment 制作页面切换效果
三个标签页置于顶端 效果图: 在文件BoardTabHost.java中定义页面切换的效果:切换页面时,当前页面滑出,目标页面滑入.这是2个不同的动画设定动画时要区分对待 import android ...
- android开发上下翻转动画,怎么在android中利用FlipAnimation实现一个3D垂直翻转动画...
怎么在android中利用FlipAnimation实现一个3D垂直翻转动画 发布时间:2021-02-20 17:08:30 来源:亿速云 阅读:122 作者:Leah 这期内容当中小编将会给大家带 ...
- Android矢量图动画特效,Android使用SVG矢量图打造酷炫动画效果
一个真正Android使用SVG矢量图打造酷炫动效往往让人虎躯一震,话不多说,咱们先看看效果: 这个效果我们需要考虑以下几个问题: 1. 这是图片还是文字: 2. 如果是图片该如何拿到图形的边沿线坐标 ...
- android菊花动画,Android实现仿iOS菊花加载圈动画效果
常见的实现方式 切图,做旋转动画 自定义View,绘制效果 gif图 1.切图会增加体积,但相对简单,不过在换肤的场景下,会使用不同颜色,需要准备多张图,不够灵活. 2.由于自定义的好处,不同颜色只需 ...
- php3D动画,html5的canvas实现几何模型3D运动动画效果
html5的canvas实现几何模型3D运动动画效果 JS片段: var {atan2,sqrt,sin,cos,PI,acos} = Math; function project3D(x,y,z,v ...
- html 结合3d效果,HTML和CSS3中的2D、3D结合实现动画效果
这篇文章给大家介绍的内容是关于HTML和CSS3中的2D.3D结合实现动画效果,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 虽然我们我们在前端工作中,对于2D.3D动画效果一般来说 ...
最新文章
- LINUX文件、目录权限及相关操作命令
- EditPlue使用进阶之正则表达式
- amd同步多线程_AMD下一代锐龙APU实锤!Zen3、RDNA2绝配
- html文件url_for加载静态文件
- 防火墙技术指标---并发连接数/吞吐量
- [转载] 多线程详解java.util.concurrent
- mysql将不同行数结果合并成多列_将多行合并到mysql中的一行和多列
- apache伪静态综述
- easyui框架中关于dialog自带关闭事件的使用
- 项不会计算为接受 0 个参数的函数_玩转excel函数:详解四种计数函数,从基础到提高...
- 【ZBrush笔刷】实用笔刷和Alpah下载,及笔刷使用方法
- Cisco Packet Tracer思科模拟器中无线网络的基本配置
- 互联网+创新创业大赛反思总结
- 我也可以很极地很阳光
- OpenGL基本图元的绘制
- 用MATLAB实现转子的故障诊断,单盘转子故障诊断报告(附matlab程序).doc
- 手机上网占多大流量?WiFi要不要进行限速?
- suptitle()--matplotlib
- Linux操作系统常见命令
- kibana笔记 -- KQL
热门文章
- 深入浅出数据结构C语言版(10)——树的简介
- python open a_python中使用open()函数打开指定文件
- 一些拍案叫绝的运维小技巧
- 基于Linux的三种文件共享方式
- ssh登陆到别的主机上,ssh登陆被禁止
- winpe加载raid_WINPE3.0集成RAID阵列卡驱动的实现方法
- 安装nginx—并创建域名主机
- 【图片新闻】2019年6月19日伊朗击落一架美军MQ-4 Triton无人侦察机
- 常见的IO模型_晏无心_新浪博客
- Flutter问题记录 - Unable to find bundled Java version(续)