[Android]Android開発におけるdip,dpi,density,pxなどの詳細

5132 ワード

Android開発における様々な単位の解釈
  • Px(Pixel画素)は、画像要素とも呼ばれ、画像構成の基本単位であり、単一画素の大きさは一定ではなく、画面サイズと画素数の関係に従って変化する(画面が大きいほど、画素が低いほど、単一画素が大きくなり、逆も同様である).したがって、ピクセルを設計単位として使用する場合、異なるデバイスでスケールまたはストレッチが行われる場合があります.
  • Resolution(解像度)とは、画面の垂直方向と水平方向の画素数を指し、解像度が1920*1080の場合、垂直方向に1920画素、水平方向に1080画素がある.
  • Dpi(ピクセル密度)とは、画面上の1インチあたり(1インチ=2.54 cm)の距離にあるピクセルポイントの数です.画面が320*240の場合、画面の長さは2インチ、幅は1.5インチ、Dpi=320/2=240/1.5=160です.
  • Density(密度)これは、画面上の平方インチ(2.54^2平方センチメートル)あたりの画素点数を指します.
  • Dip/dp(デバイス独立画素)はdp、長さ単位とも呼ばれ、同じ単位で異なるデバイスに異なる表示効果がありますが、具体的な効果はデバイスの密度によって異なります.詳細な式は以下を参照してください.

  • 計算ルール
    4.95インチ1920*1080のnexus 5携帯電話デバイスを例に挙げます.
    Dpi :
  • 直角エッジ画素数:19202+10802=202^2(ストランド定理)を計算します.
  • DPI:202/4.95=445を計算する.
  • は、このデバイスのDPIが445(インチ当たり445画素)であることを得た.

  • Density
    上記では、1インチ当たり440画素が得られ、densityは1平方インチ当たりの画素数であり、445^2=198025であるべきである.
    Dip
  • は、画面に表示されるすべての画像がpx単位で表示されるという概念を明らかにした.
  • Dipは私たちの開発で使用した長さ単位で、最後に彼もpxに変換する必要があります.
  • このデバイス上の1 dipがどれだけpxに等しいかを計算する:px=dipx dpi/160 px=1 x 445/160=2.78
  • 上記の計算により、このデバイス上の1 dip=2.78 pxを見ることができますが、これは本当の物語ですか?nonono、その中のキー値dpiは私たちが計算した445ではありません.下を見てください.

  • Androidシステム定義のDpi
    上記の445 Dpiは4.95インチの1920*1080携帯電話ですが、4.75解像度の場合は?4.55解像度では?..表示が面倒で、同じ解像度でも画面サイズによってDpiが異なります.この問題を解決するために、AndroidにはいくつかのデフォルトのDpiが内蔵されており、特定の解像度で自動的に呼び出され、手動でプロファイルを変更することもできます.
    ldpi
    mdpi
    hdpi
    xhdpi
    xxhdpi
    解像度
    240x320
    320x480
    480x800
    720x1280
    1080x1920
    システムdpi
    120
    160
    240
    320
    480
    基準スケール
    0.75
    1
    1.5
    2
    3
    これは内蔵のDpiですが、どういう意味ですか?1920*1080解像度の携帯電話ではデフォルトで480のdpiが使用されていますが、あなたのサイズにかかわらず、メーカーが手動でプロファイルを変更しない限り、これは後で話します.試してみましょう
    
    

    これはtextviewで、高さは200 dp幅は100 dpです.以前の式に従って手動で計算します.
    height = 100 x 445 / 160 = 278.5px
    width  = 200 x 445 / 160 = 556.25px
    

    コントロールの実際のピクセルが同じかどうかを確認するには、次のコードを使用します.
    layout = (RelativeLayout)findViewById(R.id.la);
    //                  ,           
    layout.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener()     {    
      public boolean onPreDraw() {        
        Log.d("hehehe", textView.getHeight() + "/" + textView.getWidth());       
        return true;    
      }
    });
    

    出力された結果は、300/600の内部計算プロセス:
    height = 100 x 480 / 160 = 300px
    width  = 200 x 480 / 160 = 600px
    

    そのうち160は基準値が変わらず、100と200は私たちが設定したdpですが、480はどこから来たのでしょうか.約束した445は?私たちの携帯電話の中の/system/buildを見つけます.propファイル、そのうちの1行はこうです:ro.sf.lcd_density=480これにより、この機種で使用されているdpiがどれだけあるかが指定され、この行がない場合(シミュレータで見つけたことがあります)、テーブルの解像度に応じて自動的に設定されるはずです.
    私はこの行為を変更しました:ro.sf.lcd_density=320上記のテストコードを再実行し、出力結果は:200/400内部計算プロセス:
    height = 100 x 320 / 160 = 200px
    width  = 200 x 320 / 160 = 400px
    

    結局,dpiという動的係数があるので,dpを用いるときに異なる解像度のデバイスと互換性を持つことができる.
    ここまで,dpiの由来,およびシステムdpiが物理dpiと必ずしも同じではないことが分かったはずである.システムで使用されるものはすべてシステムdpiであり,物理dpiは使用されず,物理dpiも取得されない.物理dpiは主にメーカーの携帯電話に対するパラメータ記述に用いられる(ppiと見なすこともできる)!
    そして...表にはもう一つのものが基準スケールと呼ばれていますが、これは実際にはdp->pxの重要な係数を計算し、160を基準にして、他のものを160で割ってスケールを得ることです.
    height = 100 x 480 / 160 = 300px
    width  = 200 x 480 / 160 = 600px
    

    その中の480/160は実は基準の割合を求めて、ここで3を得ます.上記の表を熟知している場合に機種の解像度を見ると、dpを設定する際に対応するpxを直接心算することができ、心算過程は以下の通りである.
    解像度:1080 x 1920->システムDPI:480->基準スケール:480/160=3->対応px:100 x 3=300解像度:720x 1280->システムDPI:320->基準スケール:320/160=2->対応px:100 x 2=200解像度:480 x 800->システムDPI:240->基準スケール:240/160=1.5->対応px:100 x 1.5=150解像度:320 x 480->システムDPI:160->基準スケール:160/160->対応px:100 x1=100解像度:240 x 320->システムDPI:120->基準比:120/160=0.75->対応px:100 x 0.75=75……
    まとめ:
    1.dpi(インチあたりのピクセル数)はプリセット値があります!120-160-240-320-480.異なる解像度に対応します.
    2.基準スケール=dpi(インチあたりのピクセル数)/160
    3.px=dp x基準比率
    コードから関連数値を取得
    主に使用しているクラスはDisplayMetricsです
    以下、A structure describing general information about a display,such as its size,density,and font scalingについて公式apiで説明する.To access the DisplayMetrics members, initialize an object like this:
    DisplayMetrics metrics = newDisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics);
    これは、サイズ、密度など、画面情報を取得するクラスです.および初期化の方法.
    実際の運用は以下の通りである.
    DisplayMetrics dm = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(dm);
    //       DisplayMetrics ,             。              。
    
    dm.ydpi;     //        Y          
    dm.xdpi;     //        X           
                 //ps:                  
                 //                            233333
    
    dm.density;           //           
    dm.densityDpi;        //    dpi,   build.prop          。
    
    dm.widthPixels;       //           
    
    //           !
    //   -          32dp     ,          ,          ,            (px = dp x     )。
    /*    dm.densityDpi / 160       ?
             build.prop         ,         */
    dm.heightPixels + 32 * dm.ydpi / 160;