Android中如何通过代码使图片宽度适配TextView宽度
嘿,我明白你遇到的问题了——把Base64转成的图片加到TextView的右侧,但图片宽度没法适配TextView的宽度,想用ScaleType却发现不管用对吧?其实原因很简单:ScaleType是ImageView专属的属性,TextView的CompoundDrawables并不支持这个设置,得咱们手动来做图片缩放才行。
给你一套完整的解决方案,步骤很清晰:
- 首先得确保能拿到TextView的实际可用宽度(要去掉左右padding,因为CompoundDrawables的显示空间是TextView宽度减去padding后的部分)
- 根据原图宽度和可用宽度计算缩放比例,保持宽高比不变,避免图片变形
- 把原Bitmap缩放到适配的尺寸,再转成Drawable设置到TextView里
这里要注意一个坑:如果是在Activity的onCreate或者Fragment的onViewCreated里直接获取TextView宽度,可能会拿到0,因为此时View还没完成测量布局。所以得用ViewTreeObserver来监听布局完成后再处理。
下面是修改后的完整代码:
// 假设你在Activity或Fragment里,ctx是上下文,question是你的TextView,cur是Cursor question.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { // 移除监听,防止重复触发 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { question.getViewTreeObserver().removeOnGlobalLayoutListener(this); } else { question.getViewTreeObserver().removeGlobalOnLayoutListener(this); } // 解码Base64并处理图片缩放 byte[] img = Base64.decode(cur.getString(2), Base64.DEFAULT); Bitmap originalBitmap = BitmapFactory.decodeByteArray(img, 0, img.length); if (originalBitmap == null) { // 处理图片解码失败的情况,比如提示用户或设置默认图 return; } // 计算TextView的可用宽度(减去左右padding) int availableWidth = question.getWidth() - question.getPaddingLeft() - question.getPaddingRight(); if (availableWidth <= 0) { return; } // 计算缩放比例,保持宽高比 float scaleRatio = (float) availableWidth / originalBitmap.getWidth(); int newHeight = (int) (originalBitmap.getHeight() * scaleRatio); // 生成缩放后的Bitmap Bitmap scaledBitmap = Bitmap.createScaledBitmap(originalBitmap, availableWidth, newHeight, true); // 转成Drawable并设置到TextView Drawable qDrawable = new BitmapDrawable(ctx.getResources(), scaledBitmap); question.setCompoundDrawablesWithIntrinsicBounds(null, null, qDrawable, null); // 回收原Bitmap,避免内存占用过高 if (!originalBitmap.isRecycled()) { originalBitmap.recycle(); } } });
这样处理后,图片就会自动适配TextView的宽度,而且不会变形。另外如果你的TextView是wrap_content,那得确保它的父布局能给它一个确定的宽度,不然可用宽度还是会有问题哦。
内容的提问来源于stack exchange,提问作者Ben Ghaleb
相关产品推荐
相关产品推荐

