Android TextView的drawLeft、drawRight..

一、问题描述
有时候我们需要在TextView的左边或者是别的位置去显示一张图片(如图1)。以往的做法是在TextView的左边或者是别的位置添加一个ImageView控件,来达到我们想要的效果。仔细查看编译器给我们的提示,我们会惊奇的发现,Android API给我们提供了“android:drawableLeft=”“”去设置TextView左边显示图片,它也建议我们去采用这样的方法去做。但事实上它并不能满足我们想要的效果,当你想动态的去改变显示的图片,发现我们找不到这个方法了,还是得用以往的做法。都说度娘好,结果我却没有百度到(可能是个人能力差吧!),经过我不断的摸索,找到了一个可行的办法,但不一定都能满足你想要的效果,写篇小博客,把这个方法分享给大家。

Android TextView的drawLeft、drawRight.._第1张图片

                          图1 TextView左边显示图片     

Android TextView的drawLeft、drawRight.._第2张图片

                              图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不同方位上的图片了。
由于小编学艺不精,文中难免有错误之处,还望指正。谢谢合作!

你可能感兴趣的:(Android)