问问大家双缓存技术的一些问题

PogbaLiu 2017-01-03 05:53:18
代码如下图,这是一个实现在空白activity绘制空心矩形的自定义控件,书本讲这个是为了说明双缓存技术能够保存绘图历史的原理。但是其中有一个语句不是很理解,问题也在下图中,因为invalidate()会调用onDraw()方法,所以我认为是重复了
...全文
248 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
PogbaLiu 2017-01-10
  • 打赏
  • 举报
回复
引用 7 楼 yanzhenjie1003 的回复:
[quote=引用 4 楼 qq_29838777 的回复:]
[quote=引用 3 楼 yanzhenjie1003 的回复:]
[quote=引用 2 楼 qq_29838777 的回复:]
[quote=引用 1 楼 yanzhenjie1003 的回复:]
这个是不重复的,你可能没有搞清楚onTouchEvent方法,手指按下先走DOWN,然后手指开始移动MOVE、MOVE、MOVE、MOVE...,当手指抬起时走UP,那么MOVE的时候invalidate是没问题走了onDraw(Canvas)。
假设UP的时候什么代码都不执行,btmCanvas中的bitmap是没有内容的,所以上面声明的btmCanvas是没有意义的,也就是没有记录下历史。
那么再回到代码中,UP的时候btmCanvas.drawPath();是把路径画到了一个bitmap上,然后调用invalidate(),又调用了onDrawable(Canvas),然后执行到canvas.drawBitmap()时,把上面记录历史的bitmap画到了View上。
你好,那手指抬起时走UP,类所拥有的成员变量path的路径信息不是在走invalidate()时onDraw中的drawPath中把path画到bitmap中了吗?[/quote]
首先要搞清楚,这是两个Canvas对象,上面的回复已经讲的比较清楚了。一个是MOVE时一直在画,一个是UP的时候才画一次。那么你再结合上面的回复看一遍应该就清楚了。[/quote]哦,原来是两个Canvas对象,你这么说我就明白了,一个是MOVE时一直在画,一个是抬起手指时画一次。但有一点就是onDraw的形参Canvas与我定义的bmpBuffer这个Bitmap对象是怎么联系起来的,意思就是我定义的bmpCanvas这个Canvas对象是通过canvas的构造方法将bmpBuffer添加进去,那onDraw方法的形参canvas呢?[/quote]
一个是来记录的,onDraw(Canvas)的这个Canvas才是真正要画的,才能画到这个View上。[/quote]你好,我总结了一下,但是又得出一个新的问题
麦田捕手 2017-01-05
  • 打赏
  • 举报
回复
画图双缓冲的话,用surfaceview更适合一些
PogbaLiu 2017-01-05
  • 打赏
  • 举报
回复
引用 3 楼 yanzhenjie1003 的回复:
[quote=引用 2 楼 qq_29838777 的回复:] [quote=引用 1 楼 yanzhenjie1003 的回复:] 这个是不重复的,你可能没有搞清楚onTouchEvent方法,手指按下先走DOWN,然后手指开始移动MOVE、MOVE、MOVE、MOVE...,当手指抬起时走UP,那么MOVE的时候invalidate是没问题走了onDraw(Canvas)。 假设UP的时候什么代码都不执行,btmCanvas中的bitmap是没有内容的,所以上面声明的btmCanvas是没有意义的,也就是没有记录下历史。 那么再回到代码中,UP的时候btmCanvas.drawPath();是把路径画到了一个bitmap上,然后调用invalidate(),又调用了onDrawable(Canvas),然后执行到canvas.drawBitmap()时,把上面记录历史的bitmap画到了View上。
你好,那手指抬起时走UP,类所拥有的成员变量path的路径信息不是在走invalidate()时onDraw中的drawPath中把path画到bitmap中了吗?[/quote] 首先要搞清楚,这是两个Canvas对象,上面的回复已经讲的比较清楚了。一个是MOVE时一直在画,一个是UP的时候才画一次。那么你再结合上面的回复看一遍应该就清楚了。[/quote]哦,原来是两个Canvas对象,你这么说我就明白了,一个是MOVE时一直在画,一个是抬起手指时画一次。但有一点就是onDraw的形参Canvas与我定义的bmpBuffer这个Bitmap对象是怎么联系起来的,意思就是我定义的bmpCanvas这个Canvas对象是通过canvas的构造方法将bmpBuffer添加进去,那onDraw方法的形参canvas呢?
严振杰 2017-01-05
  • 打赏
  • 举报
