1. 程式人生 > 其它 >Android-螢幕適配

Android-螢幕適配

自定義控制元件 px 螢幕不同解析度適配

/**
 * Created by AS.
 *
 * @author lol_tww
 * @time on 2022/3/19
 * @describe describe
 */
public class Util {
    private static Util sUtil;

    //預設裝置的寬高
    private static final float STANDARD_WIDTH = 720;
    private static final float STANDARD_HEIGHT = 1280;


    private int mDisplayWidth;
    private int mDisplayHeight;

    private Util(Context applicationContext){
        //獲取螢幕的寬高
        if(mDisplayHeight == 0 || mDisplayWidth ==0){
            WindowManager manager = (WindowManager) applicationContext.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;
                }else {
                    mDisplayWidth = displayMetrics.widthPixels;
                    mDisplayHeight = displayMetrics.heightPixels-getStatusBarHeight(applicationContext);
                }
            }
        }
    };

    //狀態列的高度
    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 mDisplayWidth /STANDARD_WIDTH;
    }

    //垂直方向縮放比例,解析度不同
    public float getVerticalScale(){
        return mDisplayWidth /STANDARD_HEIGHT;
    }


    public static Util getInstance(Context context){
        if(sUtil == null){
            sUtil = new Util(context.getApplicationContext());
        }
        return sUtil;
    }
    
}


螢幕適配 --畫素密度


/**
 * Created by AS.
 *
 * @author lol_tww
 * @time on 2022/3/19
 * @describe describe
 */
public class Density {
    private static final float WIDTH = 360; //預設裝置的寬 單位dp


    private static float appDensity;//螢幕密度
    private static float appScaleDensity;//字型縮放比例,預設appDensity


    public static void setDensity(Application application, Activity activity){
        //獲取當前app的螢幕顯示資訊
        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){
                        appScaleDensity = application.getResources().getDisplayMetrics().scaledDensity;
                    }
                }

                @Override
                public void onLowMemory() {

                }
            });
        }

        //獲取目標density
        float targetDensity = displayMetrics.widthPixels /WIDTH;
        float targetScaleDensity = targetDensity * (appScaleDensity/appDensity);
        int targetDensityDpi = (int) (targetDensity *160);

        //替換Activity 的density,scaleDensity,densityDpi;
        DisplayMetrics dm = activity.getResources().getDisplayMetrics();
        dm.density = targetDensity;
        dm.scaledDensity = targetScaleDensity;
        dm.densityDpi = targetDensityDpi;
    }
}