您的位置:首页 > 移动开发 > Android开发

Android屏幕适配

2016-06-26 13:52 507 查看

基本概念

1 屏幕的大小 : 屏幕的对角线的英寸数值。

2 分辨率:eg:480*800,1280*720. 表示物理屏幕区域内像素点的总和.
   
   因为我既可以把1280*720的分辨率做到4.0的手机上面。我也可以把1280*720的分辨率做到5.0英寸的手机上面.
   如果分辨率相同。手机屏幕越小清晰:

3 dpi : 密度 (每一个英寸物理屏幕区域内的像素点)
也就是:对角线上面一个英寸分布的像素点数量,勾股定理可求得
以1280x720的分辨率,5英寸手机为例,求dpi:

Math.sqrt(1280*1280+720*720)/5 = 293.73dpi  
dpi和ppi一样

多套图适配:多少个分辨率切多少套图片,导致应用程序很大,

800*480  1280*720 1920*1080
一套图适配:(一般做800*480的,小图不管,拉伸不明显,大图按照各个分辨率去另做图)

适配方式

图片适配:

不同像素密度的手机,加载不同drawable文件夹下图片,如果当前手机对应像素密度下没有图片,找高分辨率的文件夹

像素密度dpi与drawable目录有如下对应关系:



一般情况下每种分辨率所搭载的手机尺寸是有范围的,(虽然理论上分辨率和手机尺寸可以随意搭配,例如山寨机把小的分辨率搭配过大的手机屏幕,严重模糊)

例如800*480 分辨率一般搭载3.7-4.3左右  4寸最常见

所以一般分辨率与dpi的对应关系

ldpi ---320*240
mdp---如果不放图片就去hdpi中加载
hdpi---800*480
xhdpi---1280*720
xxhdpi---1920*1080

dimens.xml适配:



dp不能适配,所以在不同分辨率的手机valus文件夹下面去设置不同的dp值,放在dimens.xml文件中,不同的分辨率手机会加载对应文件夹下的dimens.xml,如果对应分辨率下的dimens.xml文件中没有某属性的定义,就去默认的dimens.xml文件中寻找(values文件夹下的dimens.xml)所以一定要保证要适配的属性,在默认文件夹下的dimens.xml也存在,以防找不到属性定义报错。

dp与像素的对应关系:



计算之后,对比一般分辨率与dpi的对应关系表,得出结论:dp不适配

ldpi   1dp = 0.75px    160dp = 120px   240px中间
mdpi   1dp = 1px       160dp = 160px   320px中间
hdpi   1dp = 1.5px     160dp = 240px   480px中间
xhdpi  1dp = 2px       160dp = 320px   640px中间    720个像素
xxdpi  1dp = 3px       160dp = 480px   960px中间    1080

布局适配



不同分辨率的手机,加载不同文件夹下的的布局文件

java代码适配

给当前的控件设置宽高为,屏幕宽高的百分比

屏幕宽高,控件宽高为屏幕宽高的各0.5,设置在当前控件的父布局,然后作用在子控件上

//存储屏幕相关信息的对象
DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
//屏幕宽度上分布的像素点
int width = displayMetrics.widthPixels;
int height = displayMetrics.heightPixels;

Log.i(tag, "width = "+width);
Log.i(tag, "height = "+height);

//将对应的宽高设置给其夫控件,然后作用在子控件上
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
//从数学的角度进行四舍五入
//160*0.5 = 80
//161.2*0.5 = 80.6+0.5= 81.1
(int)(width*0.5+0.5),
(int)(height*0.5+0.5));

TextView textView = (TextView) findViewById(R.id.tv);
textView.setLayoutParams(layoutParams);为什么一定要先设置给父控件,然后作用在子控件上呢?
因为android控件都是没有宽高的,只有布局有宽高,控件的宽高都是布局给的,没有了布局,单说控件的宽高没有意义。

权重适配

剩余控件的分配规则,线性布局上才有权重,width = 0dp,height = 0dp,由权重决定控件在线性布局中的比重
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  屏幕适配