屏幕適配-修改系統(tǒng)的Density,DensityDpi
1.自定義像素適配思路
直接使用設(shè)計(jì)稿的寬高,比如給定了ios尺寸比列720*1250px禁荒,直接使用px寫xml
2.步驟
- 獲取屏幕寬高和設(shè)計(jì)圖寬高的縮放比列,如10801920對(duì)應(yīng)7201250
- 自定義View繼承四中常用布局,重寫onMeasure方法淘菩,為所有子View的LayoutParams重新賦值
- 布局中使用我們自定義的View容器直接按照設(shè)計(jì)圖寫XML
3.代碼實(shí)現(xiàn)
- 首先定義一個(gè)工具類,返回屏幕寬高和設(shè)計(jì)圖寬高的縮放比列
package com.cyq.uidemo;
import android.content.Context;
import android.util.DisplayMetrics;
import android.view.WindowManager;
public class ScreenUtils {
private static ScreenUtils utils;
//設(shè)計(jì)圖寬高
private static final float STANDARD_WIDTH = 500;
private static final float STANDARD_HEIGHT = 1280;
//屏幕顯示寬高
private int mDisplayWidth;
private int mDisplayHeight;
private ScreenUtils(Context context) {
if (mDisplayWidth == 0 || mDisplayHeight == 0) {
WindowManager manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
if (manager != null) {
DisplayMetrics displayMetrics = new DisplayMetrics();
manager.getDefaultDisplay().getMetrics(displayMetrics);
if (displayMetrics.widthPixels > displayMetrics.heightPixels) {
//橫屏
mDisplayWidth = displayMetrics.heightPixels;
mDisplayHeight = displayMetrics.widthPixels - getStatusBarHeight(context);
} else {
mDisplayWidth = displayMetrics.widthPixels;
mDisplayHeight = displayMetrics.heightPixels;
}
}
}
}
/**
* 獲取系統(tǒng)ActionBar高度
* @param context
* @return
*/
public int getStatusBarHeight(Context context) {
int resID = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resID > 0) {
return context.getResources().getDimensionPixelOffset(resID);
}
return 0;
}
public static ScreenUtils getInstance(Context context) {
if (utils == null) {
utils = new ScreenUtils(context.getApplicationContext());
}
return utils;
}
/**
* 獲取水平方向的縮放比例
*
* @return
*/
public float getHorizontalScale() {
return mDisplayWidth / STANDARD_WIDTH;
}
/**
* 獲取豎直方向的縮放比列
* @return
*/
public float getVerticalScale() {
return mDisplayHeight / STANDARD_HEIGHT;
}
}
- 自定義View繼承集中常用的布局容器屠升,例如繼承RelativeLayout潮改,重新賦值它的子View的LayoutParams中的寬高,margin腹暖,其他幾種布局的事項(xiàng)基本差不多
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.RelativeLayout;
public class ScreenAdapterLayout extends RelativeLayout {
private boolean flag;
public ScreenAdapterLayout(Context context) {
super(context);
}
public ScreenAdapterLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ScreenAdapterLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
if (!flag) {
float scaleX = ScreenUtils.getInstance(getContext()).getHorizontalScale();
float scaleY = ScreenUtils.getInstance(getContext()).getVerticalScale();
int count = getChildCount();
for (int i = 0; i < count; i++) {
View child = getChildAt(i);
LayoutParams params = (LayoutParams) child.getLayoutParams();
params.width = (int) (params.width * scaleX);
params.height = (int) (params.height * scaleY);
params.leftMargin = (int) (params.leftMargin * scaleX);
params.rightMargin = (int) (params.rightMargin * scaleX);
params.topMargin = (int) (params.topMargin * scaleY);
params.bottomMargin = (int) (params.bottomMargin * scaleY);
}
flag = true;
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
- XML中直接使用設(shè)計(jì)稿的px值
<?xml version="1.0" encoding="utf-8"?>
<com.cyq.uidemo.ScreenAdapterLayout 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=".MainActivity">
<TextView
android:layout_width="300px"
android:layout_height="300px"
android:text="Hello World!"
android:layout_marginLeft="100px" />
</com.cyq.uidemo.ScreenAdapterLayout>