android TextView 之探究

1:插入图片替换

  

//代码  
mSubjectDetailView = (TextView) findViewById(R.id.subject_detail);
        
        CharSequence text = "如图所示★,dsfdsfdddd,如果fdsfs★东东";
        SpannableStringBuilder builder = new SpannableStringBuilder(text);
        String rexgString = "★";
        Pattern pattern = Pattern.compile(rexgString);
        Matcher matcher = pattern.matcher(text);

        while (matcher.find()) {
            builder.setSpan(
                    new ImageSpan(this, R.drawable.ic_launcher), matcher.start(), matcher
                            .end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        }

        mSubjectDetailView.setText(builder);
//布局文件
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <TextView
        android:id="@+id/my_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:text="@string/hello_world" />
     <TextView
				android:id="@+id/subject_detail"
				android:layout_width="match_parent"
				android:layout_height="wrap_content"				
				android:minHeight="50dp"
				android:gravity="center_vertical"
				android:text="subject"
				android:textColor="@android:color/primary_text_light_nodisable"
				android:background="@android:color/white"
				android:textSize="25sp" />
</RelativeLayout>

 效果图:

2:另外的一种TextView 里加入图片

    public void setChips(){
        if(getText().toString().contains(",")) // check comman in string
        {
            
            SpannableStringBuilder ssb = new SpannableStringBuilder(getText());
            // split string wich comma
            String chips[] = getText().toString().trim().split(",");
            int x =0;
            // loop will generate ImageSpan for every country name separated by comma
            for(String c : chips){
                // inflate chips_edittext layout 
                LayoutInflater lf = (LayoutInflater) getContext().getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
                TextView textView = (TextView) lf.inflate(R.layout.chips_edittext, null);
                textView.setText(c); // set text
                int image = ((ChipsAdapter) getAdapter()).getImage(c);
                textView.setCompoundDrawablesWithIntrinsicBounds(0, 0, image, 0);
                // capture bitmapt of genreated textview
                int spec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
                textView.measure(spec, spec);
                textView.layout(0, 0, textView.getMeasuredWidth(), textView.getMeasuredHeight());
                Bitmap b = Bitmap.createBitmap(textView.getWidth(), textView.getHeight(),Bitmap.Config.ARGB_8888);
                Canvas canvas = new Canvas(b);
                canvas.translate(-textView.getScrollX(), -textView.getScrollY());
                textView.draw(canvas);
                textView.setDrawingCacheEnabled(true);
                Bitmap cacheBmp = textView.getDrawingCache();
                Bitmap viewBmp = cacheBmp.copy(Bitmap.Config.ARGB_8888, true);
                textView.destroyDrawingCache();  // destory drawable
                // create bitmap drawable for imagespan
                BitmapDrawable bmpDrawable = new BitmapDrawable(viewBmp);
                bmpDrawable.setBounds(0, 0,bmpDrawable.getIntrinsicWidth(),bmpDrawable.getIntrinsicHeight());
                // create and set imagespan 
                ssb.setSpan(new ImageSpan(bmpDrawable),x ,x + c.length() , Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                x = x+ c.length() +1;
            }
            // set chips span 
            setText(ssb);
            // move cursor to last 
            setSelection(getText().length());
        }
        
        
    }

 3:android SpannableStringBuilder实现图文混排

spannableStringBuilder 用法详解:
     SpannableString ss = new SpannableString("红色打电话斜体删除线绿色下划线图片:.");  
             //用颜色标记文本
             ss.setSpan(new ForegroundColorSpan(Color.RED), 0, 2,  
                     //setSpan时需要指定的 flag,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE(前后都不包括).
                     Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
             //用超链接标记文本
             ss.setSpan(new URLSpan("tel:4155551212"), 2, 5,  
                     Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
             //用样式标记文本(斜体)
             ss.setSpan(new StyleSpan(Typeface.BOLD_ITALIC), 5, 7,  
                     Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
             //用删除线标记文本
             ss.setSpan(new StrikethroughSpan(), 7, 10,  
                     Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
             //用下划线标记文本
             ss.setSpan(new UnderlineSpan(), 10, 16,  
                     Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
             //用颜色标记
             ss.setSpan(new ForegroundColorSpan(Color.GREEN), 10, 13,  
                     Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
             //获取Drawable资源
             Drawable d = getResources().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, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);  
             txtInfo.setText(ss);
             txtInfo.setMovementMethod(LinkMovementMethod.getInstance()); //实现文本的滚动  
    通常用于显示文字,但有时候也需要在文字中夹杂一些图片,比如QQ中就可以使用表情图片,又比如需要的文字高亮显示等等,如何在android中也做到这样呢? 
    记得android中有个android.text包,这里提供了对文本的强大的处理功能。 
    添加图片主要用SpannableString和ImageSpan类:
      
         Drawable drawable = getResources().getDrawable(id);  
            drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());  
            //需要处理的文本,[smile]是需要被替代的文本  
            SpannableString spannable = new SpannableString(getText().toString()+"[smile]");  
            //要让图片替代指定的文字就要用ImageSpan  
            ImageSpan span = new ImageSpan(drawable, ImageSpan.ALIGN_BASELINE);  
            //开始替换,注意第2和第3个参数表示从哪里开始替换到哪里替换结束(start和end)  
           //最后一个参数类似数学中的集合,[5,12)表示从5到12,包括5但不包括12  
            spannable.setSpan(span, getText().length(),getText().length()+"[smile]".length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);    
            setText(spannable);  
将需要的文字高亮显示: 
    public void highlight(int start,int end){  
            SpannableStringBuilder spannable=new SpannableStringBuilder(getText().toString());//用于可变字符串  
            ForegroundColorSpan span=new ForegroundColorSpan(Color.RED);  
            spannable.setSpan(span, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
            setText(spannable);  
        }  
        
    加下划线: 
    public void underline(int start,int end){  
            SpannableStringBuilder spannable=new SpannableStringBuilder(getText().toString());  
            CharacterStyle span=new UnderlineSpan();  
            spannable.setSpan(span, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
            setText(spannable);  
        }  
        
    组合运用:
    SpannableStringBuilder spannable=new SpannableStringBuilder(getText().toString());  
            CharacterStyle span_1=new StyleSpan(android.graphics.Typeface.ITALIC);  
            CharacterStyle span_2=new ForegroundColorSpan(Color.RED);  
            spannable.setSpan(span_1, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
            spannable.setSpan(span_2, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
            setText(spannable);  
案例:带有
换行符的字符串都可以用此方法显示2种颜色
/** 
         * 带有
换行符的字符串都可以用此方法显示2种颜色 
         * @param text 
         * @param color1 
         * @param color2 
         * @return 
         */ 
        public SpannableStringBuilder highlight(String text,int color1,int color2,int fontSize){  
            SpannableStringBuilder spannable=new SpannableStringBuilder(text);//用于可变字符串  
            CharacterStyle span_0=null,span_1=null,span_2;  
            int end=text.indexOf("
");  
            if(end==-1){//如果没有换行符就使用第一种颜色显示  
                span_0=new ForegroundColorSpan(color1);  
                spannable.setSpan(span_0, 0, text.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
            }else{  
                span_0=new ForegroundColorSpan(color1);  
                span_1=new ForegroundColorSpan(color2);  
                spannable.setSpan(span_0, 0, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
                spannable.setSpan(span_1, end+1, text.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
                   
                span_2=new AbsoluteSizeSpan(fontSize);//字体大小  
                spannable.setSpan(span_2, end+1, text.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
            }  
            return spannable;  
        }

用到的相关方法:

1:textView.setCompoundDrawablesWithIntrinsicBounds(0, 0, image, 0); 

    源码:

         

public void setCompoundDrawablesWithIntrinsicBounds(int left, int top, int right, int bottom) {
        final Resources resources = getContext().getResources();
        setCompoundDrawablesWithIntrinsicBounds(left != 0 ? resources.getDrawable(left) : null,
                top != 0 ? resources.getDrawable(top) : null,
                right != 0 ? resources.getDrawable(right) : null,
                bottom != 0 ? resources.getDrawable(bottom) : null);
    }


 

2:ssb.setSpan(new ImageSpan(bmpDrawable),x ,x + c.length() , Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);//插入Obj的位置

原文地址:https://www.cnblogs.com/yujian-bcq/p/4226629.html