web-dev-qa-db-ja.com

ImageViewで画像の表示サイズを取得しようとしています

画像ビューに表示される画像の実際のサイズを取得しようとしています。実際、私の画像は画面よりも大きく、imageviewはそれを表示するために画像のサイズを変更しています。この新しいサイズを探しています。

カスタムビューでImageViewのonDrawメソッドをオーバーライドしようとしましたが、正しい高さと幅が得られません...

public class LandImageView extends ImageView
{
    public LandImageView( Context context )
    {
        super( context );
    }

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

    public LandImageView(Context context, AttributeSet attrs, int defStyle)
    {
        super(context, attrs, defStyle);
    }

    @Override
    protected void onDraw( Canvas canvas )
    {
        super.onDraw( canvas );

        int test = this.getWidth();
        int test2 = this.getHeight();
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh)
    {
        super.onSizeChanged(w, h, oldw, oldh);
    }
}

手がかりはありますか?

44

ここの答えはどれも実際に質問に答えません:

Bitmapで表示される任意のサイズのImageViewから、寸法ではなく表示される画像の実際の寸法を見つけます。提供されたBitmap

すなわち:

  • ImageView.getDrawable().getInstrinsicWidth()getIntrinsicHeight()を使用すると、両方とも元の寸法が返されます。
  • DrawableImageView.getDrawable()から取得してBitmapDrawableにキャストし、BitmapDrawable.getBitmap().getWidth()およびgetHeight()を使用しても元の画像が返されます。およびその寸法。

表示された画像の実際の寸法を取得する唯一の方法は、画像を表示どおりに表示するために使用される変換Matrixを抽出して使用することです。これは測定段階の後に行う必要があり、ここの例は、カスタムOverrideImageView of onMeasure()で呼び出されることを示しています。

_public class SizeAwareImageView extends ImageView {

    public SizeAwareImageView(Context context) {
        super(context);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);

        // Get image matrix values and place them in an array
        float[] f = new float[9];
        getImageMatrix().getValues(f);

        // Extract the scale values using the constants (if aspect ratio maintained, scaleX == scaleY)
        final float scaleX = f[Matrix.MSCALE_X];
        final float scaleY = f[Matrix.MSCALE_Y];

        // Get the drawable (could also get the bitmap behind the drawable and getWidth/getHeight)
        final Drawable d = getDrawable();
        final int origW = d.getIntrinsicWidth();
        final int origH = d.getIntrinsicHeight();

        // Calculate the actual dimensions
        final int actW = Math.round(origW * scaleX);
        final int actH = Math.round(origH * scaleY);

        Log.e("DBG", "["+origW+","+origH+"] -> ["+actW+","+actH+"] & scales: x="+scaleX+" y="+scaleY);
    }

}  
_

注:一般的なコードから画像変換Matrixを取得するには(Activityのように)、関数はImageView.getImageMatrix()です。 myImageView.getImageMatrix()

99
B T

B Tの答えを拡張して静的メソッドを生成し、ImageViewに画像の左と上の位置を含めました:

/**
 * Returns the bitmap position inside an imageView.
 * @param imageView source ImageView
 * @return 0: left, 1: top, 2: width, 3: height
 */
public static int[] getBitmapPositionInsideImageView(ImageView imageView) {
    int[] ret = new int[4];

    if (imageView == null || imageView.getDrawable() == null)
        return ret;

    // Get image dimensions
    // Get image matrix values and place them in an array
    float[] f = new float[9];
    imageView.getImageMatrix().getValues(f);

    // Extract the scale values using the constants (if aspect ratio maintained, scaleX == scaleY)
    final float scaleX = f[Matrix.MSCALE_X];
    final float scaleY = f[Matrix.MSCALE_Y];

    // Get the drawable (could also get the bitmap behind the drawable and getWidth/getHeight)
    final Drawable d = imageView.getDrawable();
    final int origW = d.getIntrinsicWidth();
    final int origH = d.getIntrinsicHeight();

    // Calculate the actual dimensions
    final int actW = Math.round(origW * scaleX);
    final int actH = Math.round(origH * scaleY);

    ret[2] = actW;
    ret[3] = actH;

    // Get image position
    // We assume that the image is centered into ImageView
    int imgViewW = imageView.getWidth();
    int imgViewH = imageView.getHeight();

    int top = (int) (imgViewH - actH)/2;
    int left = (int) (imgViewW - actW)/2;

    ret[0] = left;
    ret[1] = top;

    return ret;
}
26
Quentin S.

WarrenFaithのsetAdjustViewBoundsの使用に関する提案は機能しましたが、ImageViewのlayout_width/layout_heightを 'wrap_content'に変更する必要がありました( 'match_parent'ではsetAdjustViewBoundsは何もしませんでした)。私が欲しかった高さ/幅/重力の挙動を得るために、FrameLayoutでImageViewをラップしなければなりませんでした:

<FrameLayout
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    >

    <ImageView
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_gravity="center"
        Android:scaleType="fitCenter"
        Android:adjustViewBounds="true"
        />
</FrameLayout>

これを行った後、ImageViewの寸法(getWidth()およびgetHeight()によって返される)は、画像の表示サイズと一致しました。

9
Squatting Bear

試して

ImageView.getDrawable().getIntrinsicHeight()
ImageView.getDrawable().getIntrinsicWidth()
6
Peter Knego

