效果

涉及到的知识

1、canvas
2、path和二阶贝塞尔曲线
3、bitmap绘制

canvas

先引用google官方:

The Canvas class holds the "draw" calls. To draw something, you need 4 basic components: A Bitmap to hold the pixels, a Canvas to host the draw calls (writing into the bitmap), a drawing primitive (e.g. Rect, Path, text, Bitmap), and a paint (to describe the colors and styles for the drawing).

canvas画布,Android中绘制时,需要四个基本要素:bitmap用于存放像素点,canvas来进行绘制,基础形状:矩形,path,text,bitmap等,paint用于控制绘制的颜色和样式,canvas相关的很重要的一点是,在Android中坐标的原点是从左上角开始。

Path

1.moveTo
moveTo表示将绘制点移动到某一个坐标处,该方法并不会进行绘制,主要是用来移动画笔。默认情况下起始坐标位于(0,0)点。

2.lineTo
lineTo表示绘制一条直线:

 @Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);Path path = new Path();path.lineTo(50,50);canvas.drawPath(path, paint);

3.quadTo
用于绘制二阶贝塞尔曲线,从上一个点开始,绘制二阶Bezier曲线(x1,y1)为控制点, (x2,y2)为终点如果之前没有调用过 moveTo(),则默认从 (0,0)作为起点绘制。

 /*** 从上一个点开始,绘制二阶Bezier曲线* (x1,y1)为控制点, (x2,y2)为终点* 如果之前没有调用过 moveTo(),则默认从 (0,0)作为起点绘制。*/public void quadTo(float x1, float y1, float x2, float y2) ;/*** 和quadTo相同,只不过这里是使用的是相对坐标。*/public void rQuadTo(float dx1, float dy1, float dx2, float dy2)

bitmap绘制

1、获取图片的bitmap

private val jumpBitmap1 = BitmapFactory.decodeResource(context.resources, R.drawable.jump_1)

2、将bitmap绘制在画布上

   /*** @param bitmap The bitmap to be drawn* @param src May be null. The subset of the bitmap to be drawn* @param dst The rectangle that the bitmap will be scaled/translated to fit into* @param paint May be null. The paint used to draw the bitmap*/public void drawBitmap(@NonNull Bitmap bitmap, @Nullable Rect src, @NonNull Rect dst,@Nullable Paint paint) {super.drawBitmap(bitmap, src, dst, paint);}

其中 Rect src是图片的子域,通过设置src的大小可以截取图片的部分区域,dst指图片在画布上面的位置,一般情况下不裁剪图片的话,设置src为null就可以了。

实现


1、跳绳实现

如上图,path的起点和中点在屏幕的中点两边,中点的点是控制贝塞尔曲线的点,这个点上下动就可以控制绘制出一条跳绳。要注意ValueAnimator.ofInt(0, b.bottom / 2, b.bottom, b.bottom / 2, 0)的值是从0到.bottom / 2,再到bottom,在到bottom / 2,最后回到0的,如果不是这样直接从(0-》bottom)的话,贝塞尔曲线的运动轨迹就不是连续的。
2、跳动的火柴人
跳动的火柴人由两种状态,由动画的值确定,根据动画的值来改变火柴人的位置,火柴人初始位置是在画布的正中间,根据动画的值,改变上下位置,同时更改bitmap。

代码

定义PathDrawable继承Drawable并且实现AnimatorUpdateListener接口

internal class PathDrawable(context: Context) : Drawable(),AnimatorUpdateListener

定义动画,

    mAnimator = ValueAnimator.ofInt(0, b.bottom / 2, b.bottom, b.bottom / 2, 0)

更新贝塞尔曲线和火柴人

 override fun onAnimationUpdate(animator: ValueAnimator) {Log.d(TAG, "onAnimationUpdate animator${animator.animatedValue}")mPath.reset()val b: Rect = boundsmPath.moveTo(b.left.toFloat(), b.bottom.toFloat() / 2)mPath.quadTo(((b.right - b.left) / 2).toFloat(),(animator.animatedValue as Int).toFloat(), b.right.toFloat(), b.bottom.toFloat() / 2)++countif (count % 24 == 0) {currentBitmap = if (animator.animatedValue as Int > b.bottom / 2) {jumpBitmap1} else {jumpBitmap3}count = 0}destinationRect.set(b.left + (halfW(b) - imageW() / 2).toInt(),b.top + (halfH(b) - imageH() / 2).toInt() + (animator.animatedValue as Int)/8,b.left + (halfW(b) + imageW() / 2).toInt(),b.top + (halfH(b) + imageH() / 2).toInt() + (animator.animatedValue as Int)/8)invalidateSelf()}

参考

https://stackoverflow.com/questions/18616035/how-to-animate-a-path-on-canvas-android
https://developer.android.com/reference/android/graphics/drawable/Drawable
https://developer.android.com/guide/topics/graphics/drawables
https://developer.android.com/reference/android/animation/ValueAnimator
https://stackoverflow.com/questions/13361231/android-draw-bitmap-within-canvas

