-
Bitmap
- 作用:像素位图,是以像素为单位组成的图像,像素点可根据不同的排列和颜色(A R G B)以构成图像。因此,bitmap要点之处不外乎像素排列方式,像素压缩编码格式。
-
Bitmap
占用内存计算(byte) = 图片长度(像素) * 图片宽度(像素) * 每个像素点占用的字节数(byte) - 注意:改变图片宽高,像素存储方式,会影响占用内存大小,但质量压缩,如
JPEG
压缩算法,只会减小文件大小,而解码为Bitmap
加载到内存占用大小是不变的。 -
Bitmap.Config
:描述像素的存储方式,通过改变A R G B每个像素点占用的字节数来压缩内存。-
ALPHA_8
:1byte,仅有alpha通道,不存储颜色信息。 -
RGB_565
:2byte,仅有RGB通道,其中R占5位(32种R精度),G占6位(64种G精度),B占5位(32种B精度),图片可能会偏绿,可使用Dither
添加抖动处理,如果需要不透明位图,它比ARGB_4444
的图片质量更高。 -
ARGB_4444
:2byte,不建议使用,在android4.4以上使用此配置会默认替换为ARGB_8888
,A R G B各占4位(16种精度)。 -
ARGB_8888
:4byte,A R G B各占8位(256种精度),是常见存储方式中图片质量最高的像素存储方式。 -
RGBA_F16
:8byte,适用于广色域和HDR内容。 -
HARDWARE
:当位图仅存储在图形内存中,如果位图的唯一操作是绘制到屏幕上,可以考虑使用它。
-
-
Bitmap.CompressFormat
:以JPEG
,PNG
,WEBP
进行图片质量压缩,在保持像素的前提下,通过改变图片位深及透明度来达到图片压缩的目的,因此只会改变生成的文件大小,并不会改变解码为Bitmap
加载到内存中占用的内存大小。 -
BitmapFactory
:根据文件,流或字节数组创建Bitmap
-
Options
-
inDensity
:图片本身的像素密度(其实就是图片资源所在的哪个密度文件夹下,如在xxhdpi
下就是480,如果在asstes
、网络图片或sd
卡下,默认是160dpi
) -
inTargetDensity
:图片最终在bitmap
里的像素密度,如果没有赋值,会将inTargetDensity
设置成inScreenDensity
-
inScreenDensity
:手机本身的屏幕密度 -
inScaled
=TargetDensity
/inDensity
-
-
-
Canvas
- 定义:
Canvas
,是一种绘制时的规则,是Android
2D图形绘制的基础。 - 作用:规定绘制内容时的规则 & 内容,绘制内容是根据
Canvas
的规则绘制在屏幕上的,Canvas
只是绘制时的规则,实际内容是绘制在屏幕上的。 - 其他:
- 当调用
Canvas.save()
/Canvas.restore()
会进行图层以及画布状态的出入栈。
状态栈 -
Canvas
是由多个图层构成的- 在画布上操作 = 在图层上操作
- 如无设置,绘制操作和画布操作是默认在默认图层上进行
- 在通常情况下,使用默认图层就可满足需求;若需要绘制复杂的内容(如地图),则需使用更多的图层
-
最终显示的结果 = 所有图层叠在一起的效果
画布构成 - 图层
- 当调用
- 定义:
-
Drawable
- 作用:可绘制物体的抽象层面,其子类表示可以绘制在
Canvas
上的对象。设置背景,点击效果,形状,动画等时常会用到其子类。不过注意的是,他不像View
,不能进行事件分发和响应用户操作,大多数都是可以通过res/drawable
中xml
进行配置的。
- 作用:可绘制物体的抽象层面,其子类表示可以绘制在
-
其他要点
- 屏幕点密度
dpi
计算公式:手机对角线像素(Pixel) / 手机对角线长度(英寸 Inch) -
px
:一个像素点的长度 -
dp
:在dpi
=160时,1px
的长度,最后根据实际设备的dpi
,进行像素缩放。因此px
=dp
* (dpi
/ 160) -
sp
:文本大小单位,与dp
同理,默认情况下,等同于dp
大小,仅能用于文字大小单位。 -
res
资源目录对应关系:匹配的资源目录 屏幕点密度(dpi) 缩放比(对比 mdpi
)ldpi
120 0.75 mdpi
160(基准dpi,默认值) 1.0 hdpi
240 1.5 xhdpi
320 2.0 xxhdpi
480 3.0 xxxhdpi
640 4.0 nodpi
ALL / tvdpi
≈213dpi 适用于TV ≈1.33 -
drawble
与mipmap
文件夹- 如果在
app
内使用资源,那么放在drawable
或mipmap
目录下,系统只会根据上表dpi
加载匹配的资源目录下的资源。 - 如果是在
launcher
中,那么放在mipmap
下的资源,launcher
会自动选择更加合适密度的资源。 - 因此,应用图标
launcher icon
必须放在mipmap
文件夹下,且必须保证不同密度的icon
。 - 其他资源随意放在哪个文件夹下,如果有不同密度的图那最好,但如果仅有一张图,优先放在高密度(如
xxhdpi
)文件夹下,可以避免 高密度设备 使用 放在低密度文件夹下的图片 放大宽高 造成的占用内存增加。 - 如果是网络图片,assets文件夹底下或者手机本地文件夹加载的图片,都会默认使用
mdpi
也就是160dpi
的像素密度,如果想改变其缩放比,必须同时调整BitmapFactory.Options.inDensity
和BitmapFactory.Options.inTargetDensity
的值才能起作用。 - 例子:一个30 * 30的ARGB_8888图片放在
hdpi
文件夹下,480dpi
的设备访问这张图,那么首先30 * 30的图片会被放大成 30 * ( 3 / 2) * 30 * ( 3 / 2) = 45 * 45 大小的图片 最终加载成bitmap
占用内存的大小就是 45 * 45 * 4 = 8100(byte)
- 如果在
- 屏幕点密度
- 绘制图形基础以及各api使用
- 系列文章
自定义View——绘制背景知识
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。