我想以编程方式在 Canvas 上绘制一个 SeekBar
。我编写了代码以根据设备密度设置 SeekBar
的 LayoutParams。我正在使用设备密度为 switch case 的
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,那为什么它不起作用?在 Canvas 上绘图时,设备密度和屏幕尺寸之间有什么关系吗?任何帮助将不胜感激。
最佳答案
为什么不尝试摆脱所有的 if else
情况并使某些东西通用?由于您需要根据屏幕尺寸放置不同的像素值,因此您可以使用 dp
代替。
您可以根据设备的屏幕密度从 dp
获取 px
并在 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
将在所有设备上保持不变。
希望这可以解决您的问题。
关于android - 在高端设备中利用 Canvas 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37988804/