根据textivew的大小调整图片大小

时间:2012-09-29 13:36:45

标签: android android-image

我有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;

1 个答案:

答案 0 :(得分:0)

您想要一种方法来计算布局后TextView的确切高度,以便您可以调整drawableLeft属性的位图大小。 几个问题加剧了这个问题:

  1. 如果文字换行到多行,则高度会发生显着变化。
  2. 取决于设备硬件屏幕密度,渲染大小 无论确切的大小如何,Bitmap都会被更改 缩放/渲染的位图,因此必须采用屏幕密度 在计算scaleFactor
  3. 时会考虑到这一点
  4. 最后,scaleFactor未提供精确尺寸的图片请求。 它仅将位图的大小限制为尽可能小的图像 为了保存,它仍然与您的请求相同或更大 记忆。您仍然需要将图像调整到精确的高度 你已经计算好了。
  5. drawableLeft方法无法克服上述问题,我认为有一种更好的方法可以实现您的预​​期布局,而无需使用Java代码进行调整。

    我认为您应该使用包含LinearLayoutImageView的横向TextView替换TextView。将TextView的高度设置为"WRAP_CONTENT",并将ImageView的scaleType设置为“center”,如下所示:

    android:scaleType="center"
    

    LinearLayout将具有TextView中文本的高度,而ImageView的scaleType将强制在布局期间自动调整位图的大小。这里是可用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);
        }
    }