学习之随堂笔记——屏幕适配
来源:互联网 发布:雀巢中国总部 知乎 编辑:程序博客网 时间:2024/06/13 17:20
该篇文章从eoeAndroid搬迁过来的,原文地址:学习之随堂笔记——屏幕适配
注:该帖子为本人学习时随手记录的,内容杂乱,敬请见谅
一、各种适配相关知识
1.屏幕尺寸
屏幕对角线的长度,单位英寸,1英寸=2.54厘米
2.屏幕分辨率
在纵横向上的像素点数,单位px,1px=1个像素点,一般以纵向像素*横向像素,如1920*1080
3.屏幕像素密度
每英寸上的像素点数,单位dpi,屏幕的像素密度与屏幕尺寸和屏幕分辨率有关计算方式:纵向像素的平方+横向像素的平方,开根号,结果除以屏幕尺寸例如:Nexus 5,屏幕尺寸 4.95英寸,分辨率 1920*1080,dpi 445 (√ ̄(1920^2+1080^2)) / 4.95 ≈ 445
4.px
构成图像的最小单位
5.dp,dip
密度无关像素,以160dpi为基准,1dip=1px
6.sp
可以根据文字大小首选项进行放缩,google推荐使用12sp以上大小的文字(12sp,14sp,18sp,22sp首选大小),不要使用奇数或小数,字体放缩时会造成精度的丢失。
7.ldpi,mdpi,hdpi,xdpi,xxdpi,xxxhdpi
在设计图标时,对于五种主流像素密度(mdpi,hdpi,xhdpi,xxhdpi,xxxhdpi)应按照2:3:4:6:8的比例进行缩放
二、屏幕适配解决方案
1.支持各种屏幕尺寸
使用wrap_content、match_parent、weightweight计算出的宽度=原来宽度(width属性)+剩余空间所占百分比宽度
使用相对布局,禁用绝对布局使用限定符尺寸限定符large(android3.2之前有作用)
最小宽度限定符small width最小宽度(android3.2之后推出的)
为了兼容高低版本,减少布局,可以使用布局别名,进行统一管理
屏幕方向限定符 land,port
例子:
使用自动拉伸位图 .9图
2.支持各种屏幕密度
使用非密度制约像素提供备用位图(最好根据不同的屏幕密度提供不同的切图,从而保证使用图片资源的时候减少内存压力)
3.实施自适应用户界面流程
确定当前布局根据当前布局做出响应重复使用其-他活动中的片段处理屏幕配置变化
4.最佳实践
关于高清设计图尺寸动态设置
学习完成后,本人做了一个根据不同分辨率和屏幕密度计算生成dimens的小例子,主要思路如下:
1.确定设计图纸的宽度尺寸,如例子中的640
2.获取需要适配手机的分辨率与屏幕密度,,可以根据手机型号在网上搜索,如ZOL产品报价网站,红米note手机,分辨率1280x720,屏幕密度267dpi
3.因为屏幕密度为160(mdpi)的手机1dp=1px,所以我们可以生成一个基准dimens.xml文件放在values中,里面的所有dimens数值都是1:1生成的,其余的屏幕密度倍数分别为:120(ldpi,0.75),240(hdpi,1.5),320(xhdpi,2),480(xxhdpi,3),640(xxxhdpi,4),以红米note为例,生成对应的dimens.xml文件,红米note屏幕密度为267,靠近240,所以我们取hdpi 1.5倍,以宽度为值,红米note的宽度为720,图纸尺寸为640,所以对应得dimens计算倍数为:720/(640*1.5),然后用该倍数就能获取红米note机器下的dimens值,具体代码如下:
import java.io.File;import java.io.FileNotFoundException;import java.io.IOException;import java.io.PrintWriter;public class DimensTools { private static final String BASE_FOLDER = "C:/Users/krubo/Desktop/dimens"; /** 基准宽度 */ private static final int BASE_WIDHT = 640; // ldpi-0.75(120),mdpi-1(160),hdpi-1.5(240),xhdpi-2(320),xxhdpi-3(480),xxxhdpi-4(640) public static void main(String[] args) { getBaseDimens(); getDimens(1440, 2560, "xxxhdpi"); getDimens(720, 1280, "xhdpi"); getDimens(720, 1280, "hdpi"); getDimens(540, 960, "hdpi"); getDimens(480, 800, "hdpi"); } private static void getBaseDimens() { File folder = new File(BASE_FOLDER + "/values"); if (!folder.exists()) { folder.mkdirs(); } File file = new File(folder.getAbsoluteFile() + "/" + "dimens.xml"); if (file.exists()) { file.delete(); } try { file.createNewFile(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); System.out.println("getBaseDimens fail"); return; } StringBuffer sb = new StringBuffer(); sb.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>").append("\n"); sb.append("<resources>").append("\n"); for (int i = 1; i <= 2000; i++) { sb.append("<dimen name=\"DIMEN_" + i + "DP\">"); sb.append(i + "dp"); sb.append("</dimen>").append("\n"); } sb.append("</resources>"); try { PrintWriter pw = new PrintWriter(file); pw.write(sb.toString()); pw.flush(); pw.close(); System.out.println("getBaseDimens success"); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); System.out.println("getBaseDimens fail"); } } private static void getDimens(int widht, int height, String dpiName) { double dpi = 1; if (dpiName.equals("ldpi")) { dpi = 0.75d; } else if (dpiName.equals("mdpi")) { dpi = 1; } else if (dpiName.equals("hdpi")) { dpi = 1.5d; } else if (dpiName.equals("xhdpi")) { dpi = 2; } else if (dpiName.equals("xxhdpi")) { dpi = 3; } else if (dpiName.equals("xxxhdpi")) { dpi = 4; } File folder = new File(BASE_FOLDER + "/values-" + dpiName + "-" + height + "x" + widht); if (!folder.exists()) { folder.mkdirs(); } File file = new File(folder.getAbsoluteFile() + "/" + "dimens.xml"); if (file.exists()) { file.delete(); } try { file.createNewFile(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); System.out.println("getdimens file fail"); return; } StringBuffer sb = new StringBuffer(); sb.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>").append("\n"); sb.append("<resources>").append("\n"); double multiple = (double) widht / (BASE_WIDHT * dpi); System.out.println("multiple:" + multiple); for (int i = 1; i <= 1500; i++) { sb.append("<dimen name=\"DIMEN_" + i + "DP\">"); sb.append((double) i * 2 * multiple + "dp"); sb.append("</dimen>").append("\n"); } sb.append("</resources>"); try { PrintWriter pw = new PrintWriter(file); pw.write(sb.toString()); pw.flush(); pw.close(); System.out.println("getdimens success"); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); System.out.println("getdimens write fail"); } }}
0 0
- 学习之随堂笔记——屏幕适配
- Android学习笔记041之屏幕适配
- unity3D学习笔记之七 RectTransform与屏幕适配
- Android学习笔记四十一之屏幕适配
- 屏幕适配学习笔记
- Android多屏幕适配学习笔记
- Android多屏幕适配学习笔记
- Android多屏幕适配学习笔记
- imooc学习笔记--屏幕适配
- Android多屏幕适配学习笔记
- Cocos2dx个人笔记之屏幕适配
- cocos2dx进阶学习之屏幕适配
- cocos2dx进阶学习之屏幕适配
- Cocos2dx进阶学习之屏幕适配
- Android学习——屏幕适配
- Android学习笔记之屏幕横竖设置
- 屏幕适配笔记
- Cocos2dx 3.0 学习笔记:屏幕适配的方法。
- 数据存取之Preference浅析
- XCode的一些调试技巧
- Android设置TextView显示一行或多行
- Django开发博客(四)——建立文章列表
- android sqlite 应用
- 学习之随堂笔记——屏幕适配
- MyBits学习小知识及错误二
- Oracle11g 账号锁定及密码有效期问题
- 开源控件学习之-侧滑listview进行删除(一)(自定义listview)
- 数据库学习
- solr定时实时重建索引和增量更新
- QT pro文件介绍
- IOS应用开发-发布详细流程
- kettle官网下载