android 中图片单位及图片加载优化相关知识

android 中图片单位及图片加载优化相关知识


1. 图片相关知识,像素,分辨率

px就是图片中最小的点,最小单位,单位色块,每个图都是由这些小像素点组成的,如基本的图片格式bitmap,注意像素的大小没有固定的长度,不同设备上一个单位的像素色块的大小是不一样的
分辨率=画面水平方向的像素值 * 画面垂直方向的像素值。
分辨率可以分为两方面:屏幕分辨率和图像分辨率。
屏幕分辨率如1024*768,就表示设备水平方向上有1024个像素点,垂直方向上有768个
图片分辨率也如上所说,比如如果某图片是500*200,就表示如果这个图片一比一显示的话,就是水平方向有500个像素点,而垂直方向有200个.
而像素点的大小不一样,所以同一张分辨率的图片在不同尺寸的显示器上很可能显示不同大小,或者即便尺寸相同,分辨率高的那个图片显示会小
像素越高,单个面积越小,显示的画质就越细致(当然要有相应分辨率的图片)

补充:图片的放大缩小:
放大是通过算法认为插入很多像素,所以如果放的很大,有效像素就很少,就会变得模糊
缩小是通过一定的算法删去一部分像素,所以会在细节上对视一小部分像素

所以如果图像分辨率小于显示器分辨率时,第一种是显示实际大小,但不是全屏,第二种是放大来全屏显示
如果大于显示器分辨率,第一种是局部显示(全屏),可拖放,第二种是通过缩小全屏显示

finally,虽然不同设备上像素块大小会不一样,但是同一台硬件设备上的屏幕分辨率、像素块大小是不会变的。PC电脑上之所以可以调整屏幕分辨率,其实也是通过算法转换了

1.android 图片,控件大小相关单位

  • px:
    (Pixel像素)构成图像的基本单元,但是单个像素的大小不固定,所以在不同尺寸设备上会有拉伸缩放,不推荐
  • dpi:
    是指屏幕上每英寸距离中有多少个像素点,dpi=dpi=√hight^2+width^2 / size (android以160dpi为标准)
  • dp(dip) 设备独立像素 device independent pixel
    一般都用这个作单位,顾名思义,独立,对于相同尺寸的手机,即使分辨率不同,同DP的组件占用屏幕比例相同,UI效果也相同。(注意,是相同的尺寸) dp可以维护Android组件自身的比例平衡,不至于在不同屏幕上变形
    转换公式:px = dp * (dpi/160)
  • sp
    主要用于字体,使得字体可以根据用户手机设置来修改字体大小

注:如今的dpi不能根据物理计算,是厂家生产时写在系统配置中的固定数值,为了简化屏幕适配,一般机型的dpi的取值会参考上面的范围,但是总会有一些特殊的机型就是不采纳官方的建议

可通过:dpi可以通过DisplayMetrics类的densityDpi属性获取当前手机的dpi数值,该类也可以获取到跟屏幕密度有关的其它属性。一般获取DisplayMetrics类有以下方法:

1
2
3
4
5
6
7
8
方式1:
//content:Activity,Content,Application.
DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
方式2:
//getSystemService可以通过 Activity,Content,Application等获取.
DisplayMetrics displayMetrics = new DisplayMetrics();
WindowManager windowManager = (WindowManager)getSystemService(Context.WINDOW_SERVICE);
windowManager.getDefaultDisplay().getMetrics(displayMetrics);

屏幕适配

主流推荐今日头条适配方案但自己不是太懂。。。

  • 使用wrap_content、match_parent、weight
  • 使用相对布局

几个不同文件夹放的本地图片drawable

Bitmap.decodeResource() 源码,新图的高度 = 原图高度 * (设备的 dpi / 目录对应的 dpi )

bitmap

Bitmap 就是Android中的图片,一张位图,只有生成了bitmap,才占内存,可以通过bitmap.getbytecount()来获取该bitmap具体占用内存

  • bitmap的创建:

    1. 通过已有的bitmap创建(可以对已有的bitmap进行各种操作放大,裁剪等):
      createBitmap(...)
      createScaleBitmap(...)
    2. 通过BitmapFactory,从各种数据源来解析,创建bitma对象:
      • decodeByteArray(byte[] data, int offset, int length):从指定的字节数组的offset位置开始,将长度为length的字节数据解析成Bitmap对象。
      • decodeFile(String pathName):从pathName指定的文件中解析、创建Bitmap对象。
      • decodeFileDescriptor(FileDescriptor fd):从FileDescriptor对应的文件中解析、创建Bitmap对象。
      • decodeResource(Resources res, int id):根据给定的资源ID从指定资源中解析、创建Bitmap对象。
      • decodeStream(InputStream is):从指定的输入流中解析、创建Bitmap对象。
  • BitmapFactory.Options

    1. BitmapFactory.Options类是BitmapFactory对图片进行解码时使用的一个配置参数类,其中定义了一系列的public成员变量,每个成员变量代表一个配置参数。
    2. inperferredConfig参数,设置图片使用的颜色模式
    3. inJustDecodeBounds,true—>告诉BitmapFactory只是获得长宽,不用加载bitmap到内存中,返回null
    4. inSmapleSize 尺寸压缩,减少图片水平竖直像素点(分辨率)只能缩小,且为2的倍数,(<1时自动变为1)
  • Matrix

    1. matrix类,即矩阵,可以对图片bitmap矩阵进行一些列线性变换,放大,旋转,位移等等

图片的三层缓存

加载图片时,应一次从内存—>本地—>网络去寻找图片资源,并以图片的url值为key

  1. 从内存获取:使用的是LruCache这个类(Least Recently Used )即最近最少使用算法,内部维护一个LinkedHashMap
  2. 从文件获取:google推荐的DiskLruCache,硬盘缓存类
  3. 网络
  4. 在上传,缓存本地时最好压缩一下,insamplesize尺寸压缩和compress质量压缩,以减小文件大小

加载网络大图,多图优化

加载大图,长图时,可以用BitmapRegionDecoder进行图片的局部加载

参考:
google-androld
csdn1
zhihu

© 2020 WPY's Android Tour All Rights Reserved. 本站访客数人次 本站总访问量
Theme by hiero