1.限定符

为了适配不同屏幕大小的android手机或android平板,有时候就需要利用限定符来为不同的屏幕设定不同的布局文件,在一般情况下我们都是在layout文件夹下为某个活动准备一个默认的布局文件,而在大屏幕设备上,这个布局文件可能就不怎么适用了。因此,我们可以利用限定符large,在res目录下新建一个layout_large文件夹,再新建一个同名的布局文件。
这样,当程序运行在了大屏幕设备上时,android就会自动地加载layout_large文件夹下的布局文件,其他情况下还是会加载layout文件下的布局文件。这样,当程序运行在不同屏幕大小的手机上时都可以有比较完美的布局了。android3.2以后,可以通过使用最小宽度限定符来为不同屏幕提供精确的布局。使用方式:swdp,如layout-sw600dp, values-sw600dp。这里的sw代表smallwidth的意思,当你所有屏幕的最小宽度都大于600dp时,屏幕就会自动到带sw600dp后缀的资源文件里去寻找相关资源文件,这里的最小宽度是指屏幕宽高的较小值,每个屏幕都是固定的,不会随着屏幕横向纵向改变而改变。

常用限定符:

2.使用布局别名

首先在values/dimens.xml中有个值width,为160dp

  1. <dimen name="width">160dp</dimen>
  2. <dimen name="width_sw480">240dp</dimen>

我们需要在240dpi的手机上把值设为240dp,使用布局别名的方式来实现。分别新建values/large/dimens.xml和values/sw480dp/dimens.xml,其中的文件内容都一样

  1. <item name="width" type="dimen">@dimen/width_sw480</item>

这里的意思就是为width提供别名width_sw480,这样在240dpi的手机上就会使用width_sw480所指定的值了,以后修改也只需改动一处,非常方便。当然布局别名也不仅限于dimens,也可用于layout,strings等文件,使用何种类型的布局别名是通过指定type来实现的。

3.自动生成dimens.xml文件

