自定义UI 简易图文混排

本文介绍如何在Android中实现自定义UI的图文混排,详细讲解了加载图片、文字测量与绘制,包括如何获取文本宽高、计算绘制位置等关键步骤,并提供了示例代码。
摘要由CSDN通过智能技术生成

系列文章目录

  1. 自定义UI 基础知识
  2. 自定义UI 绘制饼图
  3. 自定义UI 圆形头像
  4. 自定义UI 自制表盘
  5. 自定义UI 简易图文混排
  6. 自定义UI 使用Camera做三维变换
  7. 自定义UI 属性动画
  8. 自定义UI 自定义布局


前言

这系列的文章主要是基于扔物线的HenCoderPlus课程的源码来分析学习。



这一篇文章主要介绍的是文字的测量,更多的内容可以参考:HenCoder Android 开发进阶:自定义 View 1-3 drawText() 文字的绘制

创建绘制对象

我们需要创建一个画笔🖌Paint来绘制我们的头像的边框,也需要提前加载我们的头像到内存(Bitmap)中。

public class ImageTextView extends View {
   
	// 图片的宽度
    private static final float IMAGE_WIDTH = Utils.dp2px(100);
    // 图片的偏移位置
    private static final float IMAGE_OFFSET = Utils.dp2px(80);

    Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
    // 头像
    Bitmap bitmap;

    public ImageTextView(Context context, @Nullable AttributeSet attrs) {
   
        super(context, attrs);
    }

    {
   
    	// 记载图片的代码请见下一小节
        bitmap = getAvatar((int) IMAGE_WIDTH);
    }

}

加载图片

为避免出现java.lang.OutOfMemory异常,请先检查位图的尺寸,然后再对其进行解码,除非您绝对信任该来源可为您提供大小可预测的图片数据,以轻松适应可用的内存。——引用自Android官方文档:高效加载大型位图

下述源码的分析请见官方的说明:将按比例缩小的版本加载到内存中

public class ImageTextView extends View {
   

    // 头像
    Bitmap bitmap;

    Bitmap getAvatar(int width) {
   
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeResource(getResources(), R.drawable.avatar_rengwuxian, options);
        options.inJustDecodeBounds = false;
        options.inDensity = options.outWidth;
        options.inTargetDensity = width;
        return BitmapFactory.decodeResource(getResources(), R.drawable.avatar_rengwuxian, options);
    }
}

自定义绘制内容

先上一下我们绘制简易图文混排的效果图。

示意图

绘制图片

public class ImageTextView extends View {
   
    // 图片的宽度
    private static final float IMAGE_WIDTH = Utils.dp2px(100);
    // 图片的偏移位置
    private static final float IMAGE_OFFSET = Utils.dp2px(80);

    Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
    // 头像
    Bitmap bitmap;

    @Override
    protected void onDraw(Canvas canvas) {
   
        super.onDraw(canvas);

        canvas.drawBitmap(bitmap, getWidth() - IMAGE_WIDTH, IMAGE_OFFSET, paint);
    }
}
示意图

绘制文字

绘制文字是图文混排的重头戏。我们需要在确保不会和图片重合的前提下,将文字分布在图片的周围。同时,我们还需要让文字和合适的地方自动换行,确保不会绘制到屏幕外边去。

示意图

如上图所示,我们需要将文字绘制在红色区域。那么我们开始绘制吧。


绘制中,有几个关键的问题

  1. 如何计算/获取将要绘制的文本的宽高?
  2. 如何计算第N行的将要绘制文本的起始位置?
  3. 如何计算将要绘制文本的位置所允许的最大宽度和字符数量?

让我们带着问题去学习吧。

文本宽高获取

文本的宽高的获取可以通过android.graphics.Paint.FontMetrics来实现。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
一直以来都比较羡慕那些,界面美观,功能强大的即时通讯软件,自己慢慢摸索了好长时间,用MFC做了一个聊天程序主窗口演示小程序。 该程序主要自定义了CRichEditCtrl控件,使用XML技术与GDI处理各种图片及QQ表情组件,串行化数据等,使得程序拥有了一般聊天程序应用的特色(同时仿FeiQ程序的自动释放程序运行需要的资源到安装目录): 支持字体设置、图文混排、表情及各种格式图片的插入、发送与保存,聊天记录的保存等等... 1、聊天输入、输出窗口:使用CRichEditCtrl控件,扩展后方便了字体设置、图文混排、表情及各种格式图片的插入,及窗口上右键菜单的功能。 2、聊天表情:这一部分是我精心制作的,使用GDI处理各种图片使得程序支持各种格式图片的预览、插入、保存。使用XML技术,方便快捷管理表情数据。自动释放表情图片资源(程序所在目录)及QQ表情组件(放到\System32\ImageOle.dll),程序自动注册组件,让程序支持GIF格式表情的插入。程序仿FeiQ自动生成表情页面缓存图片,快捷增加大量表情。本程序生成缓存图时,使用多线程技术,增加、修改完后立即更新页面缓存图,几千张图片,马上生成完成。 3、表情管理:支持表情的添加、删除、修改,移动,导入、导出表情库等,修改完后自动删除需要更新的页面缓存图,及程序程序无关的文件等。 4、聊天记录:使用串行化数据技术,将聊天记录生成到Log.dat文件中,可分页浏览记录。 本程序本人精心制件,最近一段时间在弄一个即时通讯软件,程序马上完工,完工后立即上传,由于弄程序花了不少精力,出于私心暂时不公布了。。。。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值