今日头条屏幕适配思路
Android中xml布局文件中写的是什么单位最终会转化成px
#applyDimension
public static float applyDimension(int unit, float value,
DisplayMetrics metrics)
{
switch (unit) {
case COMPLEX_UNIT_PX:
// px
return value;
case COMPLEX_UNIT_DIP:
// dp * density
return value * metrics.density;
case COMPLEX_UNIT_SP:
// sp * scaledDensity
return value * metrics.scaledDensity;
case COMPLEX_UNIT_PT:
return value * metrics.xdpi * (1.0f/72);
case COMPLEX_UNIT_IN:
return value * metrics.xdpi;
case COMPLEX_UNIT_MM:
return value * metrics.xdpi * (1.0f/25.4f);
}
return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
我们在开发过程中,主要用px、dip、sp这三种单位比较多一些
dip = value * ;
通过上面返回值可以发现 dip = value *
如果能把DisplayMetrics里面的density常量值进行修改,不就可以在不用分辨率手机缩放显示一样的效果。
实现
我的手机宽度是720px,宽度是360dp
case COMPLEX_UNIT_DIP:
return value * metrics.density;
- 1
- 2
如果ui给出设计图总宽度为 360 dp,那么如果有一个控件在设计图上的宽为180dp、高为180dp那么这个控件宽度占整个设计图宽度的一半 (180 / 360 = 0.5)
(dp * density = px)
系统最后将高宽dp都换算成 px,180dp * 2 = 360px
public class Density {
//ui参考设备的宽,dp
private static final float WIDTH = 360;
private static float appDensity;
public static void setDensity(final Application application, Activity activity) {
DisplayMetrics displayMetrics = application.getResources().getDisplayMetrics();
if (appDensity == 0) {
appDensity = displayMetrics.density;
}
//计算目标值density,densityDpi
float targetDensity = displayMetrics.widthPixels / WIDTH;
int targetDensityDpi = (int) (targetDensity * 160);
DisplayMetrics dm = activity.getResources().getDisplayMetrics();
dm.density = targetDensity;
dm.densityDpi = targetDensityDpi;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
验证
720* 1080分辨率手机 density = 2
1080*1920分辨率手机 density=3
今日头条屏幕适配方案