造成这个问题的原因就在于安卓系统会根据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_8888var 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_8888var bitmap=BitmapFactory.decodeResource(resources,R.drawable.ic_launcher,opt).copy(Bitmap.Config.ARGB_8888,true);bitmap.density= resources.displayMetrics.densityDpicanvas= Canvas(bitmap)canvas.drawBitmap(bitmap, 0f, 0f, null)

加上这么一句话bitmap.density= resources.displayMetrics.densityDpi,修改bitmap的density为运行设备上的density就可以了

canvas.drawBitmap()画出来的bitmap和原bitmap大小不同,有一部分缺失了相关推荐

  1. canvas 画点_css+canvas 随便画一个星空

    今天躺在床上刷抖音的时候,看见了一个马克笔随便画星空的视频,很有意思. 先看效果: 开始需求分析: 1.渐变色的背景 2.画一颗树和一些草 3.水面的倒影 4.随便画点星星 5.画一颗流星 1.渐变色 ...

  2. html5 Canvas画图教程(5)—canvas里画曲线之arc方法

    本文转自:http://www.jb51.net/html5/70317.html 在canvas画线条这篇文章中,我讲了画直线的方法,按理这篇画曲线的文章早该发了,但由于canvas画曲线比较特殊, ...

  3. 用python画机器猫代码_如何用Python画一只机器猫?| 原力计划

    原标题:如何用Python画一只机器猫?| 原力计划 作者 | 人邮异步社区 责编 | 胡巍巍 出品 | CSDN博客 自信心是成功的源泉,对刚入门编程行业的初级程序员来说,多敲代码多做项目就是构建自 ...

  4. html5两条直线,Html5新特性用canvas标签画多条直线附效果截图

    下面例子为用canvas标签画多条直线 复制代码代码如下: index_three 您的浏览器不支持canvas标签. //获取Canvas对象(画布) var canvas = document.g ...

  5. 使用JavaScript在Canvas上画出一片星空

    随着Html5的迅猛发展,画布也变得越来越重要.下面我就写一个关于在canvas上画出一片星空的简单的代码的示例. 理论基础 初始化一个canvas,获得一个用于绘制图形的上下文环境context.并 ...

  6. 使用canvas 代码画小猪佩奇

    使用canvas 代码画小猪佩奇 最近不是小猪佩奇很火嘛!!! 前几天 在知乎 看见了别人大佬用python写的 小猪佩奇,  顿时想学 ,可是 自己 没学过python(自己就好爬爬图片,,,,几个 ...

  7. Unity在Canvas上画线(Draw Line)实现

    # 前言 目前Unity官方提供的UI扩展包中包含了UILineRenderer组件,本篇实现与UILineRenderer实现一致,主要讲解其基本使用与实现过程.不想看的同学可以直接下载官方扩展包. ...

  8. HTML canvas系列-画圆(4)

    HTML canvas系列-画圆(4) 1.画圆步骤 2.属性(样式) 3.示例 -绘制圆 1.画圆步骤 画圆使用beginPath.arc.fill.stroke方法. beginPath 开始绘制 ...

  9. 【Bitmap】Canvas: trying to use a recycled bitmap android.graphics.Bitmap问题

    Canvas: trying to use a recycled bitmap android.graphics.Bitmap问题 我这用到bitmap中间变量了,还用到 Bitmap bitmap ...

最新文章

  1. 开学季:当当大促的额外优惠又来啦!150 买 400的书!搓搓搓~
  2. AspNetDB.mdf数据库的建立和使用
  3. Active Diretory 全攻略(三)--建立域(2)
  4. 不疯狂的外星人,已疯狂的资本
  5. Boost:验证atomic <>不会在成员指针上提供算术运算
  6. DataWorks OpenAPI企业开发实战-运维监控大屏
  7. 【图像处理】——Python实现图像加噪(随机噪声、椒盐噪声、高斯噪声等)
  8. 计算机仿真技术-基于matlab的电子信息类课程课后答案,计算机仿真技术:基于MATLAB的电子信息类课程(第4版)...
  9. 软件开发项目云端All-In-One体验
  10. 用 dash_bootstrap_components 为 dash 生成美观的导航栏
  11. SysV和BSD启动风格的比较
  12. Java SE 基础:继承、封装、多态、fianl、static、abstract
  13. 计算机辅助翻译 教学大纲,《计算机辅助翻译》本科课程教学大纲翻译本科.doc...
  14. oracle if else怎么用,oracle if else语句使用介绍
  15. 训练集和验证集的划分
  16. 平年和闰年c语言程序,C语言平年,平年闰年问题
  17. 17届华为杯数学建模大赛B题代码
  18. c语言 pv操作,用C语言实现P、V操作
  19. 什么运动耳机好用,六款运动耳机值得推荐
  20. 汽车智能安装仿真测试软件,智能网联汽车仿真测试平台建设.pdf

热门文章

  1. SQL Server审核功能–发现和体系结构
  2. 为SQL Server创建基于“智能”触发器的审核跟踪
  3. sql server 性能_如何在SQL Server中收集性能和系统信息
  4. Expression Atlas
  5. 淘宝flexible.js的使用
  6. 设计模式:观察者(Observer)模式
  7. 团体程序设计天梯赛-练习集-L1-036. A乘以B
  8. 一天一个Java基础——序列化
  9. 淘宝SDK easing属性(旋转木马)
  10. SICP习题解答2.22