精华内容
下载资源
问答
  • 1、消息模板支持实时翻译,并且将消息模板中的主题、消息、短信、邮件修改为消息富文本编辑器,对主题和短信富文本编辑器工具进行隐藏。 2、替换规则:  同步拼接编码和label,通过某种既定的格式,建立映射...
    #消息模板实时翻译
    1、消息模板支持实时翻译,并且将消息模板中的主题、消息、短信、邮件修改为消息富文本编辑器,对主题和短信的富文本编辑器工具进行隐藏。
    2、替换规则:
       同步拼接编码和label,通过某种既定的格式,建立映射关系:
       实体:
       `${<span name="${Model:bc:BeisenCloudDemo.shiti.ziduan}">实体.字段</span>}`
       工作流:需进行添加流程定义ID,并且在运行态解析时将流程定义编码去掉
          `${<span name="${Model:wf:9af7f46a-ea52-4aa3-b8c3-9fd484c2af12/bc:BeisenCloudDemo.shiti.ziduan}">实体.字段</span>}`
    3.翻译过程中,对历史数据:自定义变量和上下文变量不进行支持,目前发现某些是支持的,遇到不支持的也不要大惊小怪。
    4、富文本粘贴复制修改:
       我们在上面已经给进行了介绍,我们是对编码和名称之间通过一些标签建立某种既定的格式简历映射关系来达到我们替换和实时翻译的目的,但是在实际操作过程中发现,我们在对富文本里面的东西进行粘贴和复制的时候富文本会对我们既定的格式进行某种改变,比如粘贴时会对我们的文本进行添加标签操作:
         `<span></span>${<span name="${Model:bc:BeisenCloudDemo.shiti.ziduan}">实体.字段</span><span>}</span>` 
       会对我们的文本进行添加span标签,改变我们的格式,导致解析失败,抑或者我们进行添加颜色和样式进行格式处理的时候也会改变我们的标签,会对我们的标签进行合并或者去掉的操作。
       解决方案:
       1、修改百度Ueditor源代码,对我们实际的情况进行特殊的处理:
       处理源码的文件名称为4.3.3 版本的ueditor.all.js
       2.修改地方:
       第一处:对进行span标签的合并处理进行操作:
       在源代码:2985 处,如果对源代码进行处理合并时直接进行返回,不进行span标签的合并处理
       第二处:12113 行,去掉 white-space:nowrap 属性(百度UEditor富文本编辑器去除自动追加span标签,版本:4.3.3),取代该属性的目的是为了我们在进行复制粘贴的过程中会对  `<span></span>${<span name="${Model:bc:BeisenCloudDemo.shiti.ziduan}">实体.字段</span><span>}</span>` 里面的文本${} 只要是涉及到文本的地方都会进行添加span标签进行标注,通过去掉该属性,在进行粘贴复制的时候不会对文本内容进行添加span标签(当然大多数情况下回对文本进行添加p标签,但是处理P标签的方法很多,比如有个属性类似于allowDivToP:false 是否将div转化为p标签的等等就可以了)
    展开全文
  • 有的时候可能想在TextView中添加一些图片,比如下图,发短信输入联系人时,要把联系人号码换成一个图片,但这个图片无法用固定的某张图,而是根据内容进行定制的,这更像一个view。     当然,如果你不是view...

    zz: http://www.cnblogs.com/luction/p/3645210.html


    有的时候可能想在TextView中添加一些图片,比如下图,发短信输入联系人时,要把联系人号码换成一个图片,但这个图片无法用固定的某张图,而是根据内容进行定制的,这更像一个view。

     

    image

     

    当然,如果你不是view而是固定的图片,比如发信息时用表情图片替代特殊符号,那么实现起来会更加简单。又或许,你希望这个图片是可点击的。这里,笔者要介绍的就是怎么用一个自定义的ImageSpan来实现在文本里插入可点击的图片或View。

    在此之前,如果你还不了解SpannableString.setSpan(),不了解LinkMovementMethod是什么,建议先看下笔者的解析TextView中的URL等指定特殊字符串与点击事件

     

    首先,因为ImageSpan没有继承ClickableSpan,因此没有 onClick()方法。所以我写了个ClickableImageSpan 。

     

    复制代码
    public abstract class ClickableImageSpan extends ImageSpan {
        public ClickableImageSpan(Drawable b) {
            super(b);
        }
    
        public abstract void onClick(View view);
    }
    复制代码

     

    同时,我们发现google提供的LinkMovementMethod只会执行ClickableSpan的onClick()方法.下面是LinkMovementMethod的onTouchEvent()的源码。这个方法是在我们点击Spanned的时候响应。

     

    复制代码
    public boolean onTouchEvent(TextView widget, Spannable buffer,
                                    MotionEvent event) {
            int action = event.getAction();
    
            if (action == MotionEvent.ACTION_UP ||
                action == MotionEvent.ACTION_DOWN) {
                int x = (int) event.getX();
                int y = (int) event.getY();
    
                x -= widget.getTotalPaddingLeft();
                y -= widget.getTotalPaddingTop();
    
                x += widget.getScrollX();
                y += widget.getScrollY();
    
                Layout layout = widget.getLayout();
                int line = layout.getLineForVertical(y);
                int off = layout.getOffsetForHorizontal(line, x);
    
                ClickableSpan[] link = buffer.getSpans(off, off, ClickableSpan.class);
    
                if (link.length != 0) {
                    if (action == MotionEvent.ACTION_UP) {
                        link[0].onClick(widget);
                    } else if (action == MotionEvent.ACTION_DOWN) {
                        Selection.setSelection(buffer,
                                               buffer.getSpanStart(link[0]),
                                               buffer.getSpanEnd(link[0]));
                    }
    
                    return true;
                } else {
                    Selection.removeSelection(buffer);
                }
            }
    
            return super.onTouchEvent(widget, buffer, event);
        }
    复制代码

     

    发现这个方法其实就是通过坐标找到相应的Span。然后,当link数组不为空时,将会得到span并执行他的onClick()方法。这里我们注意到了这一句代码

     

    ClickableSpan[] link = buffer.getSpans(off, off, ClickableSpan.class);

     

    这说明该方法只获得了ClickableSpan,因为如果我们直接使用系统的LinkMovementMethod类,是无法让ImageSpan响应点击事件的。。因为我们知道,ImageSpan没有继承ClickableSpan。所以,笔者写了一个ClickableMovementMethod

     

    复制代码
    public class ClickableMovementMethod extends LinkMovementMethod {
    
        private static ClickableMovementMethod sInstance;
    
        public static ClickableMovementMethod getInstance() {
            if (sInstance == null) {
                sInstance = new ClickableMovementMethod();
            }
            return sInstance;
        }
    
        public boolean onTouchEvent(TextView widget, Spannable buffer,
                                    MotionEvent event) {
            int action = event.getAction();
    
            if (action == MotionEvent.ACTION_UP ||
                    action == MotionEvent.ACTION_DOWN) {
                int x = (int) event.getX();
                int y = (int) event.getY();
    
                x -= widget.getTotalPaddingLeft();
                y -= widget.getTotalPaddingTop();
    
                x += widget.getScrollX();
                y += widget.getScrollY();
    
                Layout layout = widget.getLayout();
                int line = layout.getLineForVertical(y);
                int off = layout.getOffsetForHorizontal(line, x);
    
                ClickableSpan[] link = buffer.getSpans(off, off, ClickableSpan.class);
                ClickableImageSpan[] imageSpans = buffer.getSpans(off, off, ClickableImageSpan.class);
    
                if (link.length != 0) {
                    if (action == MotionEvent.ACTION_UP) {
                        link[0].onClick(widget);
                    } else if (action == MotionEvent.ACTION_DOWN) {
                        Selection.setSelection(buffer,
                                buffer.getSpanStart(link[0]),
                                buffer.getSpanEnd(link[0]));
                    }
    
                    return true;
                } else if (imageSpans.length != 0) {
                    if (action == MotionEvent.ACTION_UP) {
                        imageSpans[0].onClick(widget);
                    } else if (action == MotionEvent.ACTION_DOWN) {
                        Selection.setSelection(buffer,
                                buffer.getSpanStart(imageSpans[0]),
                                buffer.getSpanEnd(imageSpans[0]));
                    }
    
                    return true;
                } else {
                    Selection.removeSelection(buffer);
                }
            }
    
            return false;
        }
    }
    复制代码

     

    只是做了很小的改动,这样,这个类既可以支持ClickableSpan也可以支持我们自己写的ClickableImageSpan。

    到此为止,一个可点击的ImageSpan就完成了。剩下的步骤就跟实现文字样式的方式一样,首先new一个SpannableString传入文本,然后找到你需要放置ImageSpan的位置(一般使用正则表达式),接着new一个ClickableImageSpan传入图片,通过SpannableString的setSpan()方法传入ClickableImageSpan对象。最后别忘了TextView调用setMovementMethod时,传入的是我们的ClickableMovementMethod.getInstance()方法。具体代码实现参照文字样式那边的,稍作修改即可。具体的笔者不再贴这部分的代码了。

    那么,如果我们不是传一个简单的图片,而是需要显示一个定制的View,应该怎么做呢。其实只要把View转化成Drawable就好,下面是主要的实现代码:

    复制代码
        private BitmapDrawable createDrawble(Context ctx, String content) {
            View view = LayoutInflater.from(ctx).inflate(R.layout.viewt, null);
            ((TextView) view.findViewById(R.id.tv_content)).setText(content);
            int spec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
            view.measure(spec, spec);
            view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
            Bitmap b = Bitmap.createBitmap(view.getMeasuredWidth(), view.getMeasuredHeight(), Bitmap.Config.ARGB_8888);
            Canvas c = new Canvas(b);
            c.translate(-view.getScrollX(), -view.getScrollY());
            view.draw(c);
            view.setDrawingCacheEnabled(true);
            Bitmap cacheBmp = view.getDrawingCache();
            Bitmap viewBmp = cacheBmp.copy(Bitmap.Config.ARGB_8888, true);
            view.destroyDrawingCache();
            return new BitmapDrawable(ctx.getResources(), viewBmp);
        }
    
        public void filter(Spannable sp) {
            /**
                .....此处省略.
        **/
            BitmapDrawable bd = createDrawble(tv.getContext(), sp.toString);        bd.setBounds(0, 0, bd.getIntrinsicWidth(), bd.getIntrinsicHeight());
            MyClickableImageSpan span = new MyClickableImageSpan(bd,text);
            sp.setSpan(span, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
    复制代码

     

    createDrawble()方法是通过View的getDrawingCache()方法将一个View转化成BItmap,然后在获得BitmapDrawable 后别忘了调用setBounds(),这个方法是决定图片的大小,如果不设置,那么图片长宽都为0! 当然,你如果嫌显示的效果太大或太小,也可以通过这个方法调整图片大小。其他步骤相信大家看过笔者的  解析TextView中的URL等指定特殊字符串与点击事件 ,实现起来应该是没有困难的。因此笔者不再赘述了。

     

    有任何问题或更好的见解可以留言,互相学习!


    展开全文
  • 超级短信即在普通文本短信的基础上可发送语音、图片等多媒体信息的新型短信概念,是传统短信的一种升级和变革。它集成多种移动通讯标准协议,通过短信向用户发送视频、图片、文本等内容;用户无需安装任何插件或更新...

    超级短信,也有人称视频短信、多媒体短信,富媒体等,每家的叫法可能都不一样,但实质内容都是一样的,2019年各家短信服务商主推的短信产品之一。超级短信即在普通文本短信的基础上可发送语音、图片等多媒体信息的新型短信概念,是传统短信的一种升级和变革。它集成多种移动通讯标准协议,通过短信向用户发送视频、图片、文本等内容;用户无需安装任何插件或更新终端,通过号码即可接收的浏览体验。无需安装额外的APP软件,无论智能机还是功能机,彻底打破了沟通的鸿沟。一经推出便受到许多客户的青睐。传统文字短信承载的文字信息有限即使是使用长短信文字也就数百字,而且无法发送视频音频等文件。虽然有彩信等产品。但由于存在各种限制仍然无法满足客户的需求。而超级短信增加了短视频,音频内容极大的丰富了短信内容。

    一、亮点。我们来通过下图看看超级短信几种竞品的差别。超级短信在信息推送上不仅针对传统的短信,同时针对APP等也具备优势。

    二、应用场景。超级短信由于内容丰富可广泛应用于政企宣传、商业活动品宣、公众便民宣导、电商推广、APP应用推广(如游戏、教育)、影视行业推广、各类账单违章信息推送等应用场景。

     

    三、应用实例,如交通违法信息推送,内容可以含车主车牌号,违章信息、处罚信息,违章截图、动态视频等内容。让车主通过信息查看一目了然。影视行业新电影宣传,通过文字、图片,精彩视频等方法提高观众购票欲望。从而提高票房成绩。

    四、超级短信一些亮点、可以发送更多图片、文字内容,展现更丰富,用户体验更优,精准营销转化效果更高。全新方式颠覆传统短信营销且免流量。适配所有智能手机,传播的内容更加生动,更具有吸引力。场景更广泛,接收无门槛。

    展开全文
  • 1.首先实例化一个Spannable对象SpannableString spannableString = new SpannableString("字体测试字体大小一半两倍前景色背景色正常粗体斜体粗斜体下划线删除线x1x2电话邮件网站短信彩信地图X轴综合/bot");...

    1.首先实例化一个Spannable对象

    SpannableString spannableString = new SpannableString("字体测试字体大小一半两倍前景色背景色正常粗体斜体粗斜体下划线删除线x1x2电话邮件网站短信彩信地图X轴综合/bot");
    

    我们需要创建一个SpannableString或SpannableStringBuilder,它们的区别在于 SpannableString像一个String一样,构造对象的时候传入一个String,之后再无法更改String的内容,也无法拼接多个 SpannableString;而SpannableStringBuilder则更像是StringBuilder,它可以通过其append()方法来拼接多个String。

    2.public void setSpan (Object what, int start, int end, int flags)

    • what传入各种Span类型的实例
    • start和end标记要替代的文字内容的范围
    • flags是用来标识在 Span 范围内的文本前后输入新的字符时是否把它们也应用这个效果

    第一个参数可以使用的主要几种Span类型为

    • ImageSpan 可以使用图片替换文字达到图文混排的效果,例如在微信中文字和表情一起发的状态

      • 使用方法

      Drawabledrawable=mContext.getResources().getDrawable(R.drawable.new_topic_drawable);
      drawable.setBounds(0,0,drawable.getIntrinsicWidth(),drawable.getIntrinsicHeight());
      ImageSpan imageSpan = new ImageSpan(drawable, ImageSpan.ALIGN_BASELINE);
      spanString.setSpan(imageSpan,spanString.length()-1,spanString.length(),Spannable.SPAN_INCLUSIVE_INCLUSIVE);

    • ForegroundColorSpan 设置文字前景色,即文字本身的颜色
      • spanString.setSpan(new ForegroundColorSpan(Color.parseColor("#f74224")), 0,titleText.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
    • AbsoluteSizeSpan 设置文字的绝对大小值,参数是绝对数值
      • spanString.setSpan(new AbsoluteSizeSpan(11),0,spanString.length(),titleText.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
    • RelativeSizeSpan(float proportion) 设置字体大小,参数是相对于默认字体大小的倍数。
    • UrlSpan 设置超链接
      • URLSpan span = new URLSpan("tel:0123456789");
      • spanString.setSpan(span, 0, 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    • BackgroundColorSpan 设置文字背景色
      • BackgroundColorSpan span = new BackgroundColorSpan(Color.YELLOW);
      • spanString.setSpan(span, 0, 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    • StyleSpan 字体设置
      • StyleSpan span = new StyleSpan(Typeface.BOLD_ITALIC);
      • spanString.setSpan(span, 0, 2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
      • Typeface中有四个Style常量,分别是BOLD粗体、ITALIC斜体、BOLD_ITALIC粗斜体、NORMAL正常
    • StrikethroughSpan 删除线
      • StrikethroughSpan span = new StrikethroughSpan();spanString.setSpan(span, 0, 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    • UnderlineSpan 下划线
      • UnderlineSpan span = new UnderlineSpan();
      • spanString.setSpan(span, 0, 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

    在具体实践中可以对同一范围内的文字叠加不同的span,如文字的大小和文字的颜色可以叠加使用,可以组合出不同的效果

    第二,三个参数 (int start, int end)

    这里是指个性化匹配的位置:这里有很多种方式去实现,例如直接写死位置,也可以和String类的一些方法配合使用,比如:indexOf(),也可以写个正则匹配方法,如果要匹配多次可以把这些匹配存入一个Map集合

    第四个参数Spanned.SPAN_EXCLUSIVE_EXCLUSIVE的意义:

    标识在 Span 范围内的文本前后输入新的字符时是否把它们也应用这个效果

    • Spanned.SPAN_EXCLUSIVE_EXCLUSIVE(前后都不包括)
    • Spanned.SPAN_INCLUSIVE_EXCLUSIVE(前面包括,后面不包括)
    • Spanned.SPAN_EXCLUSIVE_INCLUSIVE(前面不包括,后面包括)
    • Spanned.SPAN_INCLUSIVE_INCLUSIVE(前后都包括)

    3.将SpannableString设置到TextView

    mTextView.setText(msp);
    

    4.最后调用.setMovementMethod,此方法在需要响应用户事件时使用,如点击一个电话号码就跳转到拨号页面。如果不执行这个方法是不会响应事件的,即便文本看着已经是下划线蓝色字了。

    mTextView.setMovementMethod(LinkMovementMethod.getInstance()); 
    

    参考链接

    http://blog.csdn.net/xijiaohuangcao/article/details/7839856

    http://www.cnblogs.com/lichenwei/p/4411607.html

    另外几种给TextView加上效果的方法

    http://aichixihongshi.iteye.com/blog/1207503

    下面附上两段完整代码展示用法

         /**
         * 在Android里提供了许多个性化TextView内容的工具类, 使用这些类可以代替常规String。
         * android.text.Spanned
         * android.text.SpannableString
         * android.text.SpannableStringBuilder
         *
         * 由于Spannable等类最终都实现了CharSequence接口,所以可以直接把SpannableString和SpannableStringBuilder通过TextView.setText()设置给TextView。
         */
    
        //实例化一个Spannable对象
        SpannableString spannableString = new SpannableString(info);
        //通过setSpan()方法可以用来定义不同的样式内容
        //设置字体
        //方式一:直接定位
        spannableString.setSpan(new ForegroundColorSpan(Color.BLUE), 0, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        //方式二:配合String工具类定位
        spannableString.setSpan(new ForegroundColorSpan(Color.BLUE), info.indexOf("@"), info.indexOf(" "), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        //方式三,利用正则表达式匹配定位
        Map<String, Integer> map = getHttpPostion();
        spannableString.setSpan(new ForegroundColorSpan(Color.BLUE), map.get("start"), map.get("end"), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    
        //设置字体大小
        spannableString.setSpan(new RelativeSizeSpan((float) 1.5), map.get("start"), info.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        //设置图片表情
        Drawable drawable = getResources().getDrawable(R.mipmap.ic_launcher);
        drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
        spannableString.setSpan(new ImageSpan(drawable), info.indexOf("["), info.indexOf("]") + 1, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
    
        textView.setText(spannableString);
    }
    
    public Map<String, Integer> getHttpPostion() {
        Map<String, Integer> map = new HashMap<String, Integer>();
        Pattern pattern = Pattern.compile("http:.*");
        Matcher matcher = pattern.matcher(info);
        if (matcher.find()) {
            map.put("start", matcher.start());
            map.put("end", matcher.end());
        }
        return map;
    
    }
    

    第二段

     mTextView = (TextView) findViewById(R.id.tv_link);
    
        //创建一个 SpannableString对象
        msp = new SpannableString("字体测试字体大小一半两倍前景色背景色正常粗体斜体粗斜体下划线删除线x1x2电话邮件网站短信彩信地图X轴综合/bot");
    
        //设置字体(default,default-bold,monospace,serif,sans-serif)
        msp.setSpan(new TypefaceSpan("monospace"), 0, 2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        msp.setSpan(new TypefaceSpan("serif"), 2, 4, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    
        //设置字体大小(绝对值,单位:像素)
        msp.setSpan(new AbsoluteSizeSpan(20), 4, 6, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        msp.setSpan(new AbsoluteSizeSpan(20, true), 6, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  //第二个参数boolean dip,如果为true,表示前面的字体大小单位为dip,否则为像素,同上。
    
        //设置字体大小(相对值,单位:像素) 参数表示为默认字体大小的多少倍
        msp.setSpan(new RelativeSizeSpan(0.5f), 8, 10, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  //0.5f表示默认字体大小的一半
        msp.setSpan(new RelativeSizeSpan(2.0f), 10, 12, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  //2.0f表示默认字体大小的两倍
    
        //设置字体前景色
        msp.setSpan(new ForegroundColorSpan(Color.MAGENTA), 12, 15, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  //设置前景色为洋红色
    
        //设置字体背景色
        msp.setSpan(new BackgroundColorSpan(Color.CYAN), 15, 18, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  //设置背景色为青色
    
        //设置字体样式正常,粗体,斜体,粗斜体
        msp.setSpan(new StyleSpan(android.graphics.Typeface.NORMAL), 18, 20, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  //正常
        msp.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 20, 22, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  //粗体
        msp.setSpan(new StyleSpan(android.graphics.Typeface.ITALIC), 22, 24, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  //斜体
        msp.setSpan(new StyleSpan(android.graphics.Typeface.BOLD_ITALIC), 24, 27, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  //粗斜体
    
        //设置下划线
        msp.setSpan(new UnderlineSpan(), 27, 30, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    
        //设置删除线
        msp.setSpan(new StrikethroughSpan(), 30, 33, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    
        //设置上下标
        msp.setSpan(new SubscriptSpan(), 34, 35, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);     //下标
        msp.setSpan(new SuperscriptSpan(), 36, 37, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);   //上标
    
        //超级链接(需要添加setMovementMethod方法附加响应)
        msp.setSpan(new URLSpan("tel:4155551212"), 37, 39, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);     //电话
        msp.setSpan(new URLSpan("mailto:webmaster@google.com"), 39, 41, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);     //邮件
        msp.setSpan(new URLSpan("http://www.baidu.com"), 41, 43, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);     //网络
        msp.setSpan(new URLSpan("sms:4155551212"), 43, 45, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);     //短信   使用sms:或者smsto:
        msp.setSpan(new URLSpan("mms:4155551212"), 45, 47, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);     //彩信   使用mms:或者mmsto:
        msp.setSpan(new URLSpan("geo:38.899533,-77.036476"), 47, 49, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);     //地图
    
        //设置字体大小(相对值,单位:像素) 参数表示为默认字体宽度的多少倍
        msp.setSpan(new ScaleXSpan(2.0f), 49, 51, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //2.0f表示默认字体宽度的两倍,即X轴方向放大为默认字体的两倍,而高度不变
    
        //设置字体(依次包括字体名称,字体大小,字体样式,字体颜色,链接颜色)
        ColorStateList csllink = null;
        ColorStateList csl = null;
        XmlResourceParser xppcolor=getResources().getXml (R.color.color);
        try {
            csl= ColorStateList.createFromXml(getResources(),xppcolor);
        }catch(XmlPullParserException e){
            e.printStackTrace();
        }catch(IOException e){
            e.printStackTrace();
        }
    
        XmlResourceParser xpplinkcolor=getResources().getXml(R.color.linkcolor);
        try {
            csllink= ColorStateList.createFromXml(getResources(),xpplinkcolor);
        }catch(XmlPullParserException e){
            e.printStackTrace();
        }catch(IOException e){
            e.printStackTrace();
        }
        msp.setSpan(new TextAppearanceSpan("monospace",android.graphics.Typeface.BOLD_ITALIC, 30, csl, csllink), 51, 53, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    
        //设置项目符号
        msp.setSpan(new BulletSpan(android.text.style.BulletSpan.STANDARD_GAP_WIDTH, Color.GREEN), 0, msp.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //第一个参数表示项目符号占用的宽度,第二个参数为项目符号的颜色
    
        //设置图片
        Drawable drawable = getResources().getDrawable(R.drawable.icon);
        drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
        msp.setSpan(new ImageSpan(drawable), 53, 57, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    
        mTextView.setText(msp);
        mTextView.setMovementMethod(LinkMovementMethod.getInstance());
    

    下面还有高仿新浪微博的效果,下次再看
    http://www.tuicool.com/articles/aIFZf2e

    附上属性

    • BackgroundColorSpan 背景色
    • ClickableSpan 文本可点击,有点击事件
    • ForegroundColorSpan 文本颜色(前景色)
    • MaskFilterSpan 修饰效果,如模糊(BlurMaskFilter)、浮雕(EmbossMaskFilter)
    • MetricAffectingSpan 父类,一般不用
    • RasterizerSpan 光栅效果
    • StrikethroughSpan 删除线(中划线)
    • SuggestionSpan 相当于占位符
    • UnderlineSpan 下划线
    • AbsoluteSizeSpan 绝对大小(文本字体)
    • DynamicDrawableSpan 设置图片,基于文本基线或底部对齐。
    • ImageSpan 图片
    • RelativeSizeSpan 相对大小(文本字体)
    • ReplacementSpan 父类,一般不用
    • ScaleXSpan 基于x轴缩放
    • StyleSpan 字体样式:粗体、斜体等
    • SubscriptSpan 下标(数学公式会用到)
    • SuperscriptSpan 上标(数学公式会用到)
    • TextAppearanceSpan 文本外貌(包括字体、大小、样式和颜色)
    • TypefaceSpan 文本字体
    • URLSpan 文本超链接
    展开全文
  • 5G消息

    万次阅读 2020-12-29 10:21:06
    什么是5G消息 在讲5G消息之前,我们先来聊聊RCS,循序渐进,一层一层的剥开...传统电话只有语音,传统短信只有文本。而“媒体”,包括文本、语音、图片、视频、动画、表情、位置等多种媒体形式。我们天天在用的.
  • 常用第三方

    2021-03-12 10:41:35
    2、阿里云短信+腾讯云短信插件 +短信宝 +创蓝253短信2 3、微信 登录和支付 4、支付宝登录和支付 5、消息队列 6、计划任务 7、分词/抽词扩展 ...9、中文转拼音扩展 10、二维码生成 ...19、Kindeditor的富文本
  • 分为纯文本和富文本(二期)两种,设定字数限制,可实时预览;可选定选项格式:单选,多选,文本作答(限定字数);分享链接生成; 问卷分析: 问卷整体完成度分析,问卷单个题目,各个选项的选择情况统计;文本选项...
  • Rails 入门技能

    2017-06-13 10:10:17
    Rails 初级开发人员应该... * 富文本框 * 简单的后台文章管理 * 抓取一些文章 * Mysql, PostgreSQL 数据库的使用 * 定时任务将文章写入到数据库中 * 买台VPS,独立部署,反向代理 * 买个域名,连上再上SSL
  • Python web开发

    2019-05-20 13:27:00
    Django web框架URL与视图、Request和Response对象、DTL模版、模型、表单、...第三方技术:adminLTE、rest_framework、restful接口、富文本编辑器、七牛云存储、视频加密播放、图形验证码、短信验证码、分页、aja...
  • 常见js与css库

    2016-02-25 14:06:26
    分享插件: http://www.jiathis.com/getcode/toolBootStrap: http://v3.bootcss.com/components/发短信: http://www.yunpian.com/api/howto.html富文本编辑器: ...
  • 一.开发环境 IDE: Eclipse 4.7.2 项目构建工具: Maven 数据库: Mysql 5.7.12 缓存数据库: Redis 4.0.9 版本管理: github ...富文本编辑器:wangEditor 三.前后端交互 主要使用AJAX传输数据!
  • 做Winform的,我们一般都知道,传统.NET界面有一个RichTextBox控件,这个是一个富文本控件,可以存储图片文字等内容,它有自己的文件格式RTF,在DevExpress控件组里面也有一个同等的控件,他的名字是RichEditControl...
  • 富文本编辑器:Editormd。 OAuth2授权登录(Github,百度,QQ) Redis分布式内存数据库,实现景点数据缓存,每日签到。 快速运行 安装必备工具JDK,Maven,Redis,git 克隆代码到本地 运行命令创建数据库脚本...
  • 这里说一下和其他平台相比的不足点,小米推送目前不支持富文本的但是效率是很不错的。) ShareSDK Mob 平台的社会化分享和登录 SMSSDK Mob 平台的手机短信验证(感觉 Mob 平台名气稳健,一方面是名字取得...
  • 前几天接到一个需求,要自定义编辑短信模板但是里面有 姓名,日期这样的标签,为了用起来方便于是决定让用户自己选中插入,类似富文本插入图片那样,好了废话不多说,展示。 <template> <div class=...
  • 2019品优购.txt

    2019-08-22 21:07:19
    技术选型 前端:angularJS + Bootstrap 后台:SSM( springmvc+...SpringSecurity, 跨域:cro s 支付:微信扫描 短信验证:阿里大于 密码加密:BCrypt 富文本:KindEditor 事务:声明式事务 任务调度:spring task
  • 微信小程序能实现点赞功能吗 ...小程序如何接受富文本数据 微信小程序如何做接收手机短信的功能 微信小程序 复制链接到剪贴板 微信小程序经纬度逆解析成省市区 微信小程序TEXT标签或者VIEW标...
  • 前端:angularJS + Bootstrap 后台:SSM(springmvc + spring + mybatis) 数据库:mysql,使用mycat读写分离 开发模式:SOA 服务中间件:dubbox,...富文本:KindEditor 事务:声明式事务 任务调度:spring task
  • 技术选型 前端:angularJS + ...SpringSecurity, 跨域:cros 支付:微信扫描 短信验证:阿里大于 密码加密:BCrypt 富文本:KindEditor 事务:声明式事务 任务调度:spring task 如果好用的话不要吝啬你的赞美喔!
  • freemarker 单点登录:cas 权限管理:SpringSecurity, 跨域:cros 支付:微信扫描 短信验证:阿里大于 密码加密:BCrypt 富文本:KindEditor 事务:声明式事务 任务调度:spring task,有问题请留言
  • 插件:wxparser(富文本显示) 其它:阿拉丁统计、fundebug 第三方服务 腾讯云存储 阿里云短信 更新日志 20XXXXX 即将加入营销工具:分享得赏金、优惠券 2018-10-17 1.后台增加联盟功能,可以整合某个城市多家租车...
  • 3. Html内容为富文本编辑器,可以添加各种文字信息,图片,视频等等 4. 单行文本可设置为禁止重复,例如:身份证的单行文本设置为禁止重复,则一个身份证只允许提交一次 5. 图片上传可以设置图片尺寸范围、大小...
  • 富文本:KindEditor 事务:声明式事务 任务调度:spring task 作者:黑马程序员伍老师 链接:https://www.jianshu.com/p/0f8e229f7cf0 來源:简书 简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明...
  • 兼容短彩信服务的同时,突破了传统短信对信息长度和内容格式的限制,支持文本、图片、音频、视频、位置、联系人和文档等多种媒体格式,开发者可以基于上述能力开发轻量级应用,向用户提供媒体通信体验。...
  • 6、 后台拓展字段管理:配置网站需要的字段(图片、文本、富文本、时间、多选、单选)在前台进行数据显示(在系统设置的频道管理可以开启此功能) 7、 后台短信管理:管理短信发送、发送日志管理(在系统设置的频道...
  • 操作上和收发短信没有太大的区别,但是发送的消息支持你能想到的所有形式,文本、图片、音频、视频、定位、联系人等等。 个人用户间可以点对点发送消息,也可以选择多个联系人群发消息,多个联系人可以群聊。若.

空空如也

空空如也

1 2 3 4
收藏数 75
精华内容 30
关键字:

富文本短信