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. 根据设备硬件屏幕密度,Bitmap 的渲染大小会发生变化,而与您缩放/渲染的 Bitmap 的确切大小无关,因此在计算时必须考虑屏幕密度scaleFactor
  3. 最后,scaleFactor不提供确切尺寸的图像请求。它仅将位图的大小限制为与您的请求相同或更大的最小可能图像,以节省内存。您仍然需要将图像大小调整为您计算的确切高度。

drawableLeft方法无法克服上述问题,我认为有更好的方法来实现您的预​​期布局,而无需使用 Java 代码调整大小。

我相信您应该将 TextView 替换为LinearLayout包含 anImageView和 a的水平方向TextView。将 TextView 的高度"WRAP_CONTENT"设置scaleType为并将 ImageView 的高度设置为“中心”,如下所示:

android:scaleType="center"

LinearLayout 将具有 TextView 中文本的高度,而 ImageViewscaleType将强制位图在布局期间自动调整大小。这里是可用 scaleTypes 的参考:ImageView.ScaleType

当然,您必须在 XML 中为 LinearLayout、ImageView 和 TextView 调整布局参数,以便它们以您想要的精确方式居中、对齐和定向。但是,至少你只会做一次。

看起来您将从应用程序资源中将照片加载到 ImageView 中,您可能知道图像不是很大,因此您可以直接打开 Bitmap,或使用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 回答