关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » 安卓开发 »Android图片分辨率dpi的相关问题解决

    Android图片分辨率dpi的相关问题解决

    2014-11-28 00:00:00 出处:51CTO
    分享

    dpi是什么呢?

    dpi是“dot per inch”的缩写,每英寸像素数。
    四种密度分类: ldpi (low), mdpi (medium), hdpi (high), and xhdpi (extra high)
    一般情况下的普通屏幕:ldpi是120,mdpi是160,hdpi是240,xhdpi是320。

    dpi计算公式

    DPI=对角线的像素值/尺寸

    手机屏幕分辨率和屏幕密度是两码事!并不是800*480的分辨率手机图片就应该放在hdpi文件夹中。5.0英寸 800*480属于mdpi

    也可以通过代码获取:

    DisplayMetrics metric = new DisplayMetrics(); 
           getWindowManager().getDefaultDisplay().getMetrics(metric); 
           int width = metric.widthPixels;  // 屏幕宽度(像素) 
           int height = metric.heightPixels;  // 屏幕高度(像素) 
           float density = metric.density;  // 屏幕密度(0.75 / 1.0 / 1.5) 
           int densityDpi = metric.densityDpi;  // 屏幕密度DPI(120 / 160 / 240)

    android会根据屏幕本身的尺寸与密度特性,自动载入对应的资源,并把它们从逻辑像素(DIP,用于定义界面布局)转换成屏幕上的物理像素。

    首先看看 系统是如何通过Resources的getDrawable(int id)方法找图片的

    public Drawable getDrawable(int id) throws NotFoundException { 
            TypedValue value; 
            synchronized (mAccessLock) { 
                value = mTmpValue; 
                if (value == null) { 
                    value = new TypedValue(); 
                } else { 
                    mTmpValue = null; 
                } 
                getValue(id, value, true); 
            } 
            Drawable res = loadDrawable(value, id); 
            synchronized (mAccessLock) { 
                if (mTmpValue == null) { 
                    mTmpValue = value; 
                } 
            } 
            return res; 
        }

    TypedValue 我们可以理解为存储数据的类型,主要被Resouces使用于持有的资源值

    通过getValue(id,value,true)方法去得到该id的资源的属性

    public void getValue(int id, TypedValue outValue, boolean resolveRefs) 
                throws NotFoundException { 
            boolean found = mAssets.getResourceValue(id, 0, outValue, resolveRefs); 
            if (found) { 
                return; 
            } 
            throw new NotFoundException("Resource ID #0x" 
                                        + Integer.toHexString(id)); 
        }

    最后通过loadDrawable(value, id)得到drawable,该方法到了底层的C代码,大致意思就是通过TypedValue中的方法和属性就可以获得我们想要的属性值,然后加载图片

    OK,下面来做个实验.

    试验一: 手机是1280*720 4.3英寸 属于xdpi 图片分辨率为960*640 (按正常图片不缩放 图片放在手机里面 应该不会充满 整个手机) 我把图片放在不

    文件夹 加载时间(ms) 图片显示 说明

    drawable 311 充满屏幕 图片有拉伸

    drawable-nodpi 130 未充满屏幕 图片显示正常

    drawable-ldpi 442 充满屏幕 图片有拉伸

    drawable-mdpi 383 充满屏幕 图片有拉伸

    drawable-hdpi 226 充满屏幕 图片有拉伸

    drawable-xhdpi 109 未充满屏幕 图片显示正常

    试验二: 手机是800*480 4.3英寸 属于hdpi 图片分辨率为960*640 (按正常图片不缩放 图片放在手机里面 应该充满 整个手机) 我把图片放在不同drawable文件夹中

    文件夹 加载时间(ms) 图片显示 说明

    drawable 290 充满屏幕 图片拉伸

    drawable-nodpi 127 充满屏幕 图片显示正常

    drawable-ldpi 369 充满屏幕 图片拉伸

    drawable-mdpi 346 充满屏幕 图片拉伸

    drawable-hdpi 124 充满屏幕 图片显示正常

    drawable-xhdpi 241 未充满屏幕 图片缩放

    得到结论:

    drawable-nodpi 中 图片不会被拉伸

    系统在得到图片时候,会先到设备对应的dpi的文件夹下去去找资源文件,找到后应该不会做缩放直接返回图片。

    假如没有在对应的dpi文件夹中找到,回去其他文件夹中查找,找到后会做相应的缩放。

    在高dpi找到的图片会缩放,在低dpi的会拉伸

    还有就是 源码中可以看出 loadDrawable的过程实在C层做的。通过系统资源id加载会比java层直接加载图片更便捷。

    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    电脑屏幕不小心竖起来了?别慌,快捷键搞定

    Destoon 模板存放规则及语法参考

    Destoon系统常量与变量

    Destoon系统目录文件结构说明

    Destoon 系统安装指南

    Destoon会员公司主页模板风格添加方法

    Destoon 二次开发入门

    Microsoft 将于 2026 年 10 月终止对 Windows 11 SE 的支持

    Windows 11 存储感知如何设置?了解Windows 11 存储感知开启的好处

    Windows 11 24H2 更新灾难:系统升级了,SSD固态盘不见了...

    IT头条

    Synology 更新 ActiveProtect Manager 1.1 以增强企业网络弹性和合规性

    00:43

    新的 Rubrik Agent Cloud 加速了可信的企业 AI 代理部署

    00:34

    宇树科技 G1人形机器人,拉动一辆重达1.4吨的汽车

    00:21

    Cloudera 调查发现,96% 的企业已将 AI 集成到核心业务流程中,这表明 AI 已从竞争优势转变为强制性实践

    02:05

    投资者反对马斯克 1 万亿美元薪酬方案,要求重组特斯拉董事会

    01:18

    技术热点

    大型网站的 HTTPS 实践(三):基于协议和配置的优化

    ubuntu下右键菜单添加新建word、excel文档等快捷方式

    Sublime Text 简明教程

    用户定义SQL Server函数的描述

    怎么在windows 7开始菜单中添加下载选项?

    SQL Server 2016将有哪些功能改进?

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。