Android TextView的drawLeft、drawRight..

一、问题描述
有时候我们需要在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不同方位上的图片了。
由于小编学艺不精,文中难免有错误之处,还望指正。谢谢合作!

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Android开发中,TextView是用于显示文本的一个重要控件。当TextView上的文本超过控件的宽度时,可以通过一些属性和方法来处理这种情况。 一种常见的情况是,当文字长度超过TextView控件宽度时,会以省略号(...)的方式显示。这是通过在TextView中设置"android:ellipsize"属性来实现的。这个属性有几个可选值,其中"end"是最常用的,用于在末尾显示省略号。除了"end"之外,还有"start"(在开头显示省略号)、"middle"(在中间显示省略号)和"marquee"(以跑马灯的方式滚动显示文本)等可选值。 除了设置"android:ellipsize"属性外,还可以通过TextView的setMaxLines()方法来控制TextView最多显示的行数。当超过设置的行数时,同样会显示省略号。 另外,如果需要在代码中动态处理超过字符的情况,可以使用getText()方法获取TextView上的文本,然后通过判断文本的长度来处理。可以使用TextUtils类的ellipsize()方法,传入文本、TextView的宽度和省略号位置等参数,返回一个处理后的文本,再将其设置给TextView即可。 总之,Android中的TextView提供了多种处理超过字符的方式。可以通过设置"android:ellipsize"属性控制省略号的位置,使用setMaxLines()方法控制最大行数,或者通过代码动态处理文本长度,使用TextUtils类的ellipsize()方法来截取文本并添加省略号。这些方法可以根据具体的需求来选择和使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值