android - 在高端设备中利用 Canvas 问题

标签 android canvas screen-density

我想以编程方式在 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/

相关文章:

android - 相同分辨率屏幕下不同设备上的布局显示不同

android - 为什么 Nexus 6 的密度是 560 dpi?

android - 如何在 Doze 模式下检测维护窗口将关闭事件?

java.util.MissingFormatArgumentException : Format specifier: s

java - 将 R.id.content 保存为 Android 变量的内容

android - Cordova + Ionic 框架 - 如何安全地更改包名称?

html - 如何在 HTML5 中为 canvas 标签倾斜由 fillText() 生成的文本?

javascript - HTML5 Canvas 绘图应用程序...x,y 正确,但绘图已关闭

jquery - Html5 Canvas 模糊并保存

android - 以编程方式设置后获取奇怪的字体大小