造成这个问题的原因就在于安卓系统会根据bitmap的density和当前运行设备的density进行比较,不同会进行缩放。
项目里的图片叫 ic_launcher.png,大小是72*72,只有一张,放到了drawable-xhdpi的文件夹里了
代码是这样的:
val srcBitmap=BitmapFactory.decodeResource(resources,R.drawable.ic_launcher,opt).copy(Bitmap.Config.ARGB_8888,true);
opt.inScaled = false //设置这个属性防止因为不同的dpi文件夹导致缩放
opt.inPreferredConfig=Bitmap.Config.ARGB_8888
var bitmap= Bitmap.createBitmap(srcBitmap.width,srcBitmap.height,Bitmap.Config.ARGB_8888)
canvas= Canvas(bitmap)
canvas.drawBitmap(bitmap, 0f, 0f, null)
这里创建了一个原图大小的bitmap对象srcBitmap(加了opt.inScaled为false,设置这个属性decode bitmap时安卓系统将不会根据density进行自动缩放)
然后拿着创建好的srcBitmap去drawBitmap到我们新建的bitmap对象中,这时会发现画出来的bitmap右边和下边是缺失的,不是完整的一张图片
原因是这样的,我一开始把ic_launcher.png放到了xhdpi文件夹里,这个文件夹对应的density是320,然后我的安卓机子是xxhdpi的,也就是480的,我们通过decodeResource出来的srcBitmap对象的density属性是320(因为放在xhdpi里),然后它和运行的机子的density不一致,系统就拿去放大了,也就是放大到了72*(480/320)
=108 px,然后我们新建出来的bitmap对象传入的是 srcBitmap.width, srcBitmap.height(72,72),所以最终画出来的图片只有放大后的108的图片的72大小,剩下的被截掉了,同理,imageView.setImageBitmap()这个方法也会有放大缩小的问题
解决方法
val opt = BitmapFactory.Options()
opt.inScaled = false //设置这个属性防止因为不同的dpi文件夹导致缩放
opt.inPreferredConfig=Bitmap.Config.ARGB_8888
var bitmap=BitmapFactory.decodeResource(resources,R.drawable.ic_launcher,opt).copy(Bitmap.Config.ARGB_8888,true);
bitmap.density= resources.displayMetrics.densityDpi
canvas= Canvas(bitmap)
canvas.drawBitmap(bitmap, 0f, 0f, null)
加上这么一句话bitmap.density= resources.displayMetrics.densityDpi,修改bitmap的density为运行设备上的density就可以了