ここで説明する手法を使用しています。次の行は、 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を参照)。したがって、 の幅はImageView
2400 である必要があります。私の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% 自明ではありません。