基本参数
以1080*1920 5寸为例
- 屏幕尺寸:对角线,如5寸(1寸约等于2.xxcm)
- 分辨率:1080*1920 有多少个像素点
- dpi(密度,代码里面是densitydpi):(10802+19202 )开方/5存=440dpi
- dp:密度无关像素
- density:dpi/160 谷歌规定
- px= dp*(dpi/160)
- android计算屏幕尺寸是用的px
- 因不同屏幕的宽dp会不一样;所以ui给的比如480dp的规格,在手机上不同屏幕效果不一样
- sp:官方推荐12、14、18、22
刘海屏处理
style或主题里面处理
<item name = "android:windowLayoutInDisplayCutoutMode">
屏幕适配方案
自己计算activity和application的density,dpi,scaleddensity(注意字体也要处理)
private static void setMyDensity(Activity activity, Application application){
if(activity==null){
return;
}
DisplayMetrics applicationDisplayMetrics = application.getResources().getDisplayMetrics();
if(mDensity==0){
mDensity = applicationDisplayMetrics.density;
mScaledDensity = applicationDisplayMetrics.scaledDensity;
application.registerComponentCallbacks(new ComponentCallbacks() {
@Override
public void onConfigurationChanged(@NonNull Configuration configuration) {
if(configuration!=null &&configuration.fontScale >0){
mScaledDensity = application.getResources().getDisplayMetrics().scaledDensity;
}
}
@Override
public void onLowMemory() {
}
});
}
float targetDensity = applicationDisplayMetrics.widthPixels/480;
float targetScaledDensity = targetDensity*(mScaledDensity/mDensity);
int targetDpi = (int)targetDensity*160;
applicationDisplayMetrics.density = targetDensity;
applicationDisplayMetrics.scaledDensity = targetScaledDensity;
applicationDisplayMetrics.densityDpi = targetDpi;
DisplayMetrics activityDisplayMetrics = activity.getResources().getDisplayMetrics();
activityDisplayMetrics.density = targetDensity;
activityDisplayMetrics.scaledDensity = targetScaledDensity;
activityDisplayMetrics.densityDpi = targetDpi;
}
ConstraintLayout
app:layout_constraintStart_toStartOf="@id/xx"
left/right start/end top/bottom
注意:可以理解为弹力,上下拉住,或者左右拉住;拉住同一个边的话可以嵌入该边android:layout_marginxx
注意:哪个控件开始设置就在哪个控件身上操作才有效app:layout_constraintHorizontal_bias="0.1" //Vertical
偏移设置,0时往右偏移,1往左偏移,0.x是偏移百分比app:layout_constraintCircle = "@+id/xx" //以哪个为圆心
app:layout_constraintCircleAngle="36" //36度
app:layout_constraintCircleRadius="100dp" //半径android:layout_width="0dp"
app:layout_constraintWidth_default="wrap"
类似wrap_contentapp:layout_constraintDimensionRatio="16:9"//w,16:9 h,16:9
控件比例,可以改宽高比例顺序app:layout_constraintWidth_max = "20dp"
仅在android:layout_width="0dp"下有用;高同理app:layout_constraintWidth_min="20dp"
仅在android:layout_width="wrap_content" 模式下,且app:layout_constrainedWidth="true"有效(设置了5 则不用第2点)app:layout_constraintHorizontal_chainStyle="packed"
链式布局:如果A,B,C3个控件相互收尾连接,则可以在第一个上面设置chainStyle 处理3种展示方式 packed;spread;spread_inside
可以根据bias带偏移<androidx.constraintlayout.widget.GuideLine //画约束线范围,源码中无draw
android:orientation="horizontal"
app:layout_constraintGuide_percent = "0.x"//按百分比来话,建议此方式<androidx.constraintlayout.widget.Barrier
类似guideline 不过辅助线可以随控件变动位置,用的时候再看<androidx.constraintlayout.widget.Group
用的时候再看<androidx.constraintlayout.widget.Placeholder
用的时候再看