首页 > 代码库 > android TextView 之探究

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);  
案例:带有\n换行符的字符串都可以用此方法显示2种颜色/**          * 带有\n换行符的字符串都可以用此方法显示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("\n");              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的位置

 

android TextView 之探究