绘制位图不进行缩放在Android(Drawing bitmap without scaling o

2019-07-03 10:18发布

我试图drawbitmap在画布上。 在模拟器中,似乎图像模糊。 它是可能的机器人自动缩放的位图? 我曾尝试禁用缩放如

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

模糊意味着,如果我有位图中的一个像素,我看到喜欢的2x2像素。 soemtimes像素丢失。 所以我认为Android的自动调整,以适合不同的屏幕。 我只是用WVGA,如何防止这种比例? 谢谢。

Answer 1:

事实上,无论是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();
    }
}


Answer 2:

我觉得把你绘制-nodpi文件夹位图将解决这个问题。 BTW,标签只能通过谷歌播放使用。



文章来源: Drawing bitmap without scaling on Android