Canvas加动画,实现火柴人跳绳效果相关推荐

  1. Canvas加动画,实现火柴人跳绳效果,移动端混合开发框架

    50); canvas.drawPath(path, paint); 3.quadTo 用于绘制二阶贝塞尔曲线,从上一个点开始,绘制二阶Bezier曲线(x1,y1)为控制点, (x2,y2)为终点如 ...

  2. Canvas加动画,实现火柴人跳绳效果,Android经典入门教程

    /** 从上一个点开始,绘制二阶Bezier曲线 (x1,y1)为控制点, (x2,y2)为终点 如果之前没有调用过 moveTo(),则默认从 (0,0)作为起点绘制. */ public void ...

  3. gif透明背景动画_火柴人动画制作软件下载_火柴人动画制作软件最新电脑版下载...

          火柴人动画制作软件官方版(Pivot Stickfigures Animator)是一款完全免费的火柴人动画制作软件.如果您不具备Flash等专业动画软件制作技能,那么可使用火柴人动画制作 ...

  4. 用arduino和OLED制作火柴人奔跑动画

    用arduino和OLED制作火柴人奔跑动画 有趣火柴人奔跑动画 2.为动画创建位图 这可能是最耗时的步骤.你必须创建一组框架,这将适合128x32格式.您可以尝试从任何拖鞋剪贴片中创建它们,您可以在 ...

  5. python编写会动的火柴人_火柴人跑步怎么画 如何制作一个正在奔跑的火柴人动画形象?火柴人跑步动作怎么画...

    小编最近一直致力于制作火柴人动画,制作火柴人各种搞笑的动作.为什么会一直想要制作火柴人动画呢?因为将动画制作成GIF格式之后,再发到微信聊天上就是一个很搞笑的微信表情包啦.然后小编的朋友总说小编制作的 ...

  6. 在html中加动画效果,教你如何在网页上用H5实现动画效果

    在web开发中,GIF动画效果是随处可见,比如常见的loading加载.人物奔跑的gif图片等等,那么这些都是怎么实现的呢? 其实实现的原理很简单,简而言之,这些所谓的动画都是一帧一帧的图片经过一段时 ...

  7. 画火柴人动画的手机软件_火柴人动画制作软件(Pivot Stickfigure Animator)2.25 中文版附教程...

    火柴人游戏一直深受广大玩家喜爱,有没有人想过火柴人动画是怎么制作出来的呢?今天小编就为大家带来一款火柴人动画制作软件Pivot Stickfigures Animator,它可以帮你快速而简单的制作出 ...

  8. iOS自制火柴人动画CC_Sprite程序员自己做动画 轻量级iOS动画引擎 游戏引擎

    CC_Sprite 面向的主要用户群体 CC_Sprite 主要面向: 没有ps.美术基础又想做小动画.小游戏的iOS开发. 你不想学习ps或其他动画软件,也不想安装其他软件,你只想做一个单纯的.天真 ...

  9. unity 计时器_如何用unity 物理系统 实现Stickfight中火柴人的布娃娃效果(二)

    上一期中,我们完成了角色在没有任何输入的情况下实现了站立平衡,这期,我们就来聊一下角色的运动吧. 玄夜smile:如何用unity 物理系统 实现Stickfight中火柴人的布娃娃效果(一) ,还没 ...

最新文章

  1. ASP.NET 2.0 中的资源与本地化
  2. 易想商城V4.7.1 过期到期解决办法
  3. 05-树7 堆中的路径 (25 分)
  4. jsp测试连接mysql_JSP 连接MySQL配置与测试
  5. 带有en的单词有哪些_律师不只是lawyer,还有barrister等其他单词
  6. 1 linux中解决文件已rm删除但空间不释放的案例
  7. 挂钩SSDT详解附源代码
  8. html邮件模板美化,设计利器:定制你的炫酷邮件模板
  9. 北京邮电大学计算机考研资料汇总
  10. QualDash: Adaptable Generation of Visualisation Dashboards for Healthcare Quality Improvement
  11. codeup21158 循环比赛日程表
  12. UVA-12555 - Baby Me(控制精度)
  13. 千万融资资金为何青睐edge这家公司?
  14. 游戏运营的十二大组成
  15. SVN常用的9大图标
  16. 快速提升SEO关键词搜索排名的5大伎俩
  17. Vue项目脚手架搭建
  18. zoj-Swordfish-2022-5-6
  19. cct 二级java复习资料_年第一次全国高校安徽考区计算机水平考试(CCT)
  20. 一图文带您认识磁编码器

热门文章

  1. javascript表单验证及正则表达式
  2. 我的手机灭屏了,为什么还在耗电
  3. Lisp+DWX 之四 Windows API 函数调用示例
  4. 汉语的伟大, 给崇英语的人
  5. stylus预处理入门(一)——选择器
  6. Context.managedQuery()和context.getContentResolver()获取Cursor关闭注意事项
  7. 支付宝到账配音女神,5亿人听过她的声音,31岁依旧单身
  8. mysql 搭建mha_MHA快速搭建
  9. Java基础(八)---- if判断语句
  10. TCHAR vs _TCHAR