我想以编程方式在画布上绘制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);
}
但是这并不适用于三星Note 5,Galaxy S6 Edge等高端设备。我相信这些设备的密度范围是XXXHIGH,那么为什么这不起作用?在画布上绘图时,设备密度和屏幕尺寸之间是否有任何关系?任何帮助将不胜感激。
答案 0 :(得分:2)
问题是这个问题没有任何通用代码
如果您需要原始密度,则可以分别使用metrics.xdpi
和metrics.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 :(得分:2)
为什么不试图摆脱所有if else
个案并制作一些通用的东西?由于您需要根据屏幕大小设置不同的像素值,因此您可以使用dp
代替。
您可以从px
获取dp
,具体取决于设备的屏幕密度,并在LayoutParams
中使用。{/ p>
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 :(得分:1)
如果您正在使用画布,我建议仅使用像素。代替dpi,您可以根据您的要求使用百分比宽度和高度。这将最适合并适用于每个设备。例如,如果屏幕尺寸600 x 128px
需要800 x 1280 px
的搜索栏。然后它就像75%的宽度和10%的高度。现在按代码
DisplayMetrics dm = getResources().getDisplayMetrics();
int seekBarWidth= dm.widthPixels * 75 / 100;
int seekBarHeight= dm.heightPixels * 10 / 100;
这将适用于所有屏幕尺寸。如果有进一步的帮助,请告诉我:))