将位图绘制到 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);