美文网首页自定义控件Android学习
Android 屏幕适配,自定义适配布局

Android 屏幕适配,自定义适配布局

作者: 程序员阿兵 | 来源:发表于2019-05-21 17:28 被阅读10次

    由于安卓机型复杂,屏幕适配也是Android开发必不可少的一部分。

    1.自定义缩放布局,根据屏幕分辨率对应缩放:

    根据ui提供的设计稿参数,对应获取当前机型高宽除去状态栏的高度,算出当前缩放比:

    package com.gui.screenadapter.pixel;
    
    import android.content.Context;
    import android.util.DisplayMetrics;
    import android.view.WindowManager;
    
    public class Utils {
    
        private static Utils utils;
    
        //这里是设计稿参考宽高
        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);
                    }
                }
            }
    
        }
    
        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;
        }
    
    }
    
    

    根据上面计算的缩放比,自定义布局,重写onMeasure方法 对子view进行缩放。

    package com.gui.screenadapter.pixel;
    
    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 = 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);
        }
    }
    
    

    在布局中使用就可以按ui设计的尺寸去设置高宽了

    <?xml version="1.0" encoding="utf-8"?>
    <com.netease.screenadapter.pixel.ScreenAdapterLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <TextView
            android:layout_width="540px"
            android:layout_height="540px"
            android:layout_marginLeft="10px"
            android:text="Hello World!"
            android:background="@color/colorAccent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    
    </com.netease.screenadapter.pixel.ScreenAdapterLayout>
    

    相关文章

      网友评论

        本文标题:Android 屏幕适配,自定义适配布局

        本文链接:https://www.haomeiwen.com/subject/zcojzqtx.html