关于Canvas的记录

http://blog.csdn.net/rhljiayou/article/details/7212620

drawBitmap(Bitmap bitmap, Rect src, Rect dst, Paint paint) //贴图,参数一就是我们常规的Bitmap对象,参数二是源区域(这里是bitmap),参数三是目标区域(应该在canvas的位置和大小),参数四是Paint画刷对象,因为用到了缩放和拉伸的可能,当原始Rect不等于目标Rect时性能将会有大幅损失。

这个Rect类型的src是表示需要剪切原有bitmap的区域,而Rect类型的dst是需要显示bitmap的区域,bitmap会填充整个的dst区域。

ps:在我做瀑布流效果的时候,遇到需要绘制bitmap,但是bitmap和bitmap之间的空隙不知道如何绘制,想了在bitmap下绘制个长方形rect的,但是失败了。静下心来想想,由于我的View是自定义的,并且在onDraw方法里面绘制的bitmap,既然drawbitmap改变不了bitmap的最后显示区域,测试在onMeasure方法里直接setMeasuredDimension(width, height+5);就可以使得bitmap直接的间隙有5个dp单位的空隙了。


再上篇网志http://blog.sina.com.cn/s/blog_61ef49250100qw9x.html



Android画图避免屏幕闪烁


在处理一些复杂的界面时,往往要用view,SurfaceView来自己处理画图。比如用SurfaceView来贴两张图,并控制他们左右平移,基本代码如下:

Java代码:
Canvas c = null;

try {
c = mSurfaceHolder.lockCanvas(null);
if (c != null) {
c.setDrawFilter(mFilter);
c.drawRect(0, 0, c.getWidth(), c.getHeight(), mBGPaint); //画背景
c.drawBitmap(bm1, 0, 0, null);
c.drawBitmap(bm2,bm1.getWidth(), 0, null); //第二张图画在第一张旁边
}
} finally {
if (c != null) {
mSurfaceHolder.unlockCanvasAndPost(c);
}
}

控制它左右平移时,会发现屏幕非常闪烁,眼睛看着会非常累。研究以后发现,这是因为两张图是依次一张一张贴到屏幕上的,如果刷新频率高的话,会使屏幕非常的闪烁。

解决的办法其实非常简单,想起windows下开发解决画图闪烁的办法,先把要画的图先画好放在一张大的内存位图上,然后一下贴到屏幕。android其实也是一样的,上面的问题解决方法如下:

Java代码:

final Bitmap memBm = Bitmap.createBitmap(screenWidth, screenHeight, Bitmap.Config.RGB_565);
final Canvas c = new Canvas(memBm);
c.setDrawFilter(mFilter);
c.drawRect(0, 0, c.getWidth(), c.getHeight(), mBGPaint); //画背景
c.drawBitmap(bm1, 0, 0, null);
c.drawBitmap(bm2,bm1.getWidth(), 0, null); //第二张图画在第一张旁边
Canvas render = null;
try {
render = mSurfaceHolder.lockCanvas();
if (render != null) {
render.drawBitmap(memBm, 0, 0, null);
}
} finally {
if (render != null)
mSurfaceHolder.unlockCanvasAndPost(render);
}
memBm.recycle(); //记得回收内存位图


有空继续更新……

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值