web-dev-qa-db-ja.com

Android ImageView:幅に合わせる

画像をダウンロードし、Imageviewを使用して画面の背景として動的に設定します。画像を拡大縮小するために、ScaleTypeを試しました。

画像の高さが幅よりも大きい場合、ScaleTypesfitStartfitEnd、およびfitCenterは機能しません。 Android写真を縮小し、高さに基づいて写真を調整しますが、幅の一部として余分な空白が表示されます。

私は幅に基づいて写真を縮小し、幅に合うようにし、高さの一部として余分な空白スペースがあるかどうか、または高さが長すぎる場合はビューから出ても問題ありません(それが可能であれば?)。

ScaleType.XY写真を拡大縮小してImageViewにすべてを収め、画像の高さと重量の比率を気にしません。

<ImageView 
                Android:id="@+id/background"
                Android:layout_width="match_parent"
                Android:layout_height="match_parent"
                Android:adjustViewBounds="true"
                Android:scaleType="fitStart"
            />
62
Sharj

私はこのコードを使用することになりました:

<ImageView 
                Android:id="@+id/background"
                Android:layout_width="match_parent"
                Android:layout_height="match_parent"
                Android:adjustViewBounds="true"
                Android:scaleType="centerCrop"
                Android:src="@drawable/name"
            />

srcの代わりにbackgroundを使用して画像を設定してください。

176
Sharj

Android:adjustViewBounds="true"仕事をする!

46
ViliusK

here にあるこのエレガントなソリューションは、あなたにとって魅力的です。

基本的には、ImageViewを拡張する小さなクラスを作成し、onMeasureメソッドをオーバーライドして、必要に応じて幅と高さを調整するだけです。ここでは、次を使用して幅に合わせてスケーリングします。

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    int width = MeasureSpec.getSize(widthMeasureSpec);
    int height = width * getDrawable().getIntrinsicHeight() / getDrawable().getIntrinsicWidth();
    setMeasuredDimension(width, height);
}

この特別なImageViewを次のように使用します。

<your.activity.package.AspectRatioImageView 
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:layout_gravity="center_vertical"
    Android:src="@drawable/test" />
12

OnCreate()でこれを行うことができる単純な方法は、単に画面の幅を埋め、高さを比例させる(そして画像の比率を知る)場合です。

setContentView(R.layout.truppview_activity);
trupImage = (ImageView) findViewById(R.id.trupImage);

Display display = getWindowManager().getDefaultDisplay();
DisplayMetrics outMetrics = new DisplayMetrics();
display.getMetrics(outMetrics);
float scWidth = outMetrics.widthPixels;
trupImage.getLayoutParams().width = (int) scWidth;
trupImage.getLayoutParams().height = (int) (scWidth * 0.6f);

ここで、0.6は比率の調整です(画像のw&hがわかっていれば、もちろん自動的に計算することもできます)。

PS:
XML側は次のとおりです。

  <ImageView
        Android:id="@+id/trupImage"
        Android:layout_width="match_parent"
        Android:background="@color/orange"
        Android:layout_height="match_parent" 
        Android:adjustViewBounds="true" 
        Android:scaleType="fitCenter" />
8
Dan Harvey

これは私のために動作します。

ImageViewを拡張するクラスを作成する

    package com.yourdomain.utils;

    import Android.content.Context;
    import Android.graphics.drawable.Drawable;
    import Android.util.AttributeSet;
    import Android.widget.ImageView;

    public class ResizableImageView extends ImageView {

        public ResizableImageView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }

        @Override 
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            Drawable d = getDrawable();

            if (d != null) {
                int width = MeasureSpec.getSize(widthMeasureSpec);
                int height = (int) Math.ceil((float) width * (float) d.getIntrinsicHeight() / (float) d.getIntrinsicWidth());
                setMeasuredDimension(width, height);
            } else {
                super.onMeasure(widthMeasureSpec, heightMeasureSpec);
            }
        }
    }

Xmlでは、ImageViewの代わりに次を使用します

    <com.yourdomain.utils.ResizableImageView
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:src="@drawable/test" />
4
Thomas VJ

私はあなたがXMLだけでそれを行うことはできないと思う、あなたは自分自身のサイズを変更する必要がある、ビットマップ

Display display = getWindowManager().getDefaultDisplay();
int width = display.getWidth();

        try {
            ((ImageView) findViewById(R.id.background))
                    .setImageBitmap(ShrinkBitmap(width));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

それから

private Bitmap ShrinkBitmap(int width)
        throws FileNotFoundException {

    BitmapFactory.Options bmpFactoryOptions = new BitmapFactory.Options();
    bmpFactoryOptions.inJustDecodeBounds = true;
    Bitmap bitmap = BitmapFactory.decodeResource(getResources(),
            R.drawable.img, bmpFactoryOptions);
    int widthRatio = (int) Android.util.FloatMath
            .ceil(bmpFactoryOptions.outWidth / (float) width);


    bmpFactoryOptions.inSampleSize = widthRatio;



    if (bmpFactoryOptions.inSampleSize <= 0)
        bmpFactoryOptions.inSampleSize = 0;
    bmpFactoryOptions.inPreferredConfig = Bitmap.Config.ARGB_8888;
    bmpFactoryOptions.inJustDecodeBounds = false;
    bitmap = BitmapFactory.decodeResource(getResources(),
            R.drawable.img, bmpFactoryOptions);
    return bitmap;

}

そしてレイアウト

 <ImageView
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/background"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
  />
1