Android TextView的drawLeft、drawRight..

原创 2016年05月31日 10:11:15

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

图1 TextView左边显示图片效果图

                          图1 TextView左边显示图片     

TextView上方显示图片

                              图2 TextView上方显示图片

二、问题分析
TextView是Android经常用到的组件。当我们在自定义控件时,需要在TextVeiw的左边(图1)、上方(图2)去显示图片。在Android API提供的方法中,可以在XML文件里去设置,但很遗憾的是,我们在Java中找不到这样的方法动态去改变要显示的图片。这时,你不得不在TextView的左边或者是上方去嵌套一个ImageView来实现你想要的效果了。其实不用这么繁琐,小编帮你解决这个问题。

三、具体方法
1、首先新建一个XML文件,在布局中加入一个TextView,并添加上控件ID。代码如下:

<?xml version="1.0" encoding="utf-8"?>
<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" />
 <!-- 图片与文字的间距可通过android:drawablePadding=""来设置 -->
</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不同方位上的图片了。
由于小编学艺不精,文中难免有错误之处,还望指正。谢谢合作!

版权声明:本文为博主原创文章,由于博主技术能力有限,文中难免存在错误,还望指正,转载请注明出处。

相关文章推荐

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

在代码中修改设置某种情况下TextView等控件的drawLeft等的图片

先上效果图               在做某个项目的夜间模式的时候,需要改变夜间模式下的icon,这时候属性修改已经不起作用了,所以需要在代码中修改。 修改的代码如下: bo...

drawleft,textview、EditText中图片大小设置

很多时候我们在textview或者edittext等的控件里面设置图片,比如搜索。 如果想要改变图片的大小,只要在代码里面设置: //比如drawleft设置图片大小 //获取图片 ...

代码中设置textview的drawleft

/** * 设置textview 的drawable属性 * * @param attention * @param drawableId */ ...

使用代码为textview设置drawableLeft

原问题来自于CSDN问答频道,更多解决方案见:http://ask.csdn.net/questions/903 原问题描述: xml中的textView: ...
  • CSDN_Ask
  • CSDN_Ask
  • 2013年03月06日 10:40
  • 45092

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

java 代码中实现 TextView的 DrawableTop属性

开发中我们想实现一种带图标的 TextView的时候 一般会使用 TextView的drawableTop,drawableLeft,等 属性,这个属性是在xml文件中定义的。 ...

动态设置view的padding和margin值,TextView drawLeft drawRight

1、动态设置padding,拿ImageView为例 ImageView imageView = new ImageView(Context context); imageView.setP...

Android 中TextView的DrawableLeft与DrawableRight与文字一起居中显示

在开发中,我们有时候会彭代需要让文字和图片一起居中显示的效果,但是设置两个View显然是没必要的,textView就可以实现这个功能,那么怎么让textView的图片紧贴着文字居中显示呢,废话不多说,...

432_drawable在中间的TextView

drawable在中间的TextView 举个例子,TextView是match_parent的 然后文字在这个View的中心 如果这时候去drawableLeft 那么dra...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android TextView的drawLeft、drawRight..
举报原因:
原因补充:

(最多只允许输入30个字)