私はただ通り過ぎていますが、それがまだあなたがimageViewのビットマップについて話しているという仮定の下で行くのに役立つことを願っています

理解したいのは

bmpBack.getWidth()->ビットマップのサイズとbmpBack.getScaledWidth(canvas); ->これにより、画面に表示されるビットマップのサイズがわかります。

ImageViewを使用したことはありませんでした。相対的なディスプレイが私を怒らせていたので、最終的にはonDrawをオーバーライドし、openglと非常によく似たキャンバスを作成しました。

これがあなたの問題だと思う

乾杯

ジェイソン

1
Jason Rogers

ImageviewのviewtreeobserverとaddonDrawListenerを使用できます。

ViewTreeObserver vto = imageView.getViewTreeObserver();
    vto.addOnDrawListener(new ViewTreeObserver.OnDrawListener() {
        @Override
        public void onDraw() {

            float[] f = new float[9];
            imageView.getImageMatrix().getValues(f);

            // Extract the scale values using the constants (if aspect ratio maintained, scaleX == scaleY)
            final float scaleX = f[Matrix.MSCALE_X];
            final float scaleY = f[Matrix.MSCALE_Y];


            // Get the drawable (could also get the bitmap behind the drawable and getWidth/getHeight)
            final Drawable d = imageView. getDrawable();
            final int origW = d.getIntrinsicWidth();
            final int origH = d.getIntrinsicHeight();

            // Calculate the actual dimensions
            final int actW = Math.round(origW * scaleX);
            final int actH = Math.round(origH * scaleY);

        }
    });
1
Satpal Yadav

単にこのコードを使用することができます(アクティビティ中):

@Override
public void onWindowFocusChanged(boolean hasWindowFocus) {
    super.onWindowFocusChanged(hasWindowFocus);
    final ImageView imageView = findViewById(R.id.imageView);
    int width = imageView.getWidth(), height = imageView.getHeight();
}

画像がimageViewの両端に達した場合

0
IQ.feature

画面に表示される画像のサイズが必要だと思います。そのためには、これを行うだけです。

_@Override
    public void onWindowFocusChanged(boolean hasWindowFocus) {
        super.onWindowFocusChanged(hasWindowFocus);
        initialWidth = this.getMeasuredWidth();
        initialHeight = this.getMeasuredHeight();
    }
_

そして、次のようなメソッドのドキュメントを見てください:getWidht()getHeight()getMeasuredWidth()getMeasuredHeight()など。それがあなたにそのサイズを与えるために何をするかを知るために。

編集:実際のwidthheightにロードされる画像のimageViewが必要な場合。次のように、メソッド呼び出しをgetMeasuredWidth()からgetIntrinsicWidth()に、getMeasuredHeight()からgetIntrinsicHeight()に変更できます。

_  Drawable drawable = getDrawable();
  actualWidth = drawable.getIntrinsicWidth();
  actualHeight = drawable.getIntrinsicHeight();
_
0
Ashutosh Tiwari

私は、画像ビューの寸法をスケーリングされた画像に設定して、上下または左右の空きスペースを防ぐソリューションを探していました(ビューの寸法がスケーリングされた画像に合わせて変更されないため)。

私がそのトリックを見つけたのは、メソッドmImageView.setAdjustViewBounds(true);を使用して、正しいレイアウトディメンションを作成することでした。私はスケーリングされた画像の寸法を持っていませんが、私が探していた結果を得ました...誰かがそれを必要とするだけで...

0
WarrenFaith
public class images extends Activity {
ImageView i1;
LinearLayout l1;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
     i1=(ImageView)findViewById(R.id.iv);
     l1 = new LinearLayout(this);
    ImageView i = new ImageView(this);
    ImageView i1 = new ImageView(this);
    i.setImageResource(R.drawable.  imagename.........);

    l1.addView(i);
    l1.addView(i1);
    setContentView(l1);
    }
}

最初にurリソースフォルダーに画像を追加します。.....xmlファイルに画像ビューを作成します。

0
user493244

BitmapFactory.decodeResource(Resources res、int id、BitmapFactory.Options opts) を使用して、BitmapFactory.Options()クラスでリソースをロードしてみてください。 BitmapFactory.Options()には「inJustDecodeBounds」と呼ばれるフラグがあり、リソースのディメンションのみを提供します。

お役に立てば幸いです。

0
Uri May

onSizeChangedの代わりにonMeasure(int widthMeasureSpec, int heightMeasureSpec)をオーバーライドしてください。

0
bhups

画像が適切に拡大縮小されるためには、ImageViewの寸法が必要です。これをカスタムクラスで行い、onMeasure()呼び出しをオーバーライドして幅と高さを取得しました。

class LandImageView extends ImageView{ 
public LandImageView (Context context, AttributeSet attrs) {
  super (context, attrs);
 } 
 @Override
 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) 
 {
  super.onMeasure(widthMeasureSpec, heightMeasureSpec);

  final int width = MeasureSpec.getSize(widthMeasureSpec);
  final int height = MeasureSpec.getSize(heightMeasureSpec);

  Log.v("", String.format("w %d h %d", width, height));
                // width and height are the dimensions for your image
                // you should remember the values to scale your image later on

  this.setMeasuredDimension(width, height );
 }}

OnMeasureでは、ビューに合うように画像の幅と高さを取得します。

次のように、レイアウトでLandImageViewを使用できます。

<my.package.LandImageView ... >
0
thumbmunkeys