Hai*_* Bi 3 scaling android screen bitmap android-canvas
我试图在画布上绘制地图.在模拟器中,似乎图像模糊.android是否可能自动缩放位图?我确实尝试禁用缩放比如
< supports-screens android:smallScreens="false" android:normalScreens="true"
android:largeScreens="false" android:xlargeScreens="false" android:anyDensity="true" />
Run Code Online (Sandbox Code Playgroud)
模糊意味着如果我在位图中有一个像素,我看到像2x2像素.所以一个像素丢失了.所以我认为Android会自动缩放它以适应不同的屏幕.我只是使用WVGA,我该如何防止这种缩放?谢谢.
Cod*_*ers 11
的确,Bitmap和Canvas具有密度特性,如果画在画布和位图的密度不同的位图将自动缩放位图.
指定此位图的密度.当位图绘制到也具有密度的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();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3690 次 |
| 最近记录: |