3

ここで説明する手法を使用しています。次の行は、 my を除くすべてNexus 4のデバイスで機能します。

int imageWidth = horizontalScrollView.getChildAt(0).getMeasuredWidth();

レイアウトはシンプルです:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <HorizontalScrollView
        android:id="@+id/main_scroller"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <ImageView
            android:id="@+id/main_image"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:adjustViewBounds="true"
            android:scaleType="centerCrop" />
    </HorizontalScrollView>
</RelativeLayout>

これHorizontalScrollViewに、約 500x1000 ピクセルのビットマップをプログラムで作成します。したがって、画像は1200x2400 に引き伸ばされます ( centerCropを参照)。したがって、 の幅はImageView2400 である必要があります。私のNexus 7、Samsung S3 Mini、およびその他の低密度デバイス。しかし、私の Nexus 4 にはありません! Nexus 4 では、実際には高さが引き伸ばされていますが、幅は引き伸ばされていません (ええ、信じられないことです): 1000x1000 ピクセルです。getWidth()と の両方を試しましたgetMeasuredWidth()。スクロールしようとすると、画像の横方向の 50% しか表示されません (ただし、縦方向は 100% です)。

更新 1:

mDrawMatrix私のを見るImageViewと、次のように異なることがわかります。

Nexus 7: マトリックス{[2.2979167, 0.0, 0.0][0.0, 2.2979167, 0.0][0.0, 0.0, 1.0]}

ネクサス 4: マトリックス{[2.1458333, 0.0, -623.0 ][0.0, 2.1458333, 0.0][0.0, 0.0, 1.0]}

更新 2:

これは Android 4.2.2 のバグでImageView.onMeasure()、4.3 で修正されています。問題は、どうすればこの修正を 4.2.2 に追加できるかということです。onMeasure()多くのプライベート関数が呼び出されているため、オーバーライドは 100% 自明ではありません。

4

1 に答える 1

3

Samsung Galaxy S4 4.2.2 と S3 4.1.1 で同じ問題が発生しました。プログラムで設定されたビットマップは、親 ViewGroup の幅を埋めるようにスケーリングされません。scaleType のすべての組み合わせを試してみましたが、役に立ちませんでした。

私にとっての解決策は、ビットマップの密度を表示する前に特定の値に設定することでした。

        Bitmap myBitmap = ... 

        // S3 and S4 get confused about displaying bitmaps without a specific density,
        // and fail to scale them properly. Setting the density to this value helps (is possible ANY density helps, but haven't tested this)
        myBitmap.setDensity(DisplayMetrics.DENSITY_HIGH);

        myImageView.setImageBitmap(myBitmap);
于 2014-04-10T14:48:31.260 に答える