線形レイアウトにイメージビューがあります。
イメージビューが保持するビットマップをスケーリングするようにしたいので、線形レイアウトで最大量のスペースを使用しますが、適切な画像スケールを維持します。
public static void sharedUtilScaleImage(ImageView view)
{
Drawable drawing = view.getDrawable();
//--
Bitmap bitmap = ((BitmapDrawable)drawing).getBitmap();
int bitmapWidth = bitmap.getWidth();
int bitmapHeight = bitmap.getHeight();
int widthParent = view.getWidth();
int heightParent = view.getHeight();
//--
float density = 1;
if (true) {
density = MicApp.getContext().getResources().getDisplayMetrics().density;
}
//--
float xScale = ((float) widthParent * density) / bitmapWidth;
float yScale = ((float) heightParent * density) / bitmapHeight;
float minScale = Math.min(xScale, yScale);
//--
Matrix matrix = new Matrix();
matrix.postScale(minScale, minScale);
//--
Bitmap scaledBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmapWidth, bitmapHeight, matrix, true);
BitmapDrawable result = new BitmapDrawable(scaledBitmap);
view.setImageDrawable(result);
}
参考までに、上記のコードのいくつかをここで見つけました: htttp://stackoverflow.com/questions/8114085/how-to-create-white-border-around-bitmap
ただし、上記は少し不可解です。
- すべてのビットマップを drawable-hdpi に保存します
- ビットマップ .getHeight/.getWidth は実際のピクセルを返します (密度が変更されたピクセルではありません)。
- ただし、ビュー .getHeight / .getWidth は、電話での実際のピクセル使用量よりも小さいピクセルを返します。実際のピクセルを取得するには、それらに密度を掛ける必要があります。
返される値の違いはなぜですか?
ビットマップが実際のピクセル サイズを返すのが好きです。しかし、「res/drawable-nodpi」に配置する必要がある他の場所を読んだので、それは追加の矛盾のように思えますか?
参考までに、イメージビューにビットマップを配置するコードと、線形レイアウト内のイメージビューは次のようになります。
imageView.setImageResource(picIDs[position]);
imageView.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
imageView.setLayoutParams(lp);
//--
linearLayoutInner.setGravity(Gravity.CENTER_HORIZONTAL|Gravity.CENTER_VERTICAL);
linearLayoutInner.addView(imageView);