Androidでは、ImageView
のlayout_width
をfill_parent
に定義しました(これは電話の全幅を占めます)。
私がImageView
に入れた画像がlayout_width
よりも大きい場合、Androidはそれを拡大縮小します、そうでしょう?しかし、高さはどうですか? Androidが画像を拡大縮小しても、縦横比は維持されますか。
私が見つけたのは、AndroidがImageView
よりも大きい画像を拡大縮小するとき、ImageView
の上下に空白があることです。本当?もしそうなら、どうすればその空白を削除できますか?
はい。デフォルトでは、Androidは縦横比を維持しながら、ImageViewに合わせて画像を縮小します。ただし、Android:src="..."
ではなくAndroid:background="..."
を使用してImageViewに画像を設定していることを確認してください。 src=
は縦横比を維持しながら画像を拡大縮小しますが、background=
はImageViewのサイズにぴったり合うように画像を拡大縮小 および /歪ませます。 (ただし、背景とソースを同時に使用することもできます。これは、1つのImageViewを使用してメイン画像の周囲にフレームを表示する場合などに便利です。)
また、ImageViewがそれ自身をサイズ変更された画像に合うようにサイズ変更するためにAndroid:adjustViewBounds
を見るべきです。たとえば、通常正方形のImageViewになる長方形の画像がある場合、adjustViewBounds = trueはImageViewも長方形になるようにサイズ変更します。これは他のビューがImageViewの周りにどのようにレイアウトされるかに影響します。
それからSamuhが書いたように、あなたはそれがデフォルトで画像を拡大縮小する方法をAndroid:scaleType
パラメータを使って変えることができます。ちなみに、これがどのように機能するのかを知る最も簡単な方法は、少し自分で実験することでした。 Eclipseでのプレビューは通常間違っているので、エミュレータ自体(または実際の携帯電話)のレイアウトを見てください。
Android:adjustViewBounds
を参照してください。
描画可能オブジェクトの縦横比を維持するためにImageViewの境界を調整する場合は、これをtrueに設定します。
この問題を抱えている他の人に。幅がfill_parent
、高さがそれに比例するように調整したいImageView
(またはその他のView
)があります。
これら2つの属性をImageView
に追加します。
Android:adjustViewBounds="true"
Android:scaleType="centerCrop"
ImageView
の幅をfill_parent
に、高さをwrap_content
に設定します。
また、画像をトリミングしたくない場合は、次の方法を試してください。
Android:adjustViewBounds="true"
Android:layout_centerInParent="true"
適切な縦横比を保ちながら拡大縮小する両方のImageView
が必要な場合は、これをXMLに追加します。
Android:adjustViewBounds="true"
Android:scaleType="fitCenter"
これをあなたのコードに追加してください:
// We need to adjust the height if the width of the bitmap is
// smaller than the view width, otherwise the image will be boxed.
final double viewWidthToBitmapWidthRatio = (double)image.getWidth() / (double)bitmap.getWidth();
image.getLayoutParams().height = (int) (bitmap.getHeight() * viewWidthToBitmapWidthRatio);
これがうまくいくまで少し時間がかかりましたが、これは画像が画面の幅よりも小さく、画面の幅よりも大きい場合と、画像をボックス化しない場合の両方でうまくいくように見えます。
これは私のために働いた:
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:maxWidth="39dip"
Android:scaleType="centerCrop"
Android:adjustViewBounds ="true"
以下のコード縦横比としてのスケール画像の処理:
Bitmap bitmapImage = BitmapFactory.decodeFile("Your path");
int nh = (int) ( bitmapImage.getHeight() * (512.0 / bitmapImage.getWidth()) );
Bitmap scaled = Bitmap.createScaledBitmap(bitmapImage, 512, nh, true);
your_imageview.setImageBitmap(scaled);
これで私の問題は解決しました
Android:adjustViewBounds="true"
Android:scaleType="fitXY"
ImageView.ScaleType を見て、サイズ変更がImageView
で行われる方法を制御および理解してください。画像のサイズを変更すると(縦横比を維持しながら)、画像の高さまたは幅がImageView
の寸法よりも小さくなる可能性があります。
縦横比を維持するためにImageViewでこれらのプロパティを使います:
Android:adjustViewBounds="true"
Android:scaleType="fitXY"
<ImageView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:adjustViewBounds="true"
Android:scaleType="fitXY"
/>
画面より小さい画像があります。それを最大に比例して拡大し、ビューの中央に配置するには、次のコードを使用する必要がありました。
<ImageView
Android:id="@+id/my_image"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:layout_centerInParent="true"
Android:adjustViewBounds="true"
Android:layout_weight="1"
Android:scaleType="fitCenter" />
ただし、相対的なレイアウトがあり、いくつかの要素がImageViewの上または下に設定されている場合、それらが画像によって重なる可能性が高いことに注意してください。
適切な拡大縮小と切り抜きの使用なしで、画像が正確に画像ビューにフィットすることを望むあなたの誰のためにも
imageView.setScaleType(ScaleType.FIT_XY);
imageViewはImageViewを表すビューです。
あなたはスクリーンの幅を計算することができます。そして、あなたはビットマップを拡大縮小することができます。
public static float getScreenWidth(Activity activity) {
Display display = activity.getWindowManager().getDefaultDisplay();
DisplayMetrics outMetrics = new DisplayMetrics();
display.getMetrics(outMetrics);
float pxWidth = outMetrics.widthPixels;
return pxWidth;
}
画面幅と拡大縮小画像の高さを画面幅で計算します。
float screenWidth=getScreenWidth(act)
float newHeight = screenWidth;
if (bitmap.getWidth() != 0 && bitmap.getHeight() != 0) {
newHeight = (screenWidth * bitmap.getHeight()) / bitmap.getWidth();
}
あなたはビットマップを拡大縮小することができます後。
Bitmap scaledBitmap=Bitmap.createScaledBitmap(bitmap, (int) screenWidth, (int) newHeight, true);
これをプログラムで行うときは、必ず正しい順序でセッターを呼び出してください。
imageView.setAdjustViewBounds(true)
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP)
あなたの画像が最大限のスペースを占めるようにしたいのなら、最良の選択肢は
Android:layout_weight="1"
Android:scaleType="fitCenter"
画質が低下した場合:
Android:adjustViewBounds="true"
の代わりに
Android:adjustViewBounds="true"
Android:scaleType="fitXY"
縦横比を維持しながら、コンテナの寸法に合わせてビットマップを拡大縮小するアルゴリズムがあります。私の解決策を見つけてください ここ
これが誰かの手助けになることを願っています!
ImageViewにAndroid:layout_gravity
を使ってみてください。
Android:layout_width="wrap_content"
Android:layout_height="0dp"
Android:layout_gravity="center_vertical|center_horizontal"
Android:layout_weight="1"
上記の例は私のために働いた。
Javaコードは必要ありません。あなたがする必要があります:
<ImageView
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:adjustViewBounds="true"
Android:scaleType="centerCrop" />
幅と高さの一致する親にキーがあります
あなたはまたあなたの画像のサイズを縮小する画像を拡大縮小することができます。それをダウンロードして使用できるライブラリがあります。 https://github.com/niraj124124/Images-Files-scale-and-compress.git
使用方法1)compress-v1.0をインポートします。あなたのプロジェクトへのjarファイル。 2)テスト用に以下のサンプルコードを追加します。 ResizeLimiter resize = ImageResizer.build(); resize.scale( "inputImagePath"、 "outputImagePath"、imageWidth、imageHeight);あなたの条件に従ってもっと多くの方法があります
私はこれを使う:
<ImageView
Android:id="@+id/logo"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:layout_centerInParent="true"
Android:scaleType="centerInside"
Android:src="@drawable/logo" />
あなたのImageViewを渡して、あなたがそれを作ることができるスクリーンの高さと幅に基づいて
public void setScaleImage(EventAssetValueListenerView view){
// Get the ImageView and its bitmap
Drawable drawing = view.getDrawable();
Bitmap bitmap = ((BitmapDrawable)drawing).getBitmap();
// Get current dimensions
int width = bitmap.getWidth();
int height = bitmap.getHeight();
float xScale = ((float) 4) / width;
float yScale = ((float) 4) / height;
float scale = (xScale <= yScale) ? xScale : yScale;
Matrix matrix = new Matrix();
matrix.postScale(scale, scale);
Bitmap scaledBitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true);
BitmapDrawable result = new BitmapDrawable(scaledBitmap);
width = scaledBitmap.getWidth();
height = scaledBitmap.getHeight();
view.setImageDrawable(result);
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) view.getLayoutParams();
params.width = width;
params.height = height;
view.setLayoutParams(params);
}
cardview
を丸めるためにimageview
を使用し、ヘッダーのために固定されたAndroid:layout_height
を使用する場合、これは私にとってGlide
で画像をロードするのに役立ちました
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="match_parent"
Android:layout_height="220dp"
xmlns:card_view="http://schemas.Android.com/apk/res-auto"
>
<Android.support.v7.widget.CardView
Android:id="@+id/card_view"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_gravity="center|top"
card_view:cardBackgroundColor="@color/colorPrimary"
card_view:cardCornerRadius="10dp"
card_view:cardElevation="10dp"
card_view:cardPreventCornerOverlap="false"
card_view:cardUseCompatPadding="true">
<ImageView
Android:adjustViewBounds="true"
Android:maxHeight="220dp"
Android:id="@+id/iv_full"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:scaleType="fitCenter"/>
</Android.support.v7.widget.CardView>
</FrameLayout>
これは、ConstraintLayout内でどのように機能したかです。
<ImageView
Android:id="@+id/myImg"
Android:layout_width="300dp"
Android:layout_height="300dp"
Android:scaleType="fitCenter"
Android:adjustViewBounds="true"/>
次に、コードで、ドロアブルを次のように設定します。
ImageView imgView = findViewById(R.id.myImg);
imgView.setImageDrawable(ResourcesCompat.getDrawable(getResources(), R.drawable.image_to_show, null));
これにより、アスペクト比に応じて画像がうまくフィットし、中央に配置されます。