回复
引用 4 楼 qq_29838777 的回复:
[quote=引用 3 楼 yanzhenjie1003 的回复:] [quote=引用 2 楼 qq_29838777 的回复:] [quote=引用 1 楼 yanzhenjie1003 的回复:] 这个是不重复的,你可能没有搞清楚onTouchEvent方法,手指按下先走DOWN,然后手指开始移动MOVE、MOVE、MOVE、MOVE...,当手指抬起时走UP,那么MOVE的时候invalidate是没问题走了onDraw(Canvas)。 假设UP的时候什么代码都不执行,btmCanvas中的bitmap是没有内容的,所以上面声明的btmCanvas是没有意义的,也就是没有记录下历史。 那么再回到代码中,UP的时候btmCanvas.drawPath();是把路径画到了一个bitmap上,然后调用invalidate(),又调用了onDrawable(Canvas),然后执行到canvas.drawBitmap()时,把上面记录历史的bitmap画到了View上。
你好,那手指抬起时走UP,类所拥有的成员变量path的路径信息不是在走invalidate()时onDraw中的drawPath中把path画到bitmap中了吗?[/quote] 首先要搞清楚,这是两个Canvas对象,上面的回复已经讲的比较清楚了。一个是MOVE时一直在画,一个是UP的时候才画一次。那么你再结合上面的回复看一遍应该就清楚了。[/quote]哦,原来是两个Canvas对象,你这么说我就明白了,一个是MOVE时一直在画,一个是抬起手指时画一次。但有一点就是onDraw的形参Canvas与我定义的bmpBuffer这个Bitmap对象是怎么联系起来的,意思就是我定义的bmpCanvas这个Canvas对象是通过canvas的构造方法将bmpBuffer添加进去,那onDraw方法的形参canvas呢?[/quote] 一个是来记录的,onDraw(Canvas)的这个Canvas才是真正要画的,才能画到这个View上。
PogbaLiu 2017-01-05
  • 打赏
  • 举报
回复
引用 5 楼 tiewantn 的回复:
画图双缓冲的话,用surfaceview更适合一些
或许你说得对,但我现在是学习阶段,所以还是要去了解一下
严振杰 2017-01-04
  • 打赏
  • 举报
回复
引用 2 楼 qq_29838777 的回复:
[quote=引用 1 楼 yanzhenjie1003 的回复:] 这个是不重复的,你可能没有搞清楚onTouchEvent方法,手指按下先走DOWN,然后手指开始移动MOVE、MOVE、MOVE、MOVE...,当手指抬起时走UP,那么MOVE的时候invalidate是没问题走了onDraw(Canvas)。 假设UP的时候什么代码都不执行,btmCanvas中的bitmap是没有内容的,所以上面声明的btmCanvas是没有意义的,也就是没有记录下历史。 那么再回到代码中,UP的时候btmCanvas.drawPath();是把路径画到了一个bitmap上,然后调用invalidate(),又调用了onDrawable(Canvas),然后执行到canvas.drawBitmap()时,把上面记录历史的bitmap画到了View上。
你好,那手指抬起时走UP,类所拥有的成员变量path的路径信息不是在走invalidate()时onDraw中的drawPath中把path画到bitmap中了吗?[/quote] 首先要搞清楚,这是两个Canvas对象,上面的回复已经讲的比较清楚了。一个是MOVE时一直在画,一个是UP的时候才画一次。那么你再结合上面的回复看一遍应该就清楚了。
PogbaLiu 2017-01-03
  • 打赏
  • 举报
回复
引用 1 楼 yanzhenjie1003 的回复:
这个是不重复的,你可能没有搞清楚onTouchEvent方法,手指按下先走DOWN,然后手指开始移动MOVE、MOVE、MOVE、MOVE...,当手指抬起时走UP,那么MOVE的时候invalidate是没问题走了onDraw(Canvas)。 假设UP的时候什么代码都不执行,btmCanvas中的bitmap是没有内容的,所以上面声明的btmCanvas是没有意义的,也就是没有记录下历史。 那么再回到代码中,UP的时候btmCanvas.drawPath();是把路径画到了一个bitmap上,然后调用invalidate(),又调用了onDrawable(Canvas),然后执行到canvas.drawBitmap()时,把上面记录历史的bitmap画到了View上。
你好,那手指抬起时走UP,类所拥有的成员变量path的路径信息不是在走invalidate()时onDraw中的drawPath中把path画到bitmap中了吗?
严振杰 2017-01-03
  • 打赏
  • 举报
回复
这个是不重复的,你可能没有搞清楚onTouchEvent方法,手指按下先走DOWN,然后手指开始移动MOVE、MOVE、MOVE、MOVE...,当手指抬起时走UP,那么MOVE的时候invalidate是没问题走了onDraw(Canvas)。 假设UP的时候什么代码都不执行,btmCanvas中的bitmap是没有内容的,所以上面声明的btmCanvas是没有意义的,也就是没有记录下历史。 那么再回到代码中,UP的时候btmCanvas.drawPath();是把路径画到了一个bitmap上,然后调用invalidate(),又调用了onDrawable(Canvas),然后执行到canvas.drawBitmap()时,把上面记录历史的bitmap画到了View上。

80,354

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