47

画像ビューに表示される画像の実際のサイズを取得しようとしています。実際、私の画像は画面よりも大きく、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);
    }
}

手がかりはありますか?

4

14 に答える 14

106

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

Bitmapによって表示される任意のサイズのから、提供された の寸法ではなく、表示されるイメージの実際の寸法をImageView見つけます。Bitmap

すなわち:

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

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

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()

于 2013-03-21T03:16:54.317 に答える
11

setAdjustViewBounds を使用するという WarrenFaith の提案が機能することがわかりましたが、ImageView の layout_width/layout_height を「wrap_content」に変更する必要がありました (「match_parent」を使用すると、setAdjustViewBounds は何もしませんでした)。必要な高さ/幅/重力の動作を取得するには、ImageView を FrameLayout でラップする必要がありました。

<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() によって返される) は、画像の表示サイズと一致しました。

于 2013-03-07T03:13:29.963 に答える
6

試す

ImageView.getDrawable().getIntrinsicHeight()
ImageView.getDrawable().getIntrinsicWidth()
于 2010-10-23T19:18:43.480 に答える
1

私はちょうど通りかかっていますが、それがまだ役立つことを願っています

あなたが理解したいのは、

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

相対的な表示が私を狂わせていたので、私は ImageView を使用したことがありませんでした。

これはあなたの問題だと思います

乾杯

ジェイソン

于 2010-10-26T06:43:26.207 に答える
0

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

于 2010-10-04T13:16:35.383 に答える
0

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

それが役に立ったことを願っています。

于 2010-10-24T12:10:22.690 に答える
0

私が正しく理解できれば、それに応じて画像を拡大縮小するために、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 ... >
于 2010-10-24T10:50:16.137 に答える
0

画像ビューの寸法を拡大縮小された画像に設定して、上下または左右に空白ができないようにするソリューションを探していました (拡大縮小された画像に合わせてビューの寸法が変更されないため)。

トリックを行うことがわかったのはmImageView.setAdjustViewBounds(true);、正しいレイアウト寸法になる方法を使用することでした。スケーリングされた画像の寸法はありませんが、探していた結果が得られました...誰かがそれを必要とする場合にのみ...

于 2011-03-09T14:31:59.790 に答える
0
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ファイルに画像ビューを作成します....

于 2010-11-10T09:02:53.280 に答える
-1

ImageView.getBackground() または ImageView.getDrawable() の次に Drawable.getBounds() はどうでしょうか?

于 2010-10-21T20:25:33.187 に答える