2016-06-23 11 views
5

キャンバスにプログラムでSeekBarを描画します。私はデバイス密度に基づいてSeekBarのLayoutParamsを設定するコードを書いた。私はハイエンド端末でキャンバス問題に描画する

final DisplayMetrics metrics = Resources.getSystem().getDisplayMetrics(); 
if(metrics.densityDpi <= DisplayMetrics.DENSITY_LOW){ 
     zoomBarParams = new LinearLayout.LayoutParams(18, 
       LayoutParams.FILL_PARENT); 
     } else if (metrics.densityDpi <= DisplayMetrics.DENSITY_MEDIUM){ 
      zoomBarParams = new LinearLayout.LayoutParams(24, 
        LayoutParams.FILL_PARENT); 

     }else if (metrics.densityDpi <= DisplayMetrics.DENSITY_HIGH){ 
      zoomBarParams = new LinearLayout.LayoutParams(24, 
        LayoutParams.FILL_PARENT); 

     }else if (metrics.densityDpi <= DisplayMetrics.DENSITY_XHIGH){ 
      zoomBarParams = new LinearLayout.LayoutParams(31, 
        LayoutParams.FILL_PARENT); 


     }else if (metrics.densityDpi <= DisplayMetrics.DENSITY_XXHIGH){ 
      zoomBarParams = new LinearLayout.LayoutParams(60, 
        LayoutParams.FILL_PARENT); 

     }else if (metrics.densityDpi <= DisplayMetrics.DENSITY_XXXHIGH){ 
      zoomBarParams = new LinearLayout.LayoutParams(60, 
        LayoutParams.FILL_PARENT); 

     } else { 
      zoomBarParams = new LinearLayout.LayoutParams(60, 
        LayoutParams.FILL_PARENT); 

     } 

のようなデバイス密度とスイッチケースを使用しています。しかし、これはサムスンの注5のようなハイエンド機器で動作していない、ギャラクシーS6エッジetc..Iは、これらのデバイスは、その後、濃度範囲のXXXHIGHに来ることを信じていますなぜこれは動作していないのですか?キャンバスに描画する際のデバイスの密度と画面サイズとの間には何らかの関係がありますか?どんな助けでも大歓迎です。

+0

私はあなたの問題は、 'densityDpiValue'が' DisplayMetrics'定数で指定された密度の1つと正確に等しくなることは保証されないと思います。密度が「321」に等しくなるとしましょう。どのケースもトリガーしません。範囲のチェックを検討してください。 –

+0

もう一つの質問として、そのような 'switch'でどのような問題を解決しようとしていますか?代わりに 'dp'の値を使わないのはなぜですか? –

+0

@DmitryZaitsevはい。範囲をチェックするようなコードを更新しました。この問題は、Samsung Note 5とGalaxy S6 Edgeで解決されました。しかし、問題はまだS6 Edge +に存在します。問題の私の更新されたコードを見てください。 – Jas

答えて

2

なぜあなたはすべてのを取り除こうとしないでくださいケースと何か一般的なものを作る?画面サイズに応じて異なるピクセル値を設定する必要があるため、代わりにdpを使用できます。

pxは、デバイスの画面密度に応じてdpから取得することができ、LayoutParamsで使用します。

public static float convertDpToPixel(float dp, Context context){ 
    Resources resources = context.getResources(); 
    DisplayMetrics metrics = resources.getDisplayMetrics(); 
    float px = dp * ((float)metrics.densityDpi/DisplayMetrics.DENSITY_DEFAULT); // You can cache "((float)metrics.densityDpi/DisplayMetrics.DENSITY_DEFAULT)" to avoid re-calculation. 
    return px; 
} 

ですから、このようなparamを作成します。

zoomBarParams = new LinearLayout.LayoutParams(convertDpToPixel(DP_VALUE, context), 
       LayoutParams.FILL_PARENT); 

はどこDP_VALUEすべてのデバイス間で一定のままです。

これがあなたの問題を解決することを願っています。

2

問題この問題の一般的なコードはありません。
密度を元にしたい場合は、それぞれ水平方向と垂直方向にmetrics.xdpimetrics.ydpiを使用できます。

か、このコードに従って行く:このトピックの

public static String getDensity(Resources resources) { 
    switch (resources.getDisplayMetrics().densityDpi) { 
     case DisplayMetrics.DENSITY_LOW: 
      return "ldpi"; 
     case DisplayMetrics.DENSITY_MEDIUM: 
      return "mdpi"; 
     case DisplayMetrics.DENSITY_HIGH: 
      return "hdpi"; 
     case DisplayMetrics.DENSITY_XHIGH: 
      return "xhdpi"; 
     case DisplayMetrics.DENSITY_XXHIGH: 
      return "xxhdpi"; 
     case DisplayMetrics.DENSITY_XXXHIGH: 
      return "xxxhdpi"; 
     case DisplayMetrics.DENSITY_TV: 
      return "tvdpi"; 
     default: 
      return "unknown"; 
    } 

非常に奥行きの説明はここではこの男で与えられます。

https://stackoverflow.com/a/33789580/5476209

また、Androidの開発者のマニュアルのDisplayMetricsセクションを確認

1

キャンバスで作業している場合は、ピクセルでのみ再生することをおすすめします。 dpiではなく、必要に応じて幅と高さのパーセンテージを使用することができます。それはすべてのデバイスに最適で、動作します。たとえば、画面サイズが800 x 1280 pxの場合は、シークバーが600 x 128pxである必要があります。それは幅の75%、高さの10%のようなものです。このパーセントをコードで適用します。

DisplayMetrics dm = getResources().getDisplayMetrics(); 
int seekBarWidth= dm.widthPixels * 75/100; 
int seekBarHeight= dm.heightPixels * 10/100; 

これはすべての画面サイズで完全に機能します。さらに援助の場合に教えてください:)

関連する問題