Andorid 自适应UI
来源:互联网 发布:万国高仿手表淘宝 编辑:程序博客网 时间:2024/06/06 20:38
MakeXml
1.解决屏幕宽度不一致问题思路:把任何设备的手机宽度像素均分为320份,高度像素均分为480份,使用我们写好的程序自动生成资源values-×文件夹,里面包含lay_x.xml和lay_y.xml,分别对应宽度和高度的像素。
//ԭ�����ӣ�http://www.jianshu.com/p/ad563d169871public class MakeXml { private final static String rootPath = "E:\\layoutroot\\values-{0}x{1}\\";// private final static float dw = 320f;// private final static float dh = 480f; private final static float dw = 1024f; private final static float dh = 768f; private final static int width_parts = 1024; private final static int height_parts = 768; private final static String WTemplate = "<dimen name=\"x{0}\">{1}px</dimen>\n"; private final static String HTemplate = "<dimen name=\"y{0}\">{1}px</dimen>\n"; public static void main(String argsSt[]) {// makeString(320, 480);// makeString(480, 800);// makeString(480, 854);// makeString(540, 960);// makeString(600, 1024);// makeString(720, 1184);// makeString(720, 1196);// makeString(720, 1280);// makeString(768, 1024);// makeString(800, 1280);// makeString(1080, 1812);// makeString(1080, 1920);// makeString(1440, 2560);// makeString(1536, 2048);// makeString(1440, 2048);// makeString(1600, 2560);// makeString(600, 982);// makeString(800,1216);// makeString(736, 1280); makeString(2560, 1440); makeString(1920, 1200); makeString(2048, 1440); makeString(1824, 1200); makeString(2048, 1536); makeString(2560, 1600); makeString(1280, 800); makeString(1280, 752); makeString(1024, 768); System.out.println("制作完成"); } public static void makeString(int w, int h) { StringBuffer sb = new StringBuffer(); sb.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"); sb.append("<resources>"); float cellw = w / dw; for (int i = 1; i < width_parts; i++) { sb.append(WTemplate.replace("{0}", i + "").replace("{1}", change(cellw * i) + "")); } sb.append(WTemplate.replace("{0}", width_parts+"").replace("{1}", w + "")); sb.append("</resources>"); StringBuffer sb2 = new StringBuffer(); sb2.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"); sb2.append("<resources>"); float cellh = h / dh; for (int i = 1; i < height_parts; i++) { sb2.append(HTemplate.replace("{0}", i + "").replace("{1}", change(cellh * i) + "")); } sb2.append(HTemplate.replace("{0}", height_parts+"").replace("{1}", h + "")); sb2.append("</resources>"); String path = rootPath.replace("{0}", w + "").replace("{1}", h + ""); File rootFile = new File(path); if (!rootFile.exists()) { rootFile.mkdirs(); } File layxFile = new File(path + "lay_x.xml"); File layyFile = new File(path + "lay_y.xml"); try { PrintWriter pw = new PrintWriter(new FileOutputStream(layxFile)); pw.print(sb.toString()); pw.close(); pw = new PrintWriter(new FileOutputStream(layyFile)); pw.print(sb2.toString()); pw.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } } public static float change(float a) { int temp = (int) (a * 100); return temp / 100f; } }
提供备用位图
2.为了让我们提供的图片符合各种屏幕密度的要求。我们需要为不同屏幕密度提供大小不同的图片。
在Google官方开发文档中,说明了 mdpi:hdpi:xhdpi:xxhdpi:xxxhdpi=2:3:4:6:8 的尺寸比例进行缩放。例如,一个图标的大小为48×48dp,表示在mdpi上,实际大小为48×48px,在hdpi像素密度上,实际尺寸为mdpi上的1.5倍,即72×72px,以此类推。
因此,我们要在drawable、drawable-hdpi、drawable-mdpi、drawable-xdpi、drawable-xhdpi等文件夹下放置相同名称、符合上述比例的图片资源。系统会根据屏幕密度的不同,而选择对应的图片进行加载。
在布局文件中的简单使用:
<Button android:layout_height="wrap_content" android:layout_width="wrap_content" android:background="@drawable/ic_launcher" />
小插曲:
如果我们只提供一个图片来适配不同屏幕密度的设备的话,就要考虑放在哪个文件夹下了。
我们以Nexus5为例,如果我们把图片放在drawable-xxhdpi下,占用的内存最小(凯子哥的例子是11.65M),如果放在drawable或drawable-mdpi下,占用的内存将会非常大(凯子哥的例子是74.95M)。如果放在drawable-hdpi下占用的为35.38M(同一张图片),所以,我们要提供不同尺寸的图片来适配不同的屏幕密度,否则可能会很大程度上浪费内存。
链接:http://www.jianshu.com/p/ad563d169871
- Andorid 自适应UI
- andorid ui界面设计技术分享
- jqGrid ui自适应窗口
- cocos2dx UI自适应屏幕
- UI中的自适应高度
- andorid- 利用非ui线程绘图方法
- andorid ui自动化测试4种策略
- [Andorid] inflate使用 以及 UI线程安全问题
- ios andorid ui图之间的转换
- Andorid关于注册游戏帐号界面(UI)
- 【Andorid学习笔记】常见的UI布局
- Andorid UI显示在状态栏下面
- Android UI自适应屏幕大小
- 5.2 创建自适应的UI
- Android UI自适应屏幕大小
- Android 之UI自适应解决方案
- Android之UI自适应解决方案
- 关于android UI布局自适应
- 链栈
- UserNotification UNNotificationTrigger 本地普通用法 循环提醒,修改
- webpack-dev-server不能自动刷新问题
- Android 自定义实现日历控件
- Python学习笔记——高级特性
- Andorid 自适应UI
- Acm1-输入出and结构体
- python核心编程课后习题-正则式1
- dubbox 在实际项目中的使用
- 在某软的酸甜苦辣
- OutOfMemoryError异常
- 2017_NOIP初赛
- JZOJ5440. 【NOIP2017提高A组冲刺11.1】背包
- Java8函数式编程实践精华