一、问题描述
有时候我们需要在TextView的左边或者是别的位置去显示一张图片(如图1)。以往的做法是在TextView的左边或者是别的位置添加一个ImageView控件,来达到我们想要的效果。仔细查看编译器给我们的提示,我们会惊奇的发现,Android API给我们提供了“android:drawableLeft=”“”去设置TextView左边显示图片,它也建议我们去采用这样的方法去做。但事实上它并不能满足我们想要的效果,当你想动态的去改变显示的图片,发现我们找不到这个方法了,还是得用以往的做法。都说度娘好,结果我却没有百度到(可能是个人能力差吧!),经过我不断的摸索,找到了一个可行的办法,但不一定都能满足你想要的效果,写篇小博客,把这个方法分享给大家。
图1 TextView左边显示图片
图2 TextView上方显示图片
二、问题分析
TextView是Android经常用到的组件。当我们在自定义控件时,需要在TextVeiw的左边(图1)、上方(图2)去显示图片。在Android API提供的方法中,可以在XML文件里去设置,但很遗憾的是,我们在Java中找不到这样的方法动态去改变要显示的图片。这时,你不得不在TextView的左边或者是上方去嵌套一个ImageView来实现你想要的效果了。其实不用这么繁琐,小编帮你解决这个问题。
三、具体方法
1、首先新建一个XML文件,在布局中加入一个TextView,并添加上控件ID。代码如下:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<TextView
android:id="@+id/id_show_data_num"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:layout_marginLeft="15dp"
android:textColor="@color/white"
android:textSize="18sp" />
RelativeLayout>
2、在Java代码里获取控件ID,此时便可以通过下面这个方法来设置你要显示的图片,这个方法需要传入的是ID或者drawable资源。
参数含义:望文生义。当别的地方不需要显示时,ID资源设置为0(不要设置为负数,否则会崩溃哦!目前只有0才屡试不爽,正数也不管用,自己可以去试试别的参数,具体原因,还在挖掘),drawable设置为null即可。
TextView.setCompoundDrawablesWithIntrinsicBounds(Drawable left, Drawable top, Drawable right, Drawable bottom)
TextView.setCompoundDrawablesWithIntrinsicBounds(int left, int top, int right, int bottom)
//1、通过ID资源设置
id_show_data_num.setCompoundDrawablesWithIntrinsicBounds(resourceId, 0,
0, 0);
//2、通过drawable资源设置
id_show_data_num.setCompoundDrawablesWithIntrinsicBounds(null, drawable, null, null);
四、方法优化
上述的做法有一个最大的缺点,你所设置的图片原图有多大,它就显示多大,这是很令人头疼的。有时我需要大图又需要小图,那么我就是将这个两张图片都准备出来,这不仅仅是增大了应用体积的问题,我还得想个好听名称去命名(对于我这种懒人无法接受)。下面告诉你解决这个问题的办法,而你只需准备一张大图就OK(为什么不用小图:大图变小图很清晰,反过来呢??)。
方法:
上面说到,可以用drawable资源去设置要显示的图片,那么在加载这个资源时,我们是可以变换一下drawable的大小的。将图变成我们想要的大小后,我们在去设置显示图片。
/**
* 变换资源图片的大小
* @param drawable 将要变换的图片,可以是ID资源,此处使用drawable
* @param w 目标图片宽
* @param h 目标图片高
* @return Drawable
*/
public static Drawable zoomDrawable(Drawable drawable, int w, int h) {
//如果传入的是ID资源,启动此行代码,要传入当前上下文哦
//Drawable drawable = context.getResources().getDrawable(R.id.resourceId);
if(drawable == null)
return null;
// 取 drawable 的颜色格式
Bitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888
: Bitmap.Config.RGB_565;
// 建立对应 bitmap
Bitmap bitmap = Bitmap.createBitmap(w, h, config);
// 建立对应 bitmap 的画布
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, w, h);
// 把 drawable 内容画到画布中
drawable.draw(canvas);
drawable = new BitmapDrawable(bitmap);
//图片操作是很耗资源的,记得要释放不需要的临时变量
canvas = null;
bitmap = null;
return drawable;
}
//变换完图片的大小后,我们就可以去设置要显示的图片了
//调用该方法后一定要判断是否为null
Drawable drawable = zoomDrawable(x,x,x);
if(drawable != null){
id_show_data_num.setCompoundDrawablesWithIntrinsicBounds(drawable, null, null, null);
//图片操作是很耗资源的,记得要释放不需要的临时变量
drawable = null;
}
到此,我们便完成了同过Java代码去设置TextView不同方位上的图片了。
由于小编学艺不精,文中难免有错误之处,还望指正。谢谢合作!