Android App的屏幕适配,按照官方的办法是layout文件引用dimen变量,  变量放在多个不同分辨率下的dimens.xml文件中,分别放在不同的目录下,人工处理这些dimens.xml,感觉比较麻烦,就是个体力活,于是做了个工具类按比例自动化生成dimens.xml文件,效率瞬间提高了很多倍,如果需要特殊定义尺寸,放到另一个xml文件里面就行了。

  1. import java.io.BufferedReader;
  2. import java.io.BufferedWriter;
  3. import java.io.File;
  4. import java.io.FileReader;
  5. import java.io.FileWriter;
  6. import java.io.IOException;
  7. import java.io.PrintWriter;
  8.  
  9. /**
  10. * Created by cdy on 2016/2/3.
  11. * 快速生成适配工具类
  12. */
  13. public class DimenTool {
  14.  
  15. public static void gen() {
  16. //以此文件夹下的dimens.xml文件内容为初始值参照
  17. File file = new File("./app/src/main/res/values/dimens.xml");
  18.  
  19. BufferedReader reader = null;
  20. StringBuilder sw240 = new StringBuilder();
  21. StringBuilder sw480 = new StringBuilder();
  22. StringBuilder sw600 = new StringBuilder();
  23.  
  24. StringBuilder sw720 = new StringBuilder();
  25.  
  26. StringBuilder sw800 = new StringBuilder();
  27.  
  28. StringBuilder w820 = new StringBuilder();
  29.  
  30. try {
  31.  
  32. System.out.println("生成不同分辨率:");
  33.  
  34. reader = new BufferedReader(new FileReader(file));
  35.  
  36. String tempString;
  37.  
  38. int line = 1;
  39.  
  40. // 一次读入一行,直到读入null为文件结束
  41.  
  42. while ((tempString = reader.readLine()) != null) {
  43.  
  44. if (tempString.contains("</dimen>")) {
  45.  
  46. //tempString = tempString.replaceAll(" ", "");
  47.  
  48. String start = tempString.substring(0, tempString.indexOf(">") + 1);
  49.  
  50. String end = tempString.substring(tempString.lastIndexOf("<") - 2);
  51. //截取<dimen></dimen>标签内的内容,从>右括号开始,到左括号减2,取得配置的数字
  52. Double num = Double.parseDouble
  53. (tempString.substring(tempString.indexOf(">") + 1,
  54. tempString.indexOf("</dimen>") - 2));
  55.  
  56. //根据不同的尺寸,计算新的值,拼接新的字符串,并且结尾处换行。
  57. sw240.append(start).append( num * 0.75).append(end).append("\r\n");
  58.  
  59. sw480.append(start).append(num * 1.5).append(end).append("\r\n");
  60.  
  61. sw600.append(start).append(num * 1.87).append(end).append("\r\n");
  62.  
  63. sw720.append(start).append(num * 2.25).append(end).append("\r\n");
  64.  
  65. sw800.append(start).append(num * 2.5).append(end).append("\r\n");
  66.  
  67. w820.append(start).append(num * 2.56).append(end).append("\r\n");
  68.  
  69. } else {
  70. sw240.append(tempString).append("");
  71.  
  72. sw480.append(tempString).append("");
  73.  
  74. sw600.append(tempString).append("");
  75.  
  76. sw720.append(tempString).append("");
  77.  
  78. sw800.append(tempString).append("");
  79.  
  80. w820.append(tempString).append("");
  81.  
  82. }
  83.  
  84. line++;
  85.  
  86. }
  87.  
  88. reader.close();
  89. System.out.println("<!-- sw240 -->");
  90.  
  91. System.out.println(sw240);
  92.  
  93. System.out.println("<!-- sw480 -->");
  94.  
  95. System.out.println(sw480);
  96.  
  97. System.out.println("<!-- sw600 -->");
  98.  
  99. System.out.println(sw600);
  100.  
  101. System.out.println("<!-- sw720 -->");
  102.  
  103. System.out.println(sw720);
  104.  
  105. System.out.println("<!-- sw800 -->");
  106.  
  107. System.out.println(sw800);
  108.  
  109. String sw240file = "./app/src/main/res/values-sw240dp-land/dimens.xml";
  110.  
  111. String sw480file = "./app/src/main/res/values-sw480dp-land/dimens.xml";
  112.  
  113. String sw600file = "./app/src/main/res/values-sw600dp-land/dimens.xml";
  114.  
  115. String sw720file = "./app/src/main/res/values-sw720dp-land/dimens.xml";
  116.  
  117. String sw800file = "./app/src/main/res/values-sw800dp-land/dimens.xml";
  118.  
  119. String w820file = "./app/src/main/res/values-w820dp/dimens.xml";
  120. //将新的内容,写入到指定的文件中去
  121. writeFile(sw240file, sw240.toString());
  122.  
  123. writeFile(sw480file, sw480.toString());
  124.  
  125. writeFile(sw600file, sw600.toString());
  126.  
  127. writeFile(sw720file, sw720.toString());
  128.  
  129. writeFile(sw800file, sw800.toString());
  130.  
  131. writeFile(w820file, w820.toString());
  132.  
  133. } catch (IOException e) {
  134.  
  135. e.printStackTrace();
  136.  
  137. } finally {
  138.  
  139. if (reader != null) {
  140.  
  141. try {
  142.  
  143. reader.close();
  144.  
  145. } catch (IOException e1) {
  146.  
  147. e1.printStackTrace();
  148.  
  149. }
  150.  
  151. }
  152.  
  153. }
  154.  
  155. }
  156.  
  157. /**
  158. * 写入方法
  159. *
  160. */
  161.  
  162. public static void writeFile(String file, String text) {
  163.  
  164. PrintWriter out = null;
  165.  
  166. try {
  167.  
  168. out = new PrintWriter(new BufferedWriter(new FileWriter(file)));
  169.  
  170. out.println(text);
  171.  
  172. } catch (IOException e) {
  173.  
  174. e.printStackTrace();
  175.  
  176. }
  177.  
  178. out.close();
  179.  
  180. }
  181. public static void main(String[] args) {
  182.  
  183. gen();
  184.  
  185. }
  186.  
  187. }

