昨天就没有更新文章,在不更新就说不过去了,今天是清明节的第一天,我没有出去玩,不过在我心里是这么认为的,心中有风景,到哪都是旅游。不好意思,扯远啦,收回来。

做过Android项目的人应该都知道,Android的屏幕适配问题是比较烦人的,因为Android不像IOS那样,只要那几个分辨率,反观Android就不同,Android手机的屏幕分辨率类别太多。虽然本人也没有做过几个Android项目,但是今天还是想谈谈Anroid的屏幕适配,当做是一个对自己学习的总结吧,如果有没有涉及的地方,还请大家多多指教。

本人把Android的屏幕适配问题分为5个模块,分别是图片适配、布局适配、尺寸适配、权重适配、代码适配。

前言

开发过Android的同学应该都知道,在Android的res目录下有这样几个目录,分别是drawable-hdpi、drawable-ldpi、drawable-mdpi、drawable-xdpi、drawable-xxhdpi。

  • drawable-hdpi:高分辨率
  • drawable-ldpi:低分辨率
  • drawable-mdpi:中等分辨率
  • drawable-xdpi:更高分辨率
  • drawable-xxdpi:最高分辨率

图片适配

在刚开始学习Android的时候,只知道把图片直接拷贝都drawable-hdpi目录下,一开始的时候只知道这几个目录是用来做屏幕适配的,现在终于了解到了,现在我来模拟一个场景让大家了解什么是图片适配。但是这种适配我们一般用的比较少。

假设一个场景,如果一张图片显示在低分辨率的手机上刚好,但是如果它显示到特别高的分辨率手机上的时候,你会感觉它比较小,这个时候,我们就可以让我们的美工美眉切几张不同大小的图片,并它他们放到相对应的目录下,当系统在加载的时候,会根据手机的分辨率对应的目录下查找需要的图片。

布局适配

首先说一下,这个也不是很常用。假设我们要专门适配480x800的屏幕,这里的数值指的都是像素,可以新建一个在src/目录下新建一个layout-800x480 目录,然后把响应的布局拷到这个目录下,即可,说一下一个应用场景。

假设我们在320x480的屏幕上显示一个TextView,但是我们却想让屏幕为480x800的手机在相同的位置上显示一个Button,我们就可以这样弄。

尺寸适配

首先说一个,这个非常常用,首先我们来了解一下dp和px(像素)的关系。dp = px/设备密度 ,那么我们在代码中如何获取设备的密度。使用如下代码即可

float density = getResources().getDisplayMetrics().density;System.out.println("设备密度:" + density);

那么接下来我们说说设备密度值是以什么为参考的,答案是一320x480的设备密度值为1,那么320x240就是0.75,480x800是1.5,1280x720是2。
那么我们要怎么适配呢?我们也模拟一个场景。

假设我们要在屏幕上显示一个宽度为屏幕宽度一般的TextView,怎么看出来它占一半呢?我们可以给这个TextView加一个背景。如果是在320x480的手机上,我们写的160dp和160px效果是相同的,但是其他分辨率的手机,我们绝对不能使用px。假设我们写对了,我们写的是160dp,那么在480x800下效果也是正常的,我来举一个不正常的例子,我的手机的魅族的手机,屏幕分辨率是1800X1080,但是我的手机的设备密度值为2.5。如果要达到相同的效果,我写的应该是216dp。怎么算出来的呢?1080是我手机的宽度,这个是像素哦。那么根据公式,dp = 1080 / 2 /2.5 ==>dp = 216dp。如果我们使用的还是160dp,那么我的手机就显示一小半,但是如果改成了216dp,那么在低分辨率的手机上又显示错误了,这个时候我们应该怎么办呢?我们可以这样做,在dimens.xml中定义一个160dp。在/res目录下,新建一个values-1800x1080目录,把values目录下的dimens.xml复制过去,然后我们把它改成216dp,这样就完成了适配,但是布局文件中我们应该要使用textViewWidth这个尺寸。

权重适配

android:weightSum="3"

这句代码可以定义这个控件的权重值,那么在子控件中只能分配权重为3。这样我们就可以实现两个TextView各占1/3的效果了。

代码适配

通常我们在写代码的时候,不能把尺寸的像素尺寸写死,因为我们要考虑到一个屏幕适配的问题,模拟一个场景。

假设我们在项目使用到了SlidingMenu的开源侧滑菜单,我们要给侧滑菜单的宽度设置为屏幕的1/3,其中有一个方法是设置菜单的宽度,在这里我们就不能给写死了,因为我们写死的值是像素值,它不是dp值,那么我们要做的事就是根据屏幕分辨率来获取到屏幕的1/3是多少个dp值,然后根据dp值和设备密度值来计算像素值,这样才可以设置像素值。下面是一个工具类,用于dp和px的转换。

public class DensityUtil {  /**  * 根据手机的分辨率从 dip 的单位 转成为 px(像素)  */  public static int dip2px(Context context, float dpValue) {      final float scale = context.getResources().getDisplayMetrics().density;      return (int) (dpValue * scale + 0.5f);  }  /**  * 根据手机的分辨率从 px(像素) 的单位 转成为 dp  */  public static int px2dip(Context context, float pxValue) {      final float scale = context.getResources().getDisplayMetrics().density;      return (int) (pxValue / scale + 0.5f);  }  

}

累死了,我要睡了!

更多相关文章

  1. 读取android手机流量信息
  2. Android屏幕分辨率正确获取及PX,DPI,DP,SP等的对应关系
  3. Android系统配置数据库注释(settings.db)
  4. android 获取唯一标识
  5. android 分辨率及密度详细
  6. Android屏幕常亮
  7. android 开机直接运行app并当做手机桌面
  8. Android获取设备唯一标识完美解决方案
  9. Android(安卓)屏幕设置

随机推荐

  1. 【原创】Android之修改AlertDialog对话框
  2. Android 读取raw下的txt文件
  3. Android 四大组件Broadcast
  4. Android Robotium搭建环境测试微信
  5. 【Android】点击应用进而打开base.apk的
  6. Android 遇坑【2】 - ScrollView 嵌套 Li
  7. Android 关闭虚拟按钮、底部导航条
  8. Android 开发环境搭建9传送帖)
  9. Android获取手机短信和通话记录及通讯录
  10. android PopupWindow简单例子