一、问题描述
有时候我们需要在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。代码如下:

<?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" /> 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;    }//变换完图片的大小后,我们就可以去设置要显示的图片了//调用该方法后一定要判断是否为nullDrawable drawable = zoomDrawable(x,x,x);if(drawable != null){    id_show_data_num.setCompoundDrawablesWithIntrinsicBounds(drawable, null, null, null);    //图片操作是很耗资源的,记得要释放不需要的临时变量    drawable = null;}

到此,我们便完成了同过Java代码去设置TextView不同方位上的图片了。
由于小编学艺不精,文中难免有错误之处,还望指正。谢谢合作!

更多相关文章

  1. 不吹不黑!GitHub 上帮助人们学习编码的 12 个资源,错过血亏...
  2. 一款霸榜 GitHub 的开源 Linux 资源监视器!
  3. kotlin实现Android(安卓)MVP模式开发
  4. Android初始化的时候获取加载的布局的宽高(续)--RelativeLayout
  5. Android知识点总结:Android选取、拍照与裁剪图片相关流程分析
  6. Android的repaint函数
  7. 使用NDK移植开源项目,JNI的使用技巧
  8. android周记1
  9. eclipse项目导入android studio 各类问题及解决方法

随机推荐

  1. 五分钟让你快速弄懂MySQL索引下推
  2. MySQL的索引系统采用B+树的原因解析
  3. Mysql prepare预处理的具体使用
  4. mysql索引失效的十大问题小结
  5. mysql隔离级别详解及示例
  6. Docker启动mysql配置实现过程
  7. MySQL中常见的六个约束类型详解
  8. MySQL中的回表和索引覆盖示例详解
  9. 浅谈订单重构之 MySQL 分库分表实战篇
  10. CentOS7安装MySQL 8.0.26的过程