android开发图片分辨率问题解决方案
2023-09-27 14:29:20 时间
一直受到android开发图片分辨率问题困扰.drawable-(xdpi,hdpi,mdpi,ldpi,nodpi)这几个文件夹到底怎么放图片呢?
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层直接加载图片更便捷。
Android使用LruCache、DiskLruCache实现图片缓存+图片瀑布流 **本文仅用于学习利用LruCache、DiskLruCache图片缓存策略、实现瀑布流和Matix查看大图缩放移动等功能,如果想用到项目中,建议用更成熟的框架,如[glide]
Android开发:使用Java对手机截图图片进行任意区域的颜色对比度处理操作 开发项目过程中,对于手机屏幕截图,需要对获取到的截图的任意部分进行区域颜色对比度的识别操作,由此判定任意指定区域是否满足某对比度基本标准,但是该功能在网上任何地方都没有找到过Java方面的代码,于是根据RGB转换测试的原理:即获取每个像素点的RGB,通过RGB对比度定义公式进行像素点的集合换取。
“千变万化”——神奇的Android图片规格调整器(功能梳理篇) 由于放假的缘故,还是没时间直接上手APP,所以趁着晚上有时间,不妨为“千变万化”APP梳理一下功能。这样也能为我构思该APP提供更好的设计方向,防止出现想到一处写一处的混乱情况。
奥特曼超人 KARL-Dujinyang-奥特曼超人。作者目前任职于银狐、泡椒游戏公司,曾任职腾为CTO,CSDN技术专家,曾创办过创业go、造梦工厂、米奇云,万能孵化器等,领域涉及逆向安全专家以及全栈工程师,作者目前出书中。
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层直接加载图片更便捷。
Android使用LruCache、DiskLruCache实现图片缓存+图片瀑布流 **本文仅用于学习利用LruCache、DiskLruCache图片缓存策略、实现瀑布流和Matix查看大图缩放移动等功能,如果想用到项目中,建议用更成熟的框架,如[glide]
Android开发:使用Java对手机截图图片进行任意区域的颜色对比度处理操作 开发项目过程中,对于手机屏幕截图,需要对获取到的截图的任意部分进行区域颜色对比度的识别操作,由此判定任意指定区域是否满足某对比度基本标准,但是该功能在网上任何地方都没有找到过Java方面的代码,于是根据RGB转换测试的原理:即获取每个像素点的RGB,通过RGB对比度定义公式进行像素点的集合换取。
“千变万化”——神奇的Android图片规格调整器(功能梳理篇) 由于放假的缘故,还是没时间直接上手APP,所以趁着晚上有时间,不妨为“千变万化”APP梳理一下功能。这样也能为我构思该APP提供更好的设计方向,防止出现想到一处写一处的混乱情况。
奥特曼超人 KARL-Dujinyang-奥特曼超人。作者目前任职于银狐、泡椒游戏公司,曾任职腾为CTO,CSDN技术专家,曾创办过创业go、造梦工厂、米奇云,万能孵化器等,领域涉及逆向安全专家以及全栈工程师,作者目前出书中。
相关文章
- android基础---->NDK的使用
- 1307页字节跳动Android面试全套真题解析火了,架构师必备技能
- Android开发各类常见错误解决方案
- Android开发——Android M(6.0) 权限解决方案
- android 设置布局横屏竖屏
- android发送短信样例
- Google安全团队对Android安全的认识
- Unity 使用C/C++ 跨平台终极解决方案(PC,iOS,Android,以及支持C/C++的平台)
- Android中的三种XML解析方式
- Android 旋转屏幕--处理Activity与AsyncTask的最佳解决方案
- Android 10.0后创建文件createNewFile()和创建文件夹mkdirs()均失败解决方案
- Android:Service
- Android SQLite (四 ) 全面详解(二)
- Android Studio不能预览xml问题解决方案
- Android模拟器卡死的解决方案
- Android Recycleview的 RecyclerView is computing a layout or scrolling解决方案
- Android Canvas之Path的详解与使用(二)
- Android 官方推荐 : DialogFragment 创建对话框
- 【ARCore】Android ARCore 简介 ( AR 增强现实技术简介 | Android 平台常用的 AR 技术 | ARCore 相关资料收集 )
- eclipse adt开发android ndk没有NDK选项问题的解决方案
- cordova build android 打包时报错的解决方案
- 隐藏android中EditText的下划线
- android studio布局突然显示不全解决方案
- 函数式接口、默认方法、纯函数、函数的副作用、高阶函数、可变的和不可变的、函数式编程和 Lambda 表达式 - 响应式编程 [Android RxJava2](这到底是什么)第三部分
- Android SwipeRefreshLayout 、RecyclerView冲突下拉冲突的解决方案
- 【Android 进程保活】Android 进程优先级 ( 前台进程 | 可见进程 | 服务进程 | 后台进程 | 空进程 )
- Android移植4.0后 触摸屏无法使用解决方案