Android屏幕适配笔记的更多相关文章

  1. Android 屏幕适配方案

    转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/45460089: 本文出自:[张鸿洋的博客] 1.概述 大家在Android开发 ...

  2. Android 屏幕适配:最全面的解决方案

    转自:https://www.jianshu.com/p/ec5a1a30694b 前言 Android的屏幕适配一直以来都在折磨着我们Android开发者,本文将结合: Google的官方权威适配文 ...

  3. Android屏幕适配技巧

    屏幕适配一直是困扰 Android 开发工程师的一大问题,但是随着近几年各种屏幕适配方案的诞生,以及谷歌各种适配控件的推出,屏幕适配也显得越来越容易,这节课我们就来总结一下关于屏幕适配的那些技巧. C ...

  4. Android屏幕适配全攻略 (转载)

    http://blog.csdn.net/jdsjlzx/article/details/45891551 https://github.com/hongyangAndroid/AndroidAuto ...

  5. 【收藏】Android屏幕适配全攻略(最权威的Google官方适配指导)

    来源:http://blog.csdn.net/zhaokaiqiang1992 更多:Android AutoLayout全新的适配方式, 堪称适配终结者 Android的屏幕适配一直以来都在折磨着 ...

  6. Android屏幕适配全攻略(最权威的官方适配指导)(转),共大家分享。

    Android的屏幕适配一直以来都在折磨着我们这些开发者,本篇文章以Google的官方文档为基础,全面而深入的讲解了Android屏幕适配的原因.重要概念.解决方案及最佳实践,我相信如果你能认真的学习 ...

  7. Android屏幕适配全攻略(最权威的官方适配指导) (转)

    招聘信息: Cocos2d-X 前端主程 [新浪微博]手机客户端iOS研发工程师 20k-40k iOS 开发工程师 iOS高级开发工程师(中国排名第一的企业级移动互联网云计算公司 和创科技 红圈营销 ...

  8. 腾讯优测| 让Android屏幕适配开发更简单-Google百分比布

    文/腾讯优测工程师 吴宇焕 腾讯优测优社区干货精选~ 相信开发同学都被安卓设备碎片化的问题折磨过,市面上安卓手机的主流屏幕尺寸种类繁多,给适配造成很大的困难.就算搞定了屏幕尺寸问题,各种分辨率又让人眼 ...

  9. Android 屏幕适配(一)百分比布局库(percent-support-lib) 解析与扩展

    转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/46695347: 本文出自:[张鸿洋的博客] 一.概述 周末游戏打得过猛,于是周 ...

随机推荐

  1. repo 修改邮箱地址

    需要重新运行 repo init 被带上参数: --config-name xx@a.com

  2. linux常用命令的介绍

    本文主要介绍Linux常用命令工具,比如用户创建,删除,文件管理,常见的网络命令等 如何创建账号: 1. 创建用户 useradd -m username -m 表示会在/home 路径下添加创建用户 ...

  3. git 发布命令

    git add . git commit -m "备注" git push -u origin master

  4. EF操作多数据库

    1.Account3_Register_DB_Model作为(空)模板库,根据此模板生成的其他数据除了数据库名称不一样,其他表,视图,字段等等都一致 2.Account3_Platform_Maste ...

  5. sh1.shell脚本练习

    练习: 1.写一个脚本 判断当前系统上是否有用户的默认shell为bash 如果有,就显示其中一个的用户名:否则,就显示没有这类用户. #!/bin/bash grep "bash$&quo ...

  6. monkey工具使用中遇到的问题之二:尝试了各种方法通过adb都无法找到设备

    测试环境: 1.用的是adt-bundle-windows-x86_64-20140702里面的adb 2.用的是手机模拟器(夜神) 问题描述: 已搭建好adb的环境,输入adb,可以看到以下相关信息 ...

  7. [Android Pro] Scroller使用分析

    reference to : http://blog.csdn.net/a910626/article/details/51548840 一.Scroller是什么? Android里 Scrolle ...

  8. JAVA图片验证码

    package hh.com.util; import java.io.IOException; import javax.servlet.ServletException; import javax ...

  9. Js动态设置rem来实现移动端字体的自适应

    //设置根元素字体 var win = window, doc = document; function setFontSize() { var winWidth = $(window).width( ...

  10. HTTrack 网站备份工具

    HTTrack可以克隆指定网站-把整个网站下载到本地.可以用在离线浏览上,免费的噢! 强大的Httrack类似于搜索引擎的爬虫,也可以用来收集信息.记得之前写过篇http://www.cnblogs. ...