TextView中drawableStart End Top Bottom 与 文本的的绘制过程

今天被一个简单的TextView布局搞晕了,代码如下:

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:drawableStart="@drawable/abs__ic_cab_done_holo_light"
        android:gravity="center"
        android:text="文字相对谁居中" />

现在效果及我的疑问如下:

显而易见,文字是居于去掉drawableStart后的空间居中。那么TextView是如何实现的呢?

仔细阅读TextView的源码,很容易发现在onDraw中,它做了一个canvas的translate

代码如下:

            // IMPORTANT: The coordinates computed are also used in invalidateDrawable()
            // Make sure to update invalidateDrawable() when changing this code.
            if (dr.mDrawableLeft != null) {
                canvas.save();
                canvas.translate(scrollX + mPaddingLeft + leftOffset,
                                 scrollY + compoundPaddingTop +
                                 (vspace - dr.mDrawableHeightLeft) / 2);
                dr.mDrawableLeft.draw(canvas);
                canvas.restore();
            }

其实很简单,但是我却一直认为文本是应该相对整个TextView的空间居中呢。看来仔细阅读源码,适时的跟踪调试很重要。

有一个哥们分享的 android graphics 很适合理解TextView的OnDraw, 记录下!

相关文章:

1、《android Graphics(一):概述及基本几何图形绘制》
2、《android Graphics(二):路径及文字》
3、《android Graphics(三):区域(Range)》
4、《android Graphics(四):canvas变换与操作》

时间: 2024-11-13 09:32:37

TextView中drawableStart End Top Bottom 与 文本的的绘制过程的相关文章

Android TextView中实现点击文本超链接(无下划线)的封装类

android中有的时候须要在TextView上设置一些超链接,点击这些超链接时进行一些操作.比如新浪微博上的一些keyword,点击时会跳转到对应的页面. 怎样实现我们就直接看源代码吧. /** * * created by Mr.Simple, Aug 21, 20141:51:40 PM. * Copyright (c) 2014, hehonghui@umeng.com All Rights Reserved. * * ##################################

[转]C#Linq中的Union All/Union/Intersect和Top/Bottom和Paging和SqlMethods,skip,take,takewhile,skipwhile,编译查询等

本文转自:http://www.cnblogs.com/suizhikuo/p/3791799.html 我们继续讲解LINQ to SQL语句,这篇我们来讨论Union All/Union/Intersect操作和Top/Bottom操作和Paging操作和SqlMethods操作 . Union All/Union/Intersect操作 适用场景:对两个集合的处理,例如追加.合并.取相同项.相交项等等. Concat(连接) 说明:连接不同的集合,不会自动过滤相同项:延迟. 1.简单形式:

如何在一个TextView中显示不同颜色的文本

在唯品会app中,我们可以看到它里面有些文本控件能够显示不同颜色的文本,这种效果看起来蛮不错的.先上个效果图: 其实,在这上面使用的是一个TextView控件来显示这段文本的.而文本内容是使用html的格式实现的,代码如下: text.setText(Html.fromHtml("<font color=\'#858585\'>购买前如有任何疑问,欢迎使用:</font><font color=\'#f02387\'><U>购物咨询</U&g

【Android】动态设置android:drawableLeft|Right|Top|Bottom

Android中有时需动态设置控件四周的drawble图片,这个时候就需要调用 setCompoundDrawables(left, top, right, bottom),四个参数类型都是drawable Button继承TextView,所以可以采用相同的设置方法 方法一.XML方式   <TextView android:id="@+id/bookTitle" android:layout_width="match_parent" android:lay

Android ImageSpan与TextView中的text居中对齐问题解决(无论TextView设置行距与否)

先解释一个类:Paint.FontMetrics,它表示绘制字体时的度量标准.google的官方api文档对它的字段说明如下: ascent: 字体最上端到基线的距离,为负值. descent:字体最下端到基线的距离,为正值. 看下图: 中间那条线就是基线,基线到上面那条线的距离就是ascent,基线到下面那条线的距离就是descent. 回到主题,我们要让imagespan与text对齐,只需把imagespan放到descent线和ascent线之间的中间位置就可以了.实现方式为重写Imag

Android View坐标Left, Right, Top, Bottom

1.分析说明Left, Right, Top, Bottom View中对于该字段说明如下,相对父布局的的位置 相对父布局的左边位置 Left 相对父布局的右边位置 Right 相对父布局的左上边位置 Top 相对父布局的下边位置 Bottom 对于上述的理解可以根据二位坐标系来理解,(left,right),(top,bottom) 2,对应API的调用如下: 视图左侧位置 mView.getLeft(); 视图右侧位置 mView.getRight(); 视图上侧位置 mView.getTo

Android TextView中文字通过SpannableString来设置超链接、颜色、字体等属

在Android中,TextView是我们最常用的用来显示文本的控件. 一般情况下,TextView中的文本都是一个样式.那么如何对于TextView中各个部分的文本来设置字体,大小,颜色,样式,以及超级链接等属性呢?下面我们通过SpannableString的具体实例操作来演示一下. res-layout-main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:and

我的Android进阶之旅------&gt; Android在TextView中显示图片方法

面试题:请说出Android SDK支持哪些方式显示富文本信息(不同颜色.大小.并包含图像的文本信息),并简要说明实现方法. 答案:Android SDK支持如下显示富文本信息的方式. 1.使用TextView组件可以显示富文本信息.在TextView组件中可以使用富文本标签来显示富文本信息,这种标签类似于HTML标签,但比HTML标签简单,支持有限的几种显示富文本的方式.如<font>标签用于设置字体和颜色,<b>用于设置粗体.包含这些标签的文本不能直接作为TextView.se

一起学android之如何设置TextView中不同字段的字体颜色(22)

在这里先看看效果图: OK,有时候,在我们的项目中会要求TextView中文本有一部分的字体颜色不一样,这时我们应该使用 SpannableStringBuilder这个工具类,当然这个类的功能很强大,这里我只是实现上面的样式,其它的不做介绍, SpannableStringBuilder的实现接口是Spannable这个接口,而Spannable最终都实现了CharSequence,因此我们直 接可以通过TextView.setText()来进行设置. 下面给出实现代码: public cla