螢幕適配

lcc發表於2021-09-09

為什麼要進行螢幕適配 ?先說說原理,在說怎麼適配

支援Android裝置

       由於Android系統的開放性,任何使用者、開發者、OEM廠商、運營商都可以對Android進行定製,於是導致:

  Android系統碎片化:小米定製的MIUI、魅族定製的flyme、華為定製的EMUI等等

當然都是基於Google原生系統定製的

        Android螢幕解析度碎片化:320x480、480x800、720x1280、1080x1920

據友盟指數顯示,統計至2016年12月,支援Android的裝置共有27796種



螢幕尺寸

  含義:手機對角線的物理尺寸

  單位:英寸(inch),1英寸=2.54cm

  

  螢幕畫素密度

  含義:每英寸的畫素點數

  單位:dpi(dots per ich)

  Nexul5   445 

  10980*1080+1920*1920  開根號    /4.95

  1  實際密度與系統密度概念,為什麼會有實際密度和系統密度的概念

       Nexul5   445dpi  

   輕金屬  輕金屬的共同特點是比重小於5,(又有一說是密度小於4 .5克/立方匣米),如鋁的比重是2 .7,鎂的比重是1 .7倍,而鉀的比重只有0.87,鈉只有0.97

   重金屬 重金屬指比重大於5的金屬,(一般指密度大於4.5克每立方厘米的金屬) 銅、鉛、鋅、鐵、鈷、鎳、錳、鎘、汞、鎢、鉬、金、銀等

   低密度(mdpi)  中密度(hdpi)   高密度(xhdpi)  超高密度(xxhdpi)   超超高密度(xxxhdpi)

   160dpi  1dp=1px

   445dpi   1dp=2.78px  1dp=2px;  

   displaymetrics.density欄位指定比例因子必須使用轉換DP單位畫素,

   根據當前螢幕的密度。在中等密度螢幕,displaymetrics.density等於1;在高密度的螢幕

   ,它等於1.5;在超高密度的螢幕,它等於2;在低密度的螢幕,它等於0.75。這個數字的因素,

   你應該乘DP單位為當前螢幕獲得實際的畫素數。(然後新增0.5f繞圖到最接近的整數,當轉換成一個整數。)

   

   但是,現在很多Android廠商不一定會選擇這些值作為系統密度,

   而是選擇實際的dpi作為系統密度,這就導致了很多手機的dpi也不是在這些值內。

   例如小米Note這樣的xxhdpi的裝置他的系統密度並不是480,而是它的實際密度440。

      

   public static int dip2px(float dipValue) { 

float scale = mContext.getResources().getDisplayMetrics().density;   

   return (int) (dipValue * scale + 0.5f);  

}            

  2  dp和px  如何互轉 

  

  3 為什麼會有   drawable-mdpi、drawable-hdpi、drawable-xhdpi  drawable-xxhdpi 之類的檔案   這些檔案是起什麼作用的

                                                                          下面我講適配,我們適配其實就是那麼幾種

1  .寫多套佈局layout

2.寫多套value

3.放多套圖片

4.用.9圖片 左上可以拉伸,右下不可以拉伸區域。


5 .自定義佈局

                                                                            這是我今天講的重點自定義 佈局

我們一把都用倆個佈局倆個佈局大家都清楚一個線性佈局,一個相對佈局,那我們為啥不自定義這倆個佈局呢,我以前想過,但考慮效能等等沒有弄

但是我看到一篇不錯的文章,我覺的可以寫,現在我也在用,怕自己忘記了發一份放網上

public class PrecentRelative extends RelativeLayout {
    public PrecentRelative(Context context) {
        super(context);
    }

    public PrecentRelative(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public PrecentRelative(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public PrecentRelative(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }

    /**
     * 測量主見
     * @param widthMeasureSpec
     * @param heightMeasureSpec
     */
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int with= View.MeasureSpec.getSize(widthMeasureSpec);
        int height=View.MeasureSpec.getSize(heightMeasureSpec);
        int childCount=this.getChildCount();
        for (int i = 0; i 0){
                layoutParams.width= (int) (with*withParams);
            }
            if (heightParams>0){
                layoutParams.height= (int) (height*heightParams);
            }
        }
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

    /**
     * 把佈局設定上去
     * @param attrs
     * @return
     */
    @Override
    public LayoutParams generateLayoutParams(AttributeSet attrs) {
        return new LayoutParam(getContext(),attrs);
    }
    public static class LayoutParam extends LayoutParams{
        private float withlayout;
        private float heightlayout;

        public float getHeightlayout() {
            return heightlayout;
        }

        public void setHeightlayout(float heightlayout) {
            this.heightlayout = heightlayout;
        }

        public float getWithlayout() {
            return withlayout;
        }

        public void setWithlayout(float withlayout) {
            this.withlayout = withlayout;
        }

        /**
         * 只要修改這塊就行
         * @param c
         * @param attrs
         */
        public LayoutParam(Context c, AttributeSet attrs) {
            super(c, attrs);
            TypedArray typedArray=c.obtainStyledAttributes(attrs,R.styleable.PrecentRelative);
            withlayout=typedArray.getFloat(R.styleable.PrecentRelative_layout_withPrecent,this.getWithlayout());
            heightlayout=typedArray.getFloat(R.styleable.PrecentRelative_layout_heightPrecent,this.getHeightlayout());
        }

        public LayoutParam(ViewGroup.LayoutParams source) {
            super(source);
        }

        public LayoutParam(LayoutParams source) {
            super(source);
        }

        public LayoutParam(MarginLayoutParams source) {
            super(source);
        }

        public LayoutParam(int w, int h) {
            super(w, h);
        }
    }
}
舊這麼一個類,這個相對佈局的,其他佈局也可以仿照來寫

原文連結:http://www.apkbus.com/blog-340477-76637.html

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2331/viewspace-2813018/,如需轉載,請註明出處,否則將追究法律責任。

相關文章