博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android屏幕适配
阅读量:3985 次
发布时间:2019-05-24

本文共 2043 字,大约阅读时间需要 6 分钟。

基本概念

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,由权重决定控件在线性布局中的比重

你可能感兴趣的文章
微信小程序开发全线记录
查看>>
Centos import torchvision 出现 No module named ‘_lzma‘
查看>>
网页设计里的浮动 属性
查看>>
Maximum Subsequence Sum
查看>>
PTA:一元多项式的加乘运算
查看>>
CCF 分蛋糕
查看>>
解决python2.7中UnicodeEncodeError
查看>>
小谈python 输出
查看>>
Django objects.all()、objects.get()与objects.filter()之间的区别介绍
查看>>
python:如何将excel文件转化成CSV格式
查看>>
Django 的Error: [Errno 10013]错误
查看>>
机器学习实战之决策树(一)
查看>>
[LeetCode By Python] 2 Add Two Number
查看>>
python 中的 if __name__=='__main__' 作用
查看>>
机器学习实战之决策树二
查看>>
[LeetCode By Python]7 Reverse Integer
查看>>
[LeetCode By Python]9. Palindrome Number
查看>>
[LeetCode By Python]13 Roman to Integer
查看>>
[leetCode By Python] 14. Longest Common Prefix
查看>>
[LeetCode By Python]107. Binary Tree Level Order Traversal II
查看>>