Android自定义TextView实现文字图片居中显示的方法

作者:布丁西西 时间:2023-07-21 12:46:00 

最近有个需求是这样的,人民币的符号“¥”因为安卓手机系统的不一致导致符号不是完全一样,所以用美工的给的图片代替,考虑到用的地方比较多,所以想着写一个继承于线性布局的组合控件,后来一想,安卓中不是有TextView吗,这个自带图片的控件,后来写了个demo,因为我是用的MatchParent,导致问题出现,人民币符号不是和文字一样的居中,因此才有了这篇博文,让我们来自定义TextView吧,这个场景用的比较多。

分析下TextView的源码

我们先来分析下TextView的源码,因为TextView有上下左右四个方向的图片,上下咱就先不考虑了,因为一般来说图片垂直居中是没有问题的,我们就只处理这个left,和right方向上的图片, 我们直接看TextView的ondraw方法,因为TextView 也是继承自View,所有的绘制都将会在这里操作


<span style="font-size:18px;">int vspace = bottom - top - compoundPaddingBottom - compoundPaddingTop;
int hspace = right - left - compoundPaddingRight - compoundPaddingLeft;
// IMPORTANT: The coordinates computed are also used in invalidateDrawable()
// Make sure to update invalidateDrawable() when changing this code.
if (dr.mShowing[Drawables.LEFT] != null) {
 canvas.save();
 canvas.translate(scrollX + mPaddingLeft + leftOffset,
          scrollY + compoundPaddingTop +
          (vspace - dr.mDrawableHeightLeft) / 2);
 dr.mShowing[Drawables.LEFT].draw(canvas);
 canvas.restore();
}
// IMPORTANT: The coordinates computed are also used in invalidateDrawable()
// Make sure to update invalidateDrawable() when changing this code.
if (dr.mShowing[Drawables.RIGHT] != null) {
 canvas.save();
 canvas.translate(scrollX + right - left - mPaddingRight
     - dr.mDrawableSizeRight - rightOffset,
      scrollY + compoundPaddingTop + (vspace - dr.mDrawableHeightRight) / 2);
 dr.mShowing[Drawables.RIGHT].draw(canvas);
 canvas.restore();
}</span>

从上面可以看到有个canvas.translate方法,大概意思是,save后,将画布向X轴和Y轴分别平移了scrollX ..和scrollY,平移后,将left方向的图片绘制上去,最后restore还原到上个画布中,Right同理。

那这样,咱基本上就明白原理,TextView的四个方向都是通过Canvas的translate来绘制到文字的上下左右了,那咱们就只改这个scrollX 和 scrollY就可以实现咱的需求了吧。

具体实现

1.下面写有注释,不是特别麻烦,适配drawableLeft 和 drawableRight图片,PS,xml中不要设置Gravity,这样就可以居中了,代码如下:


<span style="font-size:18px;">package com.chaoxing.email.view;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.Gravity;
import android.widget.TextView;
/**
* use in xml
* use in code
*/
public class EmailCenterTextView extends TextView {
 public EmailCenterTextView(Context context) {
   super(context);
 }
 public EmailCenterTextView(Context context, AttributeSet attrs) {
   super(context, attrs);
 }
 public EmailCenterTextView(Context context, AttributeSet attrs, int defStyleAttr) {
   super(context, attrs, defStyleAttr);
 }
 @Override
 protected void onDraw(Canvas canvas) {
   Drawable[] drawables = getCompoundDrawables();
   if (null != drawables) {
     Drawable drawableLeft = drawables[0];
     Drawable drawableRight = drawables[2];
     float textWidth = getPaint().measureText(getText().toString());
     if (null != drawableLeft) {
       setGravity(Gravity.START | Gravity.CENTER_VERTICAL);
       float contentWidth = textWidth + getCompoundDrawablePadding() + drawableLeft.getIntrinsicWidth();
       if (getWidth() - contentWidth > 0) {
         canvas.translate((getWidth() - contentWidth - getPaddingRight() - getPaddingLeft()) / 2, 0);
       }
     }
     if (null != drawableRight) {
       setGravity(Gravity.END | Gravity.CENTER_VERTICAL);
       float contentWidth = textWidth + getCompoundDrawablePadding() + drawableRight.getIntrinsicWidth();
       if (getWidth() - contentWidth > 0) {
         canvas.translate(-(getWidth() - contentWidth - getPaddingRight() - getPaddingLeft()) / 2, 0);
       }
     }
     if (null == drawableRight && null == drawableLeft) {
       setGravity(Gravity.CENTER);
     }
   }
   super.onDraw(canvas);
 }
}</span>

更新效果图(因为之前有看到网友回复,最近又用到了再更新下这个博客)

title是用的就是EmailCenterTextView,那个箭头上下的就是设置的drawableRight,演示的未读和垃圾箱EmailCenterTextView没有设置图片

Android自定义TextView实现文字图片居中显示的方法

来源:http://blog.csdn.net/shenshibaoma/article/details/53405524

标签:Android,自定义,TextView,文字,图片,居中
0
投稿

猜你喜欢

  • Android Intent实现页面跳转的方法示例

    2021-11-08 05:27:22
  • 详解用Eclipse如何创建Web项目

    2023-11-11 05:41:01
  • Spring Boot创建非可执行jar包的实例教程

    2022-10-05 12:47:35
  • java使用集合实现通讯录功能

    2023-01-30 21:27:15
  • SpringMvc+Mybatis+Pagehelper分页详解

    2021-08-13 14:15:11
  • Android组合控件自定义标题栏

    2021-11-04 01:12:36
  • arthas排查jvm中CPU占用过高问题解决

    2022-07-15 20:31:49
  • SpringBoot整合WebSocket实现后端向前端发送消息的实例代码

    2021-10-30 19:24:56
  • 详解DES&3DES算法的原理以及C#和JS的实现

    2021-06-29 21:58:07
  • Android游戏开发学习之引擎用法实例详解

    2023-09-26 16:01:57
  • 功能强大的Android滚动控件RecyclerView

    2022-11-30 13:45:27
  • Android调用外置摄像头的方法

    2021-10-19 01:25:13
  • SpringDataJPA在Entity中常用的注解介绍

    2023-11-27 09:40:36
  • Java拦截器Interceptor实现原理及代码示例

    2023-11-04 03:49:32
  • flutter Container容器实现圆角边框

    2021-06-17 23:16:23
  • Java项目有中多个线程如何查找死锁

    2023-01-06 06:17:35
  • 关于C#中yield return用法的思考

    2021-11-30 14:05:40
  • android中在Activity中响应ListView内部按钮的点击事件的两种方法

    2021-12-25 16:31:07
  • C# XML操作类分享

    2022-02-16 03:22:03
  • java求余的技巧汇总

    2023-08-06 06:33:16
  • asp之家 软件编程 m.aspxhome.com