包含canvas.drawbitmap的词条

http://www.itjxue.com  2023-01-20 17:53  来源:未知  点击次数: 

Drawable和Bitmap无法绘制的几个问题

1.canvas.drawBitmap无法绘制或绘制空白的问题:

? ? 通过自定义属性获取的图片资源一般为Drawable,需要使用该方法绘制时需要将Drawable转换为Bitmap,但是这里转换为bitmap有几个坑:

? ? 第一,mBitmap = Bitmap.createBitmap(imgRes.getIntrinsicWidth(), imgRes.getIntrinsicHeight(),imgRes.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565);

这个转换无效绘制图片无法展示。

第二,当图片资源设置为AdaptiveIconDrawable时,即app的icon资源时,无法绘制。

正确的转换方法为:

private BitmapgetmBitmap(Drawable drawable) {

if (Build.VERSION.SDK_INT = Build.VERSION_CODES.O) {

if (drawableinstanceof BitmapDrawable) {

return ((BitmapDrawable) drawable).getBitmap();

? ? ? ? }else if (drawableinstanceof AdaptiveIconDrawable) {

Drawable[] drr =new Drawable[2];

? ? ? ? ? ? drr[0] = ((AdaptiveIconDrawable) drawable).getBackground();

? ? ? ? ? ? drr[1] = ((AdaptiveIconDrawable) drawable).getForeground();

? ? ? ? ? ? LayerDrawable layerDrawable =new LayerDrawable(drr);

? ? ? ? ? ? int width = layerDrawable.getIntrinsicWidth();

? ? ? ? ? ? int height = layerDrawable.getIntrinsicHeight();

? ? ? ? ? ? Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);

? ? ? ? ? ? Canvas canvas =new Canvas(bitmap);

? ? ? ? ? ? layerDrawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());

? ? ? ? ? ? layerDrawable.draw(canvas);

? ? ? ? ? ? return bitmap;

? ? ? ? }

}else {

return ((BitmapDrawable) drawable).getBitmap();

? ? }

return null;

}

2.通过Drawable.draw()方法绘制图片为空白,当使用Drawable的draw绘制时一定要加上这句话:

imgRes.setBounds(new Rect(0,0,imgRes.getIntrinsicWidth(),imgRes.getIntrinsicHeight()));

才有效!!!

canvas.drawBitmap()的三个最常用的调用方法, 以及Matrix类的使用

1 drawBitmap(Bitmap bitmap, Rect src, RectF dst, Paint paint)

一般给src 设置为null即可, 把bitmap画到指定的矩形空间内.

2 drawBitmap(Bitmap bitmap, float left, float top, Paint paint)

把bitmap显示到left, top所指定的左上角位置.

3 drawBitmap(Bitmap bitmap, Matrix matrix, Paint paint)

使用一个Matrix参数, 用matrix对象来指定图片要显示的位置, 以及要采用什么具体的形变.

eg.

Matrix 类是用来实现对图像产生形变, 实现原理是基于: 图片在内存中存放的就是一个一个的像素点,而对于图片的变换主要是处理图片的每个像素点,对每个像素点进行相应的变换,即可完成对图像的变换。

在上面的例子中, 使用了postTranslate(), postRotate()这样的post () 系列方法, 还用了setScale()这类的set ()系列方法, 例如setTranslate(float dx,float dy).

set ()和post ()的区别是:

set ()相当于对matrix对象先重置reset(), 再施加形变操作.

post ()相当于在已有的matrix对象的基础上, 再添加一个新的形变操作.

还有一类是pre ()方法, 相当于在已有的matrix对象的基础上, 在之前添加一个新的形变操作, 在实际开发中, 用pre ()这类方法的地方并不多.

refer to:

---DONE.---

Android canvas.drawBitmap() 绘制图片大小的问题

你绘图的控件是不是足够大?像素密度有没有计算进去?bitmap直接可以判断大小的,单位是px。你打log把该输出的输出一下看看。

java创建位图时出现错误 canvas.drawBitmap(before, new Matrix(), paint);求大神解答

import android.opengl.Matrix;改成import android.graphicsl.Matrix; 自己瞎想出来的,至于为什么不解

android canvas.drawbitmap(bitmap,0,0,null)什么意思?

你是要实现图画功能的吧?这个很简单理解。

canvas.drawbitmap()函数你可以理解为新建一个画布, 就好比画家的画板,当然你不往里面添加东西,就什么都没有,它是空的。现在放入参数, bitmap就是导入你已有的图片,比如,画家上次还没画完的一张图片,现在放在画板上,要继续工作。参数,0,0,为设置这张画在画板上的放置的位置,0,0为x轴和y轴的坐标,如果是(0,0),则默认为从从左上角开始放置。下面的一张图片为设置不同参数的时候,这种那个图片放置在这个画板上的位置的变化,你可以看到我设置为(100,10),也就是x坐标100,图片离左边距离为100;y坐标10,图片离上方距离为10,你可以看到左边黑色的部分占了100,上边部分的黑色占了10.最后,就是那个null,null的参数是用来设置画笔的,你没有画笔,当然就不用设了,你这个只是简单的,见图片显示在画板上,并没有实现要在画板上画图的功能 。你还想实现美妙显示多少张图片的话,我只能给你指示简单的方向,就是你要设置一个定时器,在定时器里面,加上你的这个函数,然后定时更改参数bitmap变量,这个bitmap是图片的路径,实现实现每秒多少贞,就是要设置定时器你每秒,你改变参数bitmap的频率,关于这个问题,你还得学习下定时器,再说下去内容就多了,你还是自己先琢磨吧……

ps:其实这个函数还比较好理解,不好理解的是要开始实现画图的时候,要设置两个这样的,实现双缓冲,这个比较难,多看看书吧,我也只能帮你到这里了。祝你学习快乐哈~我也正在学习。

(责任编辑:IT教学网)

更多