将位图绘制到 canvas 并调用 .setImageBitmap() 会导致图像被裁剪
Drawing a bitmap to canvas and calling .setImageBitmap() causes image to be cropped
我只是将我的可绘制文件夹中的位图绘制到 canvas 上,然后将该位图设置为 ImageView
。它在我的模拟器上运行良好,但在我的真实设备上为什么会被裁剪?这没有道理。代码完全一样
Drawable backgroundDrawable = ContextCompat.getDrawable(context, R.drawable.landscape);
try {
Bitmap backgroundBitmap = ((BitmapDrawable) backgroundDrawable).getBitmap();
int positionLeft = 0;
int positionTop = 0;
Bitmap mainBitmap = Bitmap.createBitmap(
backgroundBitmap.getWidth(),
backgroundBitmap.getHeight(),
Bitmap.Config.ARGB_8888
);
Canvas canvas = new Canvas(mainBitmap);
canvas.drawBitmap(backgroundBitmap, positionLeft, positionTop, null);
drawingPad.setImageBitmap(mainBitmap);
} catch (Exception e) {
Log.e(TAG, "onClickCreateImg: Error: ", e);
}
在我的模拟器 (Pixel 2) 上没有问题:
但是在我的真实设备 (Pixel 4a) 上图像被自动裁剪了?为什么会这样
我认为这与布局无关,但在这里。
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/parentLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/btn_create_image"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:text="Create image"/>
<ImageView
android:id="@+id/drawingPad"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintTop_toBottomOf="@+id/btn_create_image"
app:layout_constraintBottom_toBottomOf="parent"
android:paddingBottom="32dp"
android:orientation="vertical"
android:paddingTop="32dp"/>
</androidx.constraintlayout.widget.ConstraintLayout>
而不是使用 .setImageBitmap(mainBitmap)
我改用了 Glide 库
Glide.with(NewsFragment.this)
.load(mainBitmap)
.apply(RequestOptions.centerInsideTransform())
.into(drawingPad);
但是这个奇怪的意外裁剪问题仍然只在我的真实设备上发生。
在第三台设备模拟器 (Nexus 5X) 上测试也没有被裁剪。
___________________________________________________
在第 4 台真实设备 (Pixel 3XL) 上测试过,它也被裁剪了。
仍然无法弄清楚为什么会这样...
我认为您的问题是由于 canvas and/or 位图上未指定的“密度”引起的。您可以通过添加以下代码来强制 canvas 和位图具有共同的密度:
canvas.setDensity(DisplayMetrics.DENSITY_MEDIUM);
mainBitmap.setDensity(DisplayMetrics.DENSITY_MEDIUM);
尽管我不确定您的资源文件夹中是否有特定密度版本的 R.drawable.landscape
资产。
以上建议应该会让你接近。
最后(我怀疑您知道这一点并且有充分的理由想要使用 Canvas)您可以这样做:
Drawable backgroundDrawable = ContextCompat.getDrawable(context, R.drawable.landscape);
drawingPad.setImageDrawable(backgroundDrawable);
或者这个:
drawablePad.setImageResource(R.drawable.landscape);
我只是将我的可绘制文件夹中的位图绘制到 canvas 上,然后将该位图设置为 ImageView
。它在我的模拟器上运行良好,但在我的真实设备上为什么会被裁剪?这没有道理。代码完全一样
Drawable backgroundDrawable = ContextCompat.getDrawable(context, R.drawable.landscape);
try {
Bitmap backgroundBitmap = ((BitmapDrawable) backgroundDrawable).getBitmap();
int positionLeft = 0;
int positionTop = 0;
Bitmap mainBitmap = Bitmap.createBitmap(
backgroundBitmap.getWidth(),
backgroundBitmap.getHeight(),
Bitmap.Config.ARGB_8888
);
Canvas canvas = new Canvas(mainBitmap);
canvas.drawBitmap(backgroundBitmap, positionLeft, positionTop, null);
drawingPad.setImageBitmap(mainBitmap);
} catch (Exception e) {
Log.e(TAG, "onClickCreateImg: Error: ", e);
}
在我的模拟器 (Pixel 2) 上没有问题:
但是在我的真实设备 (Pixel 4a) 上图像被自动裁剪了?为什么会这样
我认为这与布局无关,但在这里。
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/parentLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/btn_create_image"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:text="Create image"/>
<ImageView
android:id="@+id/drawingPad"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintTop_toBottomOf="@+id/btn_create_image"
app:layout_constraintBottom_toBottomOf="parent"
android:paddingBottom="32dp"
android:orientation="vertical"
android:paddingTop="32dp"/>
</androidx.constraintlayout.widget.ConstraintLayout>
而不是使用 .setImageBitmap(mainBitmap)
我改用了 Glide 库
Glide.with(NewsFragment.this)
.load(mainBitmap)
.apply(RequestOptions.centerInsideTransform())
.into(drawingPad);
但是这个奇怪的意外裁剪问题仍然只在我的真实设备上发生。
在第三台设备模拟器 (Nexus 5X) 上测试也没有被裁剪。
___________________________________________________
在第 4 台真实设备 (Pixel 3XL) 上测试过,它也被裁剪了。
仍然无法弄清楚为什么会这样...
我认为您的问题是由于 canvas and/or 位图上未指定的“密度”引起的。您可以通过添加以下代码来强制 canvas 和位图具有共同的密度:
canvas.setDensity(DisplayMetrics.DENSITY_MEDIUM);
mainBitmap.setDensity(DisplayMetrics.DENSITY_MEDIUM);
尽管我不确定您的资源文件夹中是否有特定密度版本的 R.drawable.landscape
资产。
以上建议应该会让你接近。
最后(我怀疑您知道这一点并且有充分的理由想要使用 Canvas)您可以这样做:
Drawable backgroundDrawable = ContextCompat.getDrawable(context, R.drawable.landscape);
drawingPad.setImageDrawable(backgroundDrawable);
或者这个:
drawablePad.setImageResource(R.drawable.landscape);