3

私はTextView画像を設定しているという点でdrawableLeft

<TextView
   android:id="@+id/imgChooseImage"
   android:layout_width="fill_parent"
   android:layout_height="0dp"
   android:layout_weight="3"
   android:background="@drawable/slim_spinner_normal"
   android:drawableLeft="@drawable/ic_launcher"/>

そして、新しい画像を動的に置き換えるためにJavaコードで何を書く必要があるのか​​を知りたいのです。そうすれば、画像はTextView、描画可能な左の画像で見栄えの良い画像を超えないようになります。

何を使用する必要がありscalefactorますか?

int scaleFactor = Math.min();

以下はJavaコードです

BitmapFactory.Options bmOptions = new BitmapFactory.Options();
// If set to true, the decoder will return null (no bitmap), but
// the out... fields will still be set, allowing the caller to
// query the bitmap without having to allocate the memory for
// its pixels.
bmOptions.inJustDecodeBounds = true;
int photoW = hListView.getWidth();
int photoH = hListView.getHeight();

// Determine how much to scale down the image
int scaleFactor = Math.min(photoW / 100, photoH / 100);

// Decode the image file into a Bitmap sized to fill the View
bmOptions.inJustDecodeBounds = false;
bmOptions.inSampleSize = scaleFactor;
bmOptions.inPurgeable = true;
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), Const.template[arg2],bmOptions);

Drawable draw = new BitmapDrawable(getResources(), bitmap);

/* place image to textview */
TextView txtView = (TextView) findViewById(R.id.imgChooseImage);
txtView.setCompoundDrawablesWithIntrinsicBounds(draw, null,null, null);
position = arg2;
4

1 に答える 1

0

TextView属性のビットマップのサイズを調整できるように、アフターレイアウトの正確な高さを計算する方法を求めていdrawableLeftます。この問題は、いくつかの問題によって悪化します。

  1. テキストが複数行に折り返されると、高さが大幅に変わる可能性があります。
  2. デバイスのハードウェア画面密度に応じて、スケーリング/レンダリングするビットマップの正確なサイズに関係なく、ビットマップのレンダリングサイズが変更されるため、を計算するときに画面密度を考慮する必要がありますscaleFactor
  3. 最後に、scaleFactor正確なサイズの画像リクエストを提供しません。メモリを節約するために、ビットマップのサイズを、リクエストと同じかそれよりも大きい可能な限り小さい画像に制限するだけです。計算した正確な高さに画像のサイズを変更する必要があります。

このdrawableLeft方法では上記の問題を克服することはできません。Javaコードでサイズを変更せずに、目的のレイアウトを実現するためのより良い方法があると思います。

TextViewを、とを含む水平方向に置き換える必要があると思いLinearLayoutます。次のように、TextViewの高さをに設定し、ImageViewの高さを「中央」に設定します。ImageViewTextView"WRAP_CONTENT"scaleType

android:scaleType="center"

LinearLayoutは、TextView内のテキストの高さを持ち、ImageViewscaleTypeは、レイアウト中にビットマップのサイズを自動的に変更します。ここで、使用可能なscaleTypesのリファレンス:ImageView.ScaleType

もちろん、LinearLayout、ImageView、およびTextViewのXMLのレイアウトパラメーターを調整して、希望どおりに中央揃え、位置合わせ、および方向付けを行う必要があります。しかし、少なくともあなたは一度だけそれをしなければならないでしょう。

アプリケーションリソースからImageViewに写真をロードするように見えるので、画像がそれほど大きくないことがわかっている場合は、ビットマップを直接開くか、を使用できますinSampleSize = scaleFactor = 1。それ以外の場合、画像が特に大きい場合、またはOutOfMemoryError例外が発生した場合は、次のように計算scaleFactorします。

int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
    if (width > height) {
        inSampleSize = Math.round((float) height / (float) reqHeight);
    } else {
        inSampleSize = Math.round((float) width / (float) reqWidth);
    }
}
于 2013-03-20T20:38:35.953 に答える