-
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,是一种绘制时的规则,是Android2D图形绘制的基础。 - 作用:规定绘制内容时的规则 & 内容,绘制内容是根据
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)ldpi120 0.75 mdpi160(基准dpi,默认值) 1.0 hdpi240 1.5 xhdpi320 2.0 xxhdpi480 3.0 xxxhdpi640 4.0 nodpiALL / 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——绘制背景知识
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。