关闭 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层直接加载图片更便捷。

    上一篇返回首页 下一篇

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

    别人在看

    Edge浏览器百度被劫持/篡改怎么办,地址后边跟着尾巴#tn=68018901_7_oem_dg

    Google Chrome 在 iPhone 上新增了 Safari 数据导入选项

    Windows 11专业版 KMS工具激活产品密钥的方法

    DEDECMS安全策略官方出品

    Microsoft Text Input Application 可以关闭吗?

    新版本QQ如何关闭自带的浏览器?

    C++编程语言中continue的用法和功能,附举例示范代码

    c++ map 的数据结构、基本操作以及其在实际应用中的使用。

    C语言如何避免内存泄漏、缓冲区溢出、空指针解引用等常见的安全问题

    C语言中的break语句详解

    IT头条

    马斯克2026最新采访总结:2040年,全球机器人数量将突破100亿台

    23:52

    专家解读|规范人工智能前沿业态健康发展的新探索:解读《人工智能拟人化互动服务管理暂行办法》

    00:54

    用至强 6高存力搞定MoE卸载!

    17:53

    美国将允许英伟达向中国“经批准的客户”出售H200 GPU

    02:08

    苹果与微信就15%手续费达成一致?腾讯未置可否

    22:00

    技术热点

    PHP 和 Node.js 的10项对比挑战

    Javascript闭包深入解析及实现方法

    windows 7、windows 8.1手动增加右键菜单功能技巧

    MYSQL出错代码大汇总

    windows 7假死机怎么办 windows 7系统假死机的原因以及解决方法

    Ubuntu(Linux)下配置IP地址的方法

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

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