首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏lzj_learn_note

    Android ImageSpan与TextView同一行图片居中

    这时候会遇到图片ImageSpan没有办法居中的问题。在解决这个问题之前,先学习字体属性Paint.FontMetrics。 ? 图片1 ? fontMetric.descent; top线Y坐标 = baseline线的y坐标 + fontMetric.top; bottom线Y坐标 = baseline线的y坐标 + fontMetric.bottom; ImageSpanImageSpan的构造函数中有一个对齐方式的参数,但只提供了 ALIGN_BASELINE(顶部对齐)、ALIGN_BOTTOM (底部对齐)两种对齐方式,没有居中对齐的方式, 所以只能重写ImageSpan

    2.9K20发布于 2018-09-12
  • 来自专栏非著名程序员

    Android中如何实现图文混排

    is = new ImageSpan(dd, ImageSpan.ALIGN_BASELINE); ssb.setSpan(is, temp.length()-1, temp.length() getDrawable(R.drawable.icon); d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight()); //创建ImageSpan ImageSpan span = new ImageSpan(d, ImageSpan.ALIGN_BASELINE); //用ImageSpan替换文本 ss.setSpan(span, 18, 19 添加图片主要用SpannableString和ImageSpan类: Drawable drawable = getResources().getDrawable(id); drawable.setBounds ImageSpan span = new ImageSpan(drawable, ImageSpan.ALIGN_BASELINE); //开始替换,注意第2和第3个参数表示从哪里开始替换到哪里替换结束

    1.7K90发布于 2018-02-02
  • 来自专栏指尖下的Android

    Android 原生 ImageSpan 垂直局中及左右边距问题解决

    关于Android 原生 ImageSpan 无法设置垂直局中及左右边距问题,找了很多博客,均无效或者有 bug,只能自己动手了,代码经测试有效。 import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.text.style.ImageSpan ; import androidx.annotation.NonNull; public class VerticalImageSpan extends ImageSpan { private drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); VerticalImageSpan imageSpan = new VerticalImageSpan(drawable, margin, 0); spannableString.setSpan(imageSpan, content.length

    1.8K20发布于 2021-05-06
  • 来自专栏Code

    Android控件TextView实现静态图与动态GIF图文混排

    CenterAlignImageSpan imageSpan = new CenterAlignImageSpan(drawable); sp.setSpan(imageSpan , 0, 1, ImageSpan.ALIGN_BASELINE);//0,1表示展示图片的起始位置,占一个字的位置 textOne.setText(sp); CenterAlignImageSpan 工具类: public class CenterAlignImageSpan extends ImageSpan { public CenterAlignImageSpan(Drawable [] imgs = sp.getSpans(0,end,ImageSpan.class); StyleSpan[] styleSpens = sp.getSpans(0,end, url : imgs){ ImageSpan span = new ImageSpan(getUrlDrawable(url.getSource(),tv),url.getSource

    2.4K30发布于 2019-08-27
  • 来自专栏Android开发与分享

    【Android】强大的SpannableStringBuilder

    ImageSpan : 图片 RelativeSizeSpan : 相对大小(文本字体) ScaleXSpan : 基于x轴缩放 StyleSpan : 字体样式:粗体、斜体等 SubscriptSpan imageSpan = new ImageSpan(this, R.mipmap.ic_launcher); //也可以这样 //Drawable drawable = imageSpan1 = new ImageSpan(drawable); //将index为6、7的字符用图片替代 spannableString.setSpan(imageSpan = new SpannableStringBuilder(); spannableString.append("暗影IV已经开始暴走了"); //图片 ImageSpan imageSpan = new ImageSpan(this, R.mipmap.ic_launcher); spannableString.setSpan(imageSpan, 2,

    2.8K120发布于 2018-05-18
  • 来自专栏移动开发的那些事儿

    TextView实现自定义换行以及缩进文字的格式化对齐

    富文本可以实现图文混排,代码如下: Spannable spannable = Spannable.Factory.getInstance().newSpannable(sbNewText.toString()); ImageSpan imageSpan = new ImageSpan(b); spannable.setSpan(imageSpan, 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); setText(spannable); Spannable是根据当前TextView的文本内容创建出来的,然后可以用ImageSpan去替换Spannable中的任意一个位置 文本缩进实现 依然是用TextView resources, (Bitmap) null); spaceDrawable.setBounds(0, 0, sapceWidth, sapceWidth); spannable.setSpan(new ImageSpan imageSpan = new ImageSpan(b); spannable.setSpan(imageSpan, 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE

    2.9K20发布于 2018-09-04
  • 来自专栏向治洪

    android TabLayout实现京东详情效果

    的样式,然后通过引入 app:tabTextAppearance="" 自定义icon添加到tab 当前的TabLayout没有方法让我们去添加icon,我们可以使用SpannableString结合ImageSpan imageSpan = new ImageSpan(image, ImageSpan.ALIGN_BOTTOM); sb.setSpan(imageSpan, 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE ); return sb; } 运行,发现没有显示,这是因为TabLayout创建的tab默认设置textAllCaps属性为true,这阻止了ImageSpan被渲染出来,可以通过下面的样式文件定义来改变 spaces with image icon SpannableString sb = new SpannableString(" " + tabTitles[position]); ImageSpan imageSpan = new ImageSpan(image, ImageSpan.ALIGN_BOTTOM); sb.setSpan(imageSpan, 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE

    1.5K100发布于 2018-02-05
  • 来自专栏Android群英传

    真·富文本编辑器的演进之路-Span的整体性控制

    所以,我们需要对Span做下面的限制: 中间不允许光标插入 增加时整体新增 删除时整体删除 对应这样的需求,我们有两种方式来处理,第一种是使用原本就是整体的Span,例如ImageSpan,这是最简单的方法 通过ImageSpan保证完整性 将Span内容生成ImageSpan,从而实现整体性控制。这种方案简单易行,我们以新增「@用户」为例。 转化为Drawable,设置给ATSpan,并传入@的相关数据信息 将ImageSpan插入Edittext,实现整体性Span的富文本插入 可以发现,这种方案的实现步骤是比较简单的,但是它的确定也很明显 : 首先,由于是ImageSpan,所以在与普通文本的对齐方式上,始终会存在一些误差,这些误差有来自TextView-Drawable的转换过程,也有ImageSpan的对齐过程,所以,在样式上,对齐会有一些问题 image-20210819162910988 这是由于View的图形限制导致的问题,使用ImageSpan的话,是无法解决的问题,由此可见,ImageSpan虽然天生具有整体性,但是却只是一个妥协的方案

    2.4K30发布于 2021-09-08
  • 来自专栏Android知识点总结

    Android控件之TextView

    Drawable drawable = getResources().getDrawable(R.mipmap.cup); drawable.setBounds(0,0,200,200); ImageSpan imageSpan = new ImageSpan(drawable); ssSeal.setSpan(imageSpan, 0, 2, Spanned.SPAN_INCLUSIVE_INCLUSIVE

    1.7K20发布于 2018-09-01
  • 来自专栏andy的小窝

    code test

    (Object[]) ms.getObj(); for (Object span : spans) { if (span instanceof ImageSpan ) { Log.d(TAG, "点击了图片"+((ImageSpan) span).getSource()); //处理自己的逻辑 } } } } }; setMovementMethod(LinkMovementMethodExt.getInstance(handler, ImageSpan.class

    1.6K20发布于 2020-02-12
  • 来自专栏小工匠聊架构

    TabLayout-Android M新控件

    are many posted workarounds, one of which is to return a SpannableString, containing your icon in an ImageSpan image.getIntrinsicWidth(), image.getIntrinsicHeight()); SpannableString sb = new SpannableString(" "); ImageSpan imageSpan = new ImageSpan(image, ImageSpan.ALIGN_BOTTOM); sb.setSpan(imageSpan, 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE spaces with image icon SpannableString sb = new SpannableString(" " + tabTitles[position]); ImageSpan imageSpan = new ImageSpan(image, ImageSpan.ALIGN_BOTTOM); sb.setSpan(imageSpan, 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE

    59530发布于 2021-08-16
  • 来自专栏小工匠聊架构

    EidtText

    对象 ImageSpan imageSpan = new ImageSpan(this,bitmap); // 创建一个SpannableString对象 ,以便插入用ImageSpan对象封装的图像 String text = "gur_project_"; SpannableString spannableString = new SpannableString(text); // 用ImageSpan替换gur-project- spannableString.setSpan (imageSpan,0,text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 将随机获取的图像追加到EditText控件后 我们使用ImageSpan类来直接插入图像,当然了我们也可以采用 标签在EditText控件中插入图片,只是复杂一些,本案例没有采用。

    1K50发布于 2021-08-16
  • 来自专栏Android群英传

    真·富文本编辑器的演进之路-Span开胃菜

    ImageSpan是富文本中的核心成员,通过ImageSpan,理论上可以实现各种富文本效果的,虽然有些场景的效果差强人意,但足以体现出它的强大,所以,掌握ImageSpan,是掌握富文本的重中之重。 在这些情况下,ImageSpan的表现跟设计基本一致,所以,解决ImageSpan的各种坑最简单的方式,就是让ImageSpan的bounds小于文字的高度。 ImageSpan高度大于文字高度的场景 当ImageSpan高度大于文字高度的时候,ALIGN_CENTER就会失效,导致ImageSpan始终是ALIGN_BOTTOM的效果。测试代码如下所示。 这种方式在ImageSpan尺寸不是很大的时候,是可以的,其原理就是对ImageSpan进行偏移,但是文字的行高是没有发生改变的,也就是像图中这样,多行文本的行高并未发生改变,但是ImageSpan实现居中的效果 第二种方式,就是将文本的行高属性做修改,也就是让ImageSpan尺寸小于行高,动态将原本文字的行高,改为ImageSpan的尺寸,甚至更大一点,这样ImageSpan自然就可以居中了。 ?

    3.1K20发布于 2021-03-16
  • 来自专栏葬爱家族

    Android 千变万化 TextView:神奇的 SpannableString

    SpannableString 除了可以像前面那样把文字变大变小变长变色,还可以把一部分文字变成图片,承载图片的是 Drawable 对象,而实现这个效果的就是 ImageSpan。 看下基本使用方法 SpannableString ss = new SpannableString(str); ImageSpan span = new ImageSpan(drawable, ImageSpan.ALIGN_BOTTOM span = new ImageSpan(d, ImageSpan.ALIGN_BOTTOM); ss.setSpan(span, 0, str.length(), (4)构建 ImageSpan 和 SpannableString,把 drawable 和字符串 str 对应起来。 imageSpan = new ImageSpan(d); int end = matcher.start() + key.length(); ss.setSpan

    5.1K20发布于 2020-03-20
  • 来自专栏向治洪

    Android自定义用户协议的解决方案

    setImageSpan(Context context, SpannableStringBuilder builder, int resourceId){ MyImageSpan imageSpan = new MyImageSpan(context, resourceId, 2);//居中对齐 builder.setSpan(imageSpan, 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE ); } public static class MyImageSpan extends ImageSpan{ //因为这里文字存在换行,系统的ImageSpan图标无法进行居中 ,所以我们自定义一个ImageSpan,重写draw方法,解决了该问题 public MyImageSpan(@NonNull Context context, int resourceId

    1.1K20编辑于 2022-11-30
  • 来自专栏Android知识点总结

    1-VIV-Android控件之TextView

    Drawable drawable = getResources().getDrawable(R.mipmap.cup); drawable.setBounds(0,0,200,200); ImageSpan imageSpan = new ImageSpan(drawable); ssSeal.setSpan(imageSpan, 0, 2, Spanned.SPAN_INCLUSIVE_INCLUSIVE

    75260发布于 2018-09-29
  • 来自专栏移动开发之家

    微博的文本编辑和显示(emoji表情,@某人、链接高亮点击)

    ・・)ノ 对gridView增加了item点击事件,根据点击的文本,转化为表情资源,然后生成ImageSpan,加入到Spannable里面。 ImageSpan是什么鬼? ImageSpan 可以根据设定好的文本长度,对对应的文本进行替换显示。 因为考虑到字数限制还有大小问题,下面还有对应参数,大小一般我设置的是20dp(够大了吧= =),插♀入的时候注意当前的光标位置哟,而Android的文本输入框一般对于ImageSpan 的回退都是整个删除的 之后SpannableString来存储对应的ImageSpan 和文本中间的关系,最后利用SpannableStringBuilder 将生成好的SpannableString插入到输入框中。 imageSpan = new ImageSpan(drawable); SpannableString spannableString = new SpannableString(name)

    2.6K20发布于 2018-08-22
  • 来自专栏向治洪

    仿微信聊天表情发送

       import android.text.SpannableString;   import android.text.TextUtils;   import android.text.style.ImageSpan                 imgId);           bitmap = Bitmap.createScaledBitmap(bitmap, 35, 35, true);           ImageSpan  imageSpan = new ImageSpan(context, bitmap);           SpannableString spannable = new SpannableString (spannableString);           spannable.setSpan(imageSpan, 0, spannableString.length(),                    来包装                 ImageSpan imageSpan = new ImageSpan(bitmap);   // 计算该图片名字的长度,也就是要替换的字符串的长度 int

    8.8K70发布于 2018-01-29
  • 来自专栏Android技术分享

    让你的EditText删除表情比微信更高效--记一次android性能分析优化实战

    这块相关代码比较复杂就不一行行分析了直接说结论 ChangeWatcher实现了SpanWatcher接口,它是用来监听TextView中Span发生变化的 当从中间删除一个表情,被删除表情后面的所有的ImageSpan 位置都发生了变化,每个ImageSpan变化都会触发一次ChangeWatcher.onSpanChanged()->ChangeWatcher.reflow()->DynamicLayout.reflow IInputConnectionWrapper没处于激活状态 完全版的解决方案 跟输入法死磕几天未果正愁着呢,突然想到谷歌在android 8.0发布的时候推出了一个Emoji表情库,Emoji出现在TextView中逃不出也用的是ImageSpan SpannableStringBuilder 定义一个WatcherWrapper将ChangeWatcher包装起来,所有之前对ChangeWatcher的调用都通过WatcherWrapper完成 这里onSpanChanged就对ImageSpan mBlockCalls.decrementAndGet(); } private boolean isImageSpan(final Object span) { return span instanceof ImageSpan

    1.6K30发布于 2019-08-12
  • 来自专栏小工匠聊架构

    底部导航栏的几种实现方式

    TabLayout.MODE_FIXED,防止TAB挤在一起 FragmentPageAdapter子类中,我们的标题是带有图片的,因此可以重写getPageTitle方法,通过SpannableString+ImageSpan (), image.getIntrinsicHeight()); // SpannableString sb = new SpannableString(" "); // ImageSpan imageSpan = new ImageSpan(image, ImageSpan.ALIGN_BOTTOM); // sb.setSpan(imageSpan, 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE with image icon SpannableString sb = new SpannableString(" " + tabTitles[position]); ImageSpan imageSpan = new ImageSpan(image, ImageSpan.ALIGN_BOTTOM); sb.setSpan(imageSpan, 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE

    3.3K40发布于 2021-08-16
领券