屏幕适配
dpi
|缩写| 全拼|含义|
|l|low|低密度|
|m|medium|中密度|
|h|hign|高密度|
|xh|extra-hign|额外高密度|
|xxh|extra-extra-hign|双额外高密度|
如何计算dpi?
dpi是像素密度,根据勾股定理得出手机对角线的长度,除以手机是x寸的x,得出的值是dpi。
图:
规则
型号
dpi
比例
常见的分辨率
L
120
1dp = 0.75dpi
M
160
1dp = 1dpi
H
240
1dp = 1.5dpi
XH
320
1dp = 2dpi
1280*720(5寸)
XXH
480
1dp = 3dpi
图:
分类:
图片适配
layout适配
dimens适配
权重适配weight
java代码适配
其中,前4种就是为不同分辨率的手机,加载不同的文件。每一种分辨率都已对应的一个文件夹。
##1 图片适配 ##
在5中drawable文件夹下分别放置对应的图片,当app开启后,会根据手机的分辨率去动态的加载分辨率对应的drawable文件夹中的图片。
我们分别在mipmap-hdpi 和mipmap-xhdpi下放置了猫和狗的图片,启动2个手机,分辨率分别是800480、1280720
###逻辑
|型号|动物|
|--|--|
|mdpi|猫|
|hdpi|狗|
|xhdpi|老虎|
模拟器都是5寸
分辨率
dpi
屏幕尺寸
接近的型号
800*480
252dpi
3.7寸
hdpi
1280*720
293dpi
5寸
xhdpi
###结果如图:
2 layout适配
为特定的手机分辨率额外创建对应的layout文件夹
我们创建layout_1280x720 + layout-800*480这2个文件夹,里面的内容分别是“1280x720”、“800x480”,运行到分辨率是1280x720的手机上,只显示“1280x720”。
3 dimens适配
在5种values文件夹下放置不同的dimens.xml,当app开启后,会根据手机的分辨率去动态的加载分辨率对应的values文件夹中dimens.xml,实现控件的宽高的适配。
4 权重适配
就是利用属性weight来确定占用几份
效果图:
代码:
android:layout_width="match_parent"
android:layout_height="50dp"
android:orientation="horizontal">
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="#ff0000"
android:text="tab1"/>
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="2"
android:background="#ff00ff"
android:text="tab2"/>
5 代码适配
利用代码动态设置,比如设置TextView的宽度是屏幕的宽的一半,再设置控件的高为屏幕的1/5.
效果图:
代码:
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.cqc.adapterjava.MainActivity">
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:background="#ff00ff"
android:text="Hello World!"/>
public class MainActivity extends AppCompatActivity {
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.tv);
//拿到屏幕的宽高
getWindowParams();
}
private void getWindowParams() {
//创建对象
DisplayMetrics metrics = new DisplayMetrics();
//将宽高信息存放在对象中
MainActivity.this.getWindowManager().getDefaultDisplay().getMetrics(metrics);
//取值
int width = (int) (metrics.widthPixels/2 + 0.5);
int height = (int) (metrics.heightPixels/5+0.5);
//设置宽高,至于导入哪个layout,要看tv的父布局是哪个layout
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(width,height);
tv.setLayoutParams(params);
}
}
其它:
flot转int:直接把小数点去掉,只保留整数,即:
(int)5.1 --》5
(int)5.6--》5
5.6更接近6,而不是5,取整显然不符合现实,所以通常+0.5,即:
(int)(5.1+0.5) --》5
(int)(5.6+0.5)--》6
##屏幕适配源码:##