【问题标题】:Android Creating Bitmap Size on Screen DensityAndroid 在屏幕密度上创建位图大小
【发布时间】:2016-07-08 07:08:07
【问题描述】:

在我的应用程序中,我需要制作像这样覆盖在 Google 地图视图上的位图图标。

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;
}

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

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

【问题讨论】:

    标签: android bitmap


    【解决方案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

    【讨论】:

    • 我在调用这个函数之前计算了半径(半径可以是任意值,没有事先定义),所以不能在资源中使用设定值。
    • 如何计算半径?基于什么?
    • 半径是根据另一个因素计算的,但我真正的问题是如何确保在两个设备上具有相同的半径时,无论屏幕密度如何,绘制的位图都是相同的物理尺寸。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-17
    相关资源
    最近更新 更多