热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

android之文本前面或后面多标签

之前写过一篇图文混排的,算法就是通过计算文本宽及行数,在换行的时候截取文本剩余的部分显示在图片下边,代码下载:demo今天这边是工作共常用到的,标签在前或在最后显示,比如帖子前边显示

之前写过一篇图文混排的,算法就是通过计算文本宽及行数,在换行的时候截取文本剩余的部分显示在图片下边,

代码下载:demo


今天这边是工作共常用到的,标签在前或在最后显示,比如帖子前边显示多个标签表示精华帖、优秀帖、解决标签等;其实主要是重写DynamicDrawableSpan,以及通过设置SpanableStringBuilder,来显示的。

先上图


代码如下:

主要是将普通文本替换成图片文本之后(spannaableString)追加到文本后边

/**
* 添加标签
*
* @param tagIconPosition 将标签放在文本的前面或者后边
* @param tagDrawableIdList 本地标签的drawableId集合
*/
private CharSequence addTagText(final int tagIconPosition, final List tagDrawableIdList, CharSequence emojiText) {
if (tagDrawableIdList == null || tagDrawableIdList.size() == 0) {
return emojiText;
}
setText(emojiText);
SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder("");

for (int i = 0; i spannableStringBuilder.append("t ");
}

for (int i = 0; i int resourceId = tagDrawableIdList.get(i);
TagSpan tagSpanned = new TagSpan(context, resourceId, (int) getTextSize(), TagSpan.ALIGN_BASELINE, (int) getTextSize());
spannableStringBuilder.setSpan(tagSpanned, i * 2, i * 2 + 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
CharSequence sepText = getText();
if (tagIcOnPosition== START) {//icon显示在前面
spannableStringBuilder.append(sepText);
} else {
spannableStringBuilder.insert(0, sepText);
}
// setText(spannableStringBuilder);//最后设置
return spannableStringBuilder;
}


重写DynamicDrawableSpan类,设置tag的位置,主要是因为用原生的Span会有边界错位的问题,所以要重写onDraw()

代码如下:也不复杂,计算方式自己根据需要调整

public Drawable getDrawable() {
if (mDrawable == null) {
try {
mDrawable = mContext.getResources().getDrawable(mResourceId);
mHeight = mSize;
mWidth = mHeight * mDrawable.getIntrinsicWidth() / mDrawable.getIntrinsicHeight();
mTop = (mTextSize - mHeight) / 2;
// 设置边界还是会导致错位
mDrawable.setBounds(0, mTop, mWidth, mTop + mHeight);
} catch (Exception e) {
// swallow
}
}
return mDrawable;
}

@Override
public void draw(Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, Paint paint) {
//super.draw(canvas, text, start, end, x, top, y, bottom, paint);
Drawable b = getCachedDrawable();
canvas.save();

int transY = bottom - b.getBounds().bottom;
if (mVerticalAlignment == ALIGN_BASELINE) {// 绘制图片的位置
transY = top + ((bottom - top) / 2) - ((b.getBounds().bottom - b.getBounds().top) / 2) - mTop;
}
// 由于图片会错位,所以要移动这个画布
canvas.translate(x, transY);
b.draw(canvas);
canvas.restore();
}





现在说另一种实现方式:不过就是因为这种实现方式有错位问题,才使用方式一的,但是有些情况不需要自定义DynamicDrawableSpan就可以插入文本的,多学点无坏处吧,一并写下来说不定以后对自己有帮助

实现方式是通过Html.fromHtml( text,imageGetter);实现的;

代码如下:

1 、实现一个html转化时需要的imageGetter,主要用于识别html 带有的标签

/**
* 注:在异步线程中:先将文本表情转换成charsequence,然后加载icon,再者将icon放在文本表情的前或后,最后通过handler在主线程中设置textview 下午8:47:02 Spanned
*/
private Spanned convertTagToIconSpanned(CharSequence emojiText, int tagIconPosition, List tagDrawablIds) {
StringBuilder temp = new StringBuilder();
for (int i : tagDrawablIds) {//先将drawId转成html标签,
temp.append(" ");
}

Spanned tagSpanned = Html.fromHtml(temp.toString(), getImageGetterInstance(), null);
if (tagIcOnPosition== START) {// 本地图片放在文本前边
SpannableStringBuilder span = new SpannableStringBuilder(tagSpanned);
span.append(emojiText);
return span;
} else if (tagIcOnPosition== END) {// 本地图片放在文本后边
SpannableStringBuilder span = new SpannableStringBuilder(emojiText);
span.append(tagSpanned);
return span;
}
return new SpannableStringBuilder(emojiText);
}

2、获取标签的图片

/**
* ImageGetter用于text图文混排
*
* @return
*/
public ImageGetter getImageGetterInstance() {
ImageGetter imgGetter = new ImageGetter() {
@Override
public Drawable getDrawable(String source) {// 可用于加载本地图片和网络图片,source就是标签设置的 src的值
int fOntH= (int) (getTextSize());
int id = Integer.parseInt(source);

Drawable d = drawableMap.get(id);

if (d == null) {
d = getResources().getDrawable(id);
drawableMap.put(id, d);
}

int height = fontH;
int width = (int) ((float) d.getIntrinsicWidth() / (float) d.getIntrinsicHeight()) * fontH;
if (width == 0) {
width = d.getIntrinsicWidth();
}

d.setBounds(0, 0, width, height);

return d;
}
};
return imgGetter;
}

3,通过html转化成 Spanned ;用于setText(),就完成设置了

Spanned tagSpanned = Html.fromHtml(temp.toString(), getImageGetterInstance(), null);

希望对你有一点帮助

多标签Demo



推荐阅读
  • 编译原理中的语法分析方法探讨
    本文探讨了在编译原理课程中遇到的复杂文法问题,特别是当使用SLR(1)文法时遇到的多重规约与移进冲突。文章讨论了可能的解决策略,包括递归下降解析、运算符优先级解析等,并提供了相关示例。 ... [详细]
  • 使用TabActivity实现Android顶部选项卡功能
    本文介绍如何通过继承TabActivity来创建Android应用中的顶部选项卡。通过简单的步骤,您可以轻松地添加多个选项卡,并实现基本的界面切换功能。 ... [详细]
  • 对于初学者而言,搭建一个高效稳定的 Python 开发环境是入门的关键一步。本文将详细介绍如何利用 Anaconda 和 Jupyter Notebook 来构建一个既易于管理又功能强大的开发环境。 ... [详细]
  • 二维码的实现与应用
    本文介绍了二维码的基本概念、分类及其优缺点,并详细描述了如何使用Java编程语言结合第三方库(如ZXing和qrcode.jar)来实现二维码的生成与解析。 ... [详细]
  • 本文介绍了如何通过C#语言调用动态链接库(DLL)中的函数来实现IC卡的基本操作,包括初始化设备、设置密码模式、获取设备状态等,并详细展示了将TextBox中的数据写入IC卡的具体实现方法。 ... [详细]
  • Windows操作系统提供了Encrypting File System (EFS)作为内置的数据加密工具,特别适用于对NTFS分区上的文件和文件夹进行加密处理。本文将详细介绍如何使用EFS加密文件夹,以及加密过程中的注意事项。 ... [详细]
  • Android与JUnit集成测试实践
    本文探讨了如何在Android项目中集成JUnit进行单元测试,并详细介绍了修改AndroidManifest.xml文件以支持测试的方法。 ... [详细]
  • 深入解析WebP图片格式及其应用
    随着互联网技术的发展,无论是PC端还是移动端,图片数据流量占据了很大比重。尤其在高分辨率屏幕普及的背景下,如何在保证图片质量的同时减少文件大小,成为了亟待解决的问题。本文将详细介绍Google推出的WebP图片格式,探讨其在实际项目中的应用及优化策略。 ... [详细]
  • 深入解析层次聚类算法
    本文详细介绍了层次聚类算法的基本原理,包括其通过构建层次结构来分类样本的特点,以及自底向上(凝聚)和自顶向下(分裂)两种主要的聚类策略。文章还探讨了不同距离度量方法对聚类效果的影响,并提供了具体的参数设置指导。 ... [详细]
  • 深入理解Java SE 8新特性:Lambda表达式与函数式编程
    本文作为‘Java SE 8新特性概览’系列的一部分,将详细探讨Lambda表达式。通过多种示例,我们将展示Lambda表达式的不同应用场景,并解释编译器如何处理这些表达式。 ... [详细]
  • c语言二元插值,二维线性插值c语言
    c语言二元插值,二维线性插值c语言 ... [详细]
  • flea,frame,db,使用,之 ... [详细]
  • 在将 Android Studio 从 3.0 升级到 3.1 版本后,遇到项目无法正常编译的问题,具体错误信息为:org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:processDemoProductDebugResources'。 ... [详细]
  • 实践指南:使用Express、Create React App与MongoDB搭建React开发环境
    本文详细介绍了如何利用Express、Create React App和MongoDB构建一个高效的React应用开发环境,旨在为开发者提供一套完整的解决方案,包括环境搭建、数据模拟及前后端交互。 ... [详细]
  • 本文将在前几篇关于Android测试理论知识的基础上,通过ApiDemoTest实例详细探讨如何使用ApplicationTestCase进行Android应用测试。建议读者先阅读Android测试教程系列中的相关内容,以便更好地理解本文的实践部分。 ... [详细]
author-avatar
我本僐悢
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有