自定義像素適配

這里先舉個(gè)栗子
假設(shè)UI設(shè)計(jì)稿給的屏幕參考寬高比例是1080*1920
這時(shí)候我們?cè)?20*1280的手機(jī)上設(shè)置一個(gè)View的寬高我們就需要通過計(jì)算出他們之間的寬高比例  
首先我們獲取參考設(shè)備和目標(biāo)設(shè)備的
水平方向的寬縮放比例=720/1080
垂直方向的高縮放比例=1280/1920
假如這時(shí)候設(shè)計(jì)給的一張圖假如這時(shí)候設(shè)計(jì)給的一張圖的寬度是100px
但是如果想讓他在720/1080的手機(jī)上顯示的效果一樣,
我們就可以用計(jì)算出的水平方向的縮放比例乘上100px就
可以得出在720*1080的設(shè)備上實(shí)際上應(yīng)該顯示的寬度(720/1080*100px),
這也就是簡(jiǎn)單的數(shù)學(xué)知識(shí)計(jì)算出來的

接下來就是代碼部分了
這里寫了一個(gè)工具類,這個(gè)工具類就是我們上面所說的比例計(jì)算 ,我們通過代碼獲取當(dāng)前運(yùn)行設(shè)備的寬高,再通過和UI設(shè)計(jì)稿計(jì)算出實(shí)際應(yīng)該縮放的比例 實(shí)際開發(fā)過程中我們根據(jù)實(shí)際UI設(shè)計(jì)稿的情況修改參考寬高就行了,這里考慮到了平板設(shè)備,平板設(shè)備肯定是 寬>高 手機(jī)設(shè)備 高>寬

public class Utils {

    private static Utils utils;

    //這里是設(shè)計(jì)稿參考寬高
    private static final float STANDARD_WIDTH = 1080;
    private static final float STANDARD_HEIGHT = 1920;

    //這里是屏幕顯示寬高
    private int mDisplayWidth;
    private int mDisplayHeight;

    private Utils(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;
                }else{
                    mDisplayWidth = displayMetrics.widthPixels;
                    mDisplayHeight = displayMetrics.heightPixels - getStatusBarHeight(context);
                }
            }
        }

    }

//獲取狀態(tài)欄的寬高  因?yàn)槠聊桓叨劝瑺顟B(tài)欄,所以這里高度的獲取需要減去狀態(tài)欄高度
    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 static Utils getInstance(Context context){
        if (utils == null){
            utils = new Utils(context.getApplicationContext());
        }
        return utils;
    }

    //獲取水平方向的縮放比例
    public float getHorizontalScale(){
        return mDisplayWidth / STANDARD_WIDTH;
    }

    //獲取垂直方向的縮放比例
    public float getVerticalScale(){
        return mDisplayHeight / STANDARD_HEIGHT;
    }

}

最后就是重新容器控件了
這里我重新的是RelativeLayout 作為示例,實(shí)際開發(fā)中肯定需要重新所有的容器布局
比如LinearLayout,FrameLayout等,直接上代碼吧
代碼中通過遍歷RelativeLayout中的子View,通過獲取他們的寬 高 Margin的參數(shù)乘以我們工具類中計(jì)算出來的縮放比例 再重新設(shè)置給View
這里的flag實(shí)際上就是為了防止多次測(cè)量 因?yàn)閛nMeasure會(huì)走多次

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 = Utils.getInstance(getContext()).getHorizontalScale();
            float scaleY = Utils.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);
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容