原因:Android设备碎片化,导致APP的界面元素在不同的屏幕尺寸上显示不一致。
目的:让布局,布局组件,资源,用户界面流程,匹配不同的屏幕尺寸。
布局适配
1、避免写死控件尺寸,使用match_parent,wrap_content。
2、LinearLayout使用android:layout_weight=“1”,android:weightSum="4"等等。
3、RelativeLayout的android:layout_centerInParent=“true”,
android:layout_centerVertical=“true”,android:layout_centerHorizontal=“true”
4、ConstraintLayout(RelativeLayout的加强版,更强大的功能)
5、百分比库
图片资源适配
1、使用.9或者svg图实现缩放
2、使用多套位图匹配不同的屏幕分辨率
用户流程适配
1、根据业务逻辑执行不同的跳转逻辑
2、根据别名展示不同的界面
限定符适配
1、分辨率限定符mipmap-hdpi,drawable-hdpi等等
2、尺寸限定符:layout-small,layout-large等
3、最小宽度限定符:values-sw360dp,values-sw480dp等
4、屏幕方向限定符:layout-land,layout-port等
刘海屏适配
Android 9.0官方适配
华为、OPPO、VIVO,、小米等等
自定义像素适配,自定义View来适配。
以一个特定宽度尺寸的设备为参考,在View的加载过程中,根据当前设备的实际像素换算出目标像素,再作用在控件上。
public class ScreenAdapterUtils {
//设计稿参考宽高
private static final float STANDARD_WIDTH = 1080;
private static final float STANDARD_HEIGHT = 1920;
//屏幕显示宽高
private int mScreenWidth;
private int mScreenHeight;
private static ScreenAdapterUtils mInstance;
public static ScreenAdapterUtils getInstance(Context context) {
if (mInstance == null) {
synchronized (ScreenAdapterUtils.class) {
if (mInstance == null) {
mInstance = new ScreenAdapterUtils(context.getApplicationContext());
}
}
}
return mInstance;
}
private ScreenAdapterUtils(Context context) {
if (mScreenHeight == 0 || mScreenWidth == 0) {
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
if (wm != null) {
DisplayMetrics metrics = new DisplayMetrics();
wm.getDefaultDisplay().getMetrics(metrics);
if (metrics.widthPixels > metrics.heightPixels) {
// 横屏
mScreenWidth = metrics.heightPixels;
mScreenHeight = metrics.widthPixels;
} else {
// 竖屏
mScreenWidth = metrics.widthPixels;
mScreenHeight = metrics.heightPixels - getStatusBarHeight(context);
}
}
}
}
public int getStatusBarHeight(Context context) {
int resId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resId > 0) {
return context.getResources().getDimensionPixelSize(resId);
}
return 0;
}
//获取水平方向的缩放比例
public float getHorizontalScale(){
return mScreenWidth / STANDARD_WIDTH;
}
//获取垂直方向的缩放比例
public float getVerticalScale(){
return mScreenHeight / STANDARD_HEIGHT;
}
}
public class ScreenAdapterLayout extends LinearLayout {
/**
* 是否被测量
*/
private boolean isMeasure;
public ScreenAdapterLayout(Context context) {
super(context);
}
public ScreenAdapterLayout(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
public ScreenAdapterLayout(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
if (!isMeasure) {
// 获取横向缩放比
float horizontalScale = ScreenAdapterUtils.getInstance(getContext()).getHorizontalScale();
// 获取纵向缩放比
float verticalScale = ScreenAdapterUtils.getInstance(getContext()).getVerticalScale();
// 重新计算所有子View的尺寸
int childCount = getChildCount();
for (int i = 0; i < childCount; i++) {
// 获取子View重新进行测量
View child = getChildAt(i);
LayoutParams params = (LayoutParams) child.getLayoutParams();
// 根据宽高的缩放比,重新计算目标View的真实宽高
params.width = (int) (params.width * horizontalScale);
// 这样缩放,如果我们设置的宽高是一样的,你会发现在水平和数值方向上的缩放比不一样的时候
// 控件会被拉伸,不能达到我们想要的正确的相同宽高
// params.height = (int) (params.height * verticalScale);
// 如果改成都使用水平的缩放比,就刚好正确
params.height = (int) (params.height * horizontalScale);
// 计算目标View四周的间距
params.leftMargin = (int) (params.leftMargin * horizontalScale);
params.rightMargin = (int) (params.rightMargin * horizontalScale);
params.topMargin = (int) (params.topMargin * verticalScale);
params.bottomMargin = (int) (params.bottomMargin * verticalScale);
}
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
布局文件
<com.dh.summarize.view.ScreenAdapterLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="540px"
android:layout_height="540px"
android:background="@color/colorAccent"/>
</com.dh.summarize.view.ScreenAdapterLayout>
自定义View像素适配,不能穿透适配,也就是当前容器是像素适配容器,它其中如果还有容器需要适配,也依然要使用像素适配容器。造成的结果就是如果需求更改,会改的很惨。O(∩_∩)O哈哈~。
自定义百分比适配,继承对应的ViewGroup,在使用百分比适配的情况下,不影响ViewGroup本身的属性的使用。
Google本身提供了百分比库,我们正常情况下需要使用直接导入Google的百分比库就好。
以下例子我们直接继承RelativeLayout,在
public class PercentRelativeLayout extends RelativeLayout {
public PercentRelativeLayout(Context context) {
super(context);
}
public PercentRelativeLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
public PercentRelativeLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// 获取父容器的宽高
int parentWidth = MeasureSpec.getSize(widthMeasureSpec);
int parentHeight = MeasureSpec.getSize(heightMeasureSpec);
final int childCount = getChildCount();
for (int i = 0; i < childCount; i++) {
View child = getChildAt(i);
ViewGroup.LayoutParams layoutParams = child.getLayoutParams();
// 判断LayoutParams是否是百分比属性
if (layoutParams instanceof LayoutParams) {
LayoutParams params = (LayoutParams) layoutParams;
float widthPercent = params.widthPercent;
float heightPercent = params.heightPercent;
float marginLeftPercent = params.marginLeftPercent;
float marginRightPercent = params.marginRightPercent;
float marginTopPercent = params.marginTopPercent;
float marginBottomPercent = params.marginBottomPercent;
if (widthPercent > 0) {
params.width = (int) (parentWidth * widthPercent);
}
if (heightPercent > 0) {
params.height = (int) (parentHeight * heightPercent);
}
if (marginLeftPercent > 0) {
params.leftMargin = (int) (parentWidth * marginLeftPercent);
}
if (marginRightPercent > 0) {
params.rightMargin = (int) (parentWidth * marginRightPercent);
}
if (marginTopPercent > 0) {
params.topMargin = (int) (parentHeight * marginTopPercent);
}
if (marginBottomPercent > 0) {
params.bottomMargin = (int) (parentHeight * marginBottomPercent);
}
}
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
@Override
public LayoutParams generateLayoutParams(AttributeSet attrs) {
return new LayoutParams(getContext(), attrs);
}
@Override
protected boolean checkLayoutParams(ViewGroup.LayoutParams p) {
return p instanceof LayoutParams;
}
public static class LayoutParams extends RelativeLayout.LayoutParams {
private float widthPercent;
private float heightPercent;
private float marginLeftPercent;
private float marginRightPercent;
private float marginTopPercent;
private float marginBottomPercent;
public LayoutParams(Context c, AttributeSet attrs) {
super(c, attrs);
@SuppressLint("CustomViewStyleable")
TypedArray typedArray = c.obtainStyledAttributes(attrs, R.styleable.PercentRelativeLayout);
widthPercent = typedArray.getFloat(R.styleable.PercentRelativeLayout_widthPercent, 0);
heightPercent = typedArray.getFloat(R.styleable.PercentRelativeLayout_heightPercent, 0);
marginLeftPercent = typedArray.getFloat(R.styleable.PercentRelativeLayout_marginLeftPercent, 0);
marginRightPercent = typedArray.getFloat(R.styleable.PercentRelativeLayout_marginRightPercent, 0);
marginTopPercent = typedArray.getFloat(R.styleable.PercentRelativeLayout_marginTopPercent, 0);
marginBottomPercent = typedArray.getFloat(R.styleable.PercentRelativeLayout_marginBottomPercent, 0);
typedArray.recycle();
}
}
}
具体使用
<com.dh.summarize.view.PercentRelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@color/colorAccent"
android:textSize="20sp"
android:text="宽:33%,高:50%"
app:widthPercent = "0.33"
app:heightPercent = "0.5"
android:gravity="center_vertical"/>
</com.dh.summarize.view.PercentRelativeLayout>
我们设置的百分比都是相对于父容器的,相对于父容器的宽度百分比,高度百分比
我最早知道是今日头条开放出来的,具体可以参考
字节跳动:一种极低成本的Android屏幕适配方式
修改density(屏幕密度),scaleDensity(一般用于字体,通常情况下与density相等),densityDpi(屏幕上每一英寸的像素点)的值,直接更改系统内部对于目标尺寸而言的像素密度。
就是根据设计稿去修改目标Activity的Density等值
public class DensityUtils {
/**
* 设计稿宽度(dp)
*/
private static final float DEFAULT_WIDTH = 360;
// 屏幕密度
private static float appDensity;
// 字体缩放比,默认就是appDensity
private static float appScaleDensity;
public static void setCustomDensity(Application application, Activity activity) {
DisplayMetrics displayMetrics = application.getResources().getDisplayMetrics();
if (appDensity == 0) {
// 初始化值
appDensity = displayMetrics.density;
appScaleDensity = displayMetrics.scaledDensity;
// 由于我们在系统设置中切换了文字大小,需要改变应用本身的文字大小
application.registerComponentCallbacks(new ComponentCallbacks() {
// 监听系统配置切换
@Override
public void onConfigurationChanged(@NonNull Configuration newConfig) {
if (newConfig != null && newConfig.fontScale > 0) {
// 重新获取scaleDensity
appScaleDensity = application.getResources().getDisplayMetrics().scaledDensity;
}
}
@Override
public void onLowMemory() {
}
});
}
// 计算所有的目标值
float targetDensity = displayMetrics.widthPixels / DEFAULT_WIDTH;
float targetScaleDensity = targetDensity * (appScaleDensity / appDensity);
// density = dpi / 160
int targetDensityDpi = (int) (targetDensity * 160);
// 将Activity的Density,ScaleDensity,DensityDpi
DisplayMetrics dm = activity.getResources().getDisplayMetrics();
dm.density = targetDensity;
dm.scaledDensity = targetScaleDensity;
dm.densityDpi = targetDensityDpi;
}
}
工具类具体调用在Activity的onCreate()的setContentView()方法之前。可以在每个Activity单独设置,也可以在BaseActivity中设置,或者在Application实现Activity的监听。
Application的onCreate()中监听,自己实现一个BaseApplication继承Application。
registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
DensityUtils.setCustomDensity(this, activity)
}
@Override
public void onActivityStarted(Activity activity) {
}
@Override
public void onActivityResumed(Activity activity) {
}
@Override
public void onActivityPaused(Activity activity) {
}
@Override
public void onActivityStopped(Activity activity) {
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
}
@Override
public void onActivityDestroyed(Activity activity) {
}
});
布局文件,我们适配稿给的360dp的宽度,所以我们分别对两个控件设置180dp,实际适配之后结果应该是平分屏幕宽度。
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tvOne"
android:layout_width="180dp"
android:layout_height="100dp"
android:background="@color/colorAccent"
android:textSize="20sp"
android:text="测试1"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
android:gravity="center"/>
<TextView
android:id="@+id/tvTwo"
android:layout_width="180dp"
android:layout_height="100dp"
android:background="@color/colorAccent"
android:textSize="20sp"
android:text="测试2"
app:layout_constraintTop_toBottomOf="@id/tvOne"
app:layout_constraintStart_toEndOf="@id/tvOne"
android:gravity="center"/>
</androidx.constraintlayout.widget.ConstraintLayout>
效果对比,适配前和适配后:
最后,各种适配方式没有什么是最好的,合适的才是最好的,有句话怎么说的(不适配就是最好的适配),哈哈。平时的适配根据具体项目具体选择采用什么样的适配方式。还有我们可以选择对整体界面适配也可以对单独的某一块进行适配。
Android 9.0官方适配方式
其他手机厂商的适配:
日常适配刘海屏,我们需要对厂商的版本单独处理,很多厂商都有他们自己的适配方式。比如华为,小米,OPPO等。
1、取消标题栏,设置全屏
2、判断手机厂商
3、判断手机是否有刘海
4、设置是否让内容区域延伸进刘海
5、设置控件是否避开刘海区域
6、获取刘海的高度(一般就是状态栏的高度)
设置全屏,设置内容延伸至刘海等操作都是在setContentView()方法之前
class ShapedScreenActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 1.设置全屏
// 取消标题栏
requestWindowFeature(Window.FEATURE_NO_TITLE)
window?.setFlags(
WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN
)
// 手机厂商:华为,小米,OPPO等
// 1.判断手机厂商,
// 2,判断手机是否有刘海,
// 3,设置是否让内容区域延伸进刘海
// 4,设置控件是否避开刘海区域
// 5,获取刘海的高度
// 2.判断是否是刘海屏
if (hasDisplayCutout(window)) {
// 将内容区域延伸进刘海
val attributes = window?.attributes
/*
* LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT 全屏模式,内容下移,非全屏不受影响
* LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES 允许内容去延伸进刘海区
* LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER 不允许内容延伸进刘海区
*/
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
attributes?.layoutInDisplayCutoutMode =
WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
window?.attributes = attributes
}
//3.设置成沉浸式
val flags =
View.SYSTEM_UI_FLAG_FULLSCREEN or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
var systemUiVisibility = window?.decorView?.systemUiVisibility
systemUiVisibility = systemUiVisibility?.or(flags)
window?.decorView?.systemUiVisibility = systemUiVisibility ?: 0
}
setContentView(R.layout.activity_shaped_screen)
// 4,设置控件是否避开刘海区域
val layoutParams: ConstraintLayout.LayoutParams =
tvShape.layoutParams as ConstraintLayout.LayoutParams
layoutParams.topMargin = getStatusBarHeight()
tvShape.layoutParams = layoutParams
}
/**
* 判断是否是刘海屏
*/
private fun hasDisplayCutout(window: Window?): Boolean {
val displayCutout: DisplayCutout?
val decorView = window?.decorView
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
val rootWindowInsets = decorView?.rootWindowInsets
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P && rootWindowInsets != null) {
displayCutout = rootWindowInsets.displayCutout
if (displayCutout != null) {
// 判断刘海屏区域数量,判断刘海区域是否高度大于0
if (displayCutout.boundingRects.size > 0 && displayCutout.safeInsetBottom > 0) {
return true
}
}
}
}
return false
}
/**
* 获取状态栏高度(通常情况下,刘海的高度等于状态栏的高度)
*/
private fun getStatusBarHeight(): Int {
val resId = resources.getIdentifier("status_bar_height", "dimen", "android")
if (resId > 0) {
return resources.getDimensionPixelSize(resId)
}
return 0
}
}
对需要适配的布局进行单独适配,相对来说更麻烦,但是效果也是最好的。
public class UIUtils {
private static UIUtils instance;
// 设计稿尺寸,
private static final float DEFAULT_WIDTH = 1080f;
private static final float DEFAULT_HEIGHT = 1920;
private float displayMetricsWidth;
private float displayMetricsHeight;
private float mStatusBarHeight;
private UIUtils(Context context) {
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
if (wm == null) return;
DisplayMetrics displayMetrics = new DisplayMetrics();
if (displayMetricsWidth == 0 || displayMetricsHeight == 0) {
// 忽略掉了导航栏高度
wm.getDefaultDisplay().getMetrics(displayMetrics);
// 获取真实的屏幕尺寸
//wm.getDefaultDisplay().getRealMetrics(displayMetrics);
mStatusBarHeight = getSystemBarHeight(context);
// 判断横屏还是竖屏
if (displayMetrics.widthPixels > displayMetrics.heightPixels) {
// 横屏
displayMetricsWidth = displayMetrics.heightPixels;
displayMetricsHeight = displayMetrics.widthPixels;
// 如果不是沉浸式,我们还需要减去状态栏的高度
// displayMetricsWidth = displayMetrics.heightPixels - mStatusBarHeight;
} else {
displayMetricsWidth = displayMetrics.widthPixels;
displayMetricsHeight = displayMetrics.heightPixels;
}
}
}
public static UIUtils getInstance(Context context) {
if (instance == null) {
synchronized (UIUtils.class) {
if (instance == null) {
instance = new UIUtils(context.getApplicationContext());
}
}
}
return instance;
}
public static UIUtils getInstance() {
if (instance == null) {
throw new NullPointerException("UIUtils未被初始化");
}
return instance;
}
/**
* 水平缩放比
*
* @return
*/
public float getHorizontalScaleValue() {
return displayMetricsWidth / DEFAULT_WIDTH;
}
/**
* 竖直缩放比
*
* @return
*/
public float getVerticalScaleValue() {
return displayMetricsHeight / DEFAULT_HEIGHT;
}
/**
* 获取宽度
* @param width
* @return
*/
public int getWidth(int width) {
return Math.round((float) width * displayMetricsWidth / DEFAULT_WIDTH);
}
/**
* 获取高度
* @param height
* @return
*/
public int getHeight(int height) {
return Math.round((float) height * displayMetricsHeight / DEFAULT_HEIGHT);
}
/**
* 用于得到状态框的高度
*/
public int getSystemBarHeight(Context context) {
int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
int height = context.getResources().getDimensionPixelSize(resourceId);
if (height != -1) {
return height;
}
return getValue(context, "com.android.internal.R$dimen", "system_bar_height", 48);
}
private int getValue(Context context, String dimeClass, String system_bar_height, int defaultValue) {
try {
Class<?> clazz = Class.forName(dimeClass);
Object object = clazz.newInstance();
Field field = clazz.getField(system_bar_height);
Object obj = field.get(object);
if (obj == null) return defaultValue;
int id = Integer.parseInt(obj.toString());
return context.getResources().getDimensionPixelSize(id);
} catch (Exception e) {
e.printStackTrace();
}
return defaultValue;
}
}
public class ViewCalculateUtils {
/**
* 设置字体大小
*
* @param textView
* @param size
*/
public static void setTextSize(TextView textView, int size) {
textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, UIUtils.getInstance().getHeight(size));
}
/**
* @param view
* @param width
* @param height
* @param lefMargin
* @param topMargin
* @param rightMargin
* @param bottomMargin
* @param asWidth true 不改变宽高的缩放比
*/
public static void setViewRelativeLayoutParam(View view, int width, int height, int lefMargin, int topMargin,
int rightMargin, int bottomMargin, @Nullable boolean asWidth) {
RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) view.getLayoutParams();
if (layoutParams == null) return;
if (width != RelativeLayout.LayoutParams.MATCH_PARENT
&& width != RelativeLayout.LayoutParams.WRAP_CONTENT) {
layoutParams.width = UIUtils.getInstance().getWidth(width);
} else {
layoutParams.width = width;
}
if (height != RelativeLayout.LayoutParams.MATCH_PARENT
&& height != RelativeLayout.LayoutParams.WRAP_CONTENT) {
layoutParams.height = asWidth ? UIUtils.getInstance().getWidth(height) : UIUtils.getInstance().getHeight(height);
} else {
layoutParams.height = height;
}
layoutParams.topMargin = asWidth ? UIUtils.getInstance().getWidth(topMargin) : UIUtils.getInstance().getHeight(topMargin);
layoutParams.bottomMargin = asWidth ? UIUtils.getInstance().getWidth(bottomMargin) : UIUtils.getInstance().getHeight(bottomMargin);
layoutParams.leftMargin = UIUtils.getInstance().getWidth(lefMargin);
layoutParams.rightMargin = UIUtils.getInstance().getWidth(rightMargin);
view.setLayoutParams(layoutParams);
}
/**
* 设置view的内边距
*
* @param view
* @param topPadding
* @param bottomPadding
* @param leftPadding
* @param rightPadding
*/
public static void setViewPadding(View view, int topPadding, int bottomPadding, int leftPadding, int rightPadding) {
view.setPadding(UIUtils.getInstance().getWidth(leftPadding),
UIUtils.getInstance().getHeight(topPadding),
UIUtils.getInstance().getWidth(rightPadding),
UIUtils.getInstance().getHeight(bottomPadding));
}
/**
* @param view
* @param width
* @param height
* @param topMargin
* @param bottomMargin
* @param lefMargin
* @param rightMargin
*/
public static void setViewFrameLayoutParam(View view, int width, int height, int topMargin, int bottomMargin, int lefMargin,
int rightMargin, @Nullable boolean asWidth) {
FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) view.getLayoutParams();
if (width != RelativeLayout.LayoutParams.MATCH_PARENT
&& width != RelativeLayout.LayoutParams.WRAP_CONTENT) {
layoutParams.width = UIUtils.getInstance().getWidth(width);
} else {
layoutParams.width = width;
}
if (height != RelativeLayout.LayoutParams.MATCH_PARENT
&& height != RelativeLayout.LayoutParams.WRAP_CONTENT) {
layoutParams.height = asWidth ? UIUtils.getInstance().getWidth(height) : UIUtils.getInstance().getHeight(height);
} else {
layoutParams.height = height;
}
layoutParams.topMargin = asWidth ? UIUtils.getInstance().getWidth(topMargin) : UIUtils.getInstance().getHeight(topMargin);
layoutParams.bottomMargin = asWidth ? UIUtils.getInstance().getWidth(bottomMargin) : UIUtils.getInstance().getHeight(bottomMargin);
layoutParams.leftMargin = UIUtils.getInstance().getWidth(lefMargin);
layoutParams.rightMargin = UIUtils.getInstance().getWidth(rightMargin);
view.setLayoutParams(layoutParams);
}
/**
* @param view
* @param width
* @param height
* @param topMargin
* @param bottomMargin
* @param lefMargin
* @param rightMargin
* @param asWidth
*/
public static void setViewLinearLayoutParam(View view, int width, int height, int topMargin, int bottomMargin, int lefMargin,
int rightMargin, @Nullable boolean asWidth) {
LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) view.getLayoutParams();
if (width != RelativeLayout.LayoutParams.MATCH_PARENT && width != RelativeLayout.LayoutParams.WRAP_CONTENT) {
layoutParams.width = UIUtils.getInstance().getWidth(width);
} else {
layoutParams.width = width;
}
if (height != RelativeLayout.LayoutParams.MATCH_PARENT && height != RelativeLayout.LayoutParams.WRAP_CONTENT) {
layoutParams.height = asWidth ? UIUtils.getInstance().getWidth(height) : UIUtils.getInstance().getHeight(height);
} else {
layoutParams.height = height;
}
layoutParams.topMargin = asWidth ? UIUtils.getInstance().getWidth(topMargin) : UIUtils.getInstance().getHeight(topMargin);
layoutParams.bottomMargin = asWidth ? UIUtils.getInstance().getWidth(bottomMargin) : UIUtils.getInstance().getHeight(bottomMargin);
layoutParams.leftMargin = UIUtils.getInstance().getWidth(lefMargin);
layoutParams.rightMargin = UIUtils.getInstance().getWidth(rightMargin);
view.setLayoutParams(layoutParams);
}
/**
* @param view
* @param width
* @param height
* @param asWidth
*/
public static void setViewGroupLayoutParam(View view, int width, int height, @Nullable boolean asWidth) {
ViewGroup.LayoutParams layoutParams = view.getLayoutParams();
if (width != RelativeLayout.LayoutParams.MATCH_PARENT && width != RelativeLayout.LayoutParams.WRAP_CONTENT && width != RelativeLayout.LayoutParams.FILL_PARENT) {
layoutParams.width = UIUtils.getInstance().getWidth(width);
} else {
layoutParams.width = width;
}
if (height != RelativeLayout.LayoutParams.MATCH_PARENT && height != RelativeLayout.LayoutParams.WRAP_CONTENT && height != RelativeLayout.LayoutParams.FILL_PARENT) {
layoutParams.height = asWidth ? UIUtils.getInstance().getWidth(height) : UIUtils.getInstance().getHeight(height);
} else {
layoutParams.height = height;
}
view.setLayoutParams(layoutParams);
}
}