在高端设备上绘制Canvas问题

Jas*_*Jas 5 android canvas screen-density

我想以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);

        }
Run Code Online (Sandbox Code Playgroud)

但这不适用于三星Note 5,Galaxy S6 Edge等高端设备.我相信这些设备的密度范围是XXXHIGH,那么为什么这不起作用?在画布上绘图时,设备密度和屏幕尺寸之间是否有任何关系?任何帮助将不胜感激.

Roh*_*rya 2

你为什么不尝试摆脱所有的if else情况并做出一些通用的事情呢?由于您需要根据屏幕尺寸放置不同的像素值,因此可以使用dp

您可以根据设备的屏幕密度获取并px在.dpLayoutParams

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;
}
Run Code Online (Sandbox Code Playgroud)

所以你将创建param这样的:

zoomBarParams = new LinearLayout.LayoutParams(convertDpToPixel(DP_VALUE, context),
                LayoutParams.FILL_PARENT);
Run Code Online (Sandbox Code Playgroud)

其中DP_VALUE将在所有设备上保持不变。

我希望这可以解决您的问题。