Android在屏幕密度上创建位图大小

时间:2016-07-07 21:58:49

标签: android bitmap

在我的应用中,我需要制作覆盖在谷歌地图视图上的位图图标。

public Bitmap makeBubble(int radius, int color) {
    Bitmap bm = Bitmap.createBitmap(radius * 2, radius * 2, Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(bm);

    Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
    paint.setColor(color);
    paint.setStyle(Paint.Style.FILL);
    canvas.drawCircle(bm.getWidth() / 2, bm.getHeight() / 2, radius, paint);

    paint.setColor(Color.argb(255, Color.red(color), Color.green(color), Color.blue(color)));
    paint.setStyle(Paint.Style.STROKE);
    canvas.drawCircle(bm.getWidth() / 2, bm.getHeight() / 2, radius, paint);
    return bm;
}

但是,这些图标在不同的屏幕密度上具有明显不同的大小(正如预期的那样)。

如何在所有屏幕密度上以相同的尺寸创建它们?

1 个答案:

答案 0 :(得分:1)

最好的方法是在XML中定义维度:(您可以重命名)

<!-- file: /res/values/dimentions.xml (you can rename the file) -->
<resources>
    <dimen name="circle_radius">24dp</dimen>
</resources>

然后无论你在哪里调用这个函数makeBubble都这样做:

int radius  = context.getResources().getDimensionPixelSize(R.dimen.circle_radius);
makeBubble(radius, color)

您可以从Activity,Fragment或View获取上下文或资源,这样您就可以获得其中一个。不要使用应用程序上下文,因为这会在边缘条件下给你一些问题。

<强>更新

在您发表评论后,您似乎需要以编程方式计算该值。只需将您的半径乘以DisplayMetrics.density

即可

以下是如何操作:

DisplayMetrics metrics = getResources().getDisplayMetrics();
int radius = ...; // original calculation
radius *= metrics.density; // now this is adjusted for screen density

Here's the documentation