4

我试图在画布上绘制位图。在模拟器中,图像似乎模糊了。android可能会自动缩放位图吗?我确实尝试禁用缩放,例如

< supports-screens android:smallScreens="false" android:normalScreens="true" 
android:largeScreens="false" android:xlargeScreens="false" android:anyDensity="true" />

模糊意味着如果我在位图中有一个像素,我看到的是 2x2 像素。有时会丢失一个像素。所以我假设 Android 会自动对其进行缩放以适应不同的屏幕。我只是使用 WVGA,如何防止这种缩放?谢谢。

4

2 回答 2

12

实际上,两者BitmapCanvas具有密度属性,如果画布和位图的密度不同,则绘制位图会自动缩放位图。

来自Bitmap.setDensity()文档:

指定此位图的密度。当位图被绘制到也有密度的 Canvas 上时,它会被适当地缩放。

您可以调用bitmap.setDensity(Bitmap.DENSITY_NONE)以完全禁用此自动缩放行为。如果您从资源中加载位图,将其放置在下面drawable-nodpi就足够了。

对于好奇的:这种行为背后的逻辑是在Canvas.cpp(的本机部分android.graphics.Canvas)中实现的,在drawBitmap__BitmapFFPaint()方法中:

static void drawBitmap__BitmapFFPaint(JNIEnv* env, jobject jcanvas,
                                      SkCanvas* canvas, SkBitmap* bitmap,
                                      jfloat left, jfloat top,
                                      SkPaint* paint, jint canvasDensity,
                                      jint screenDensity, jint bitmapDensity) {
    SkScalar left_ = SkFloatToScalar(left);
    SkScalar top_ = SkFloatToScalar(top);

    if (canvasDensity == bitmapDensity || canvasDensity == 0
            || bitmapDensity == 0) {
        if (screenDensity != 0 && screenDensity != bitmapDensity) {
            SkPaint filteredPaint;
            if (paint) {
                filteredPaint = *paint;
            }
            filteredPaint.setFilterBitmap(true);
            canvas->drawBitmap(*bitmap, left_, top_, &filteredPaint);
        } else {
            canvas->drawBitmap(*bitmap, left_, top_, paint);
        }
    } else {
        canvas->save();
        SkScalar scale = SkFloatToScalar(canvasDensity / (float)bitmapDensity);
        canvas->translate(left_, top_);
        canvas->scale(scale, scale);

        SkPaint filteredPaint;
        if (paint) {
            filteredPaint = *paint;
        }
        filteredPaint.setFilterBitmap(true);

        canvas->drawBitmap(*bitmap, 0, 0, &filteredPaint);

        canvas->restore();
    }
}
于 2012-11-01T17:48:31.193 回答
0

我认为把你的位图放在 drawable-nodpi 文件夹中可以解决这个问题。顺便说一句,标签仅供 Google Play 使用。

于 2012-10-29T02:58:35.513 回答