• 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的位置

  • 相关阅读:
    java 求两个数最大值
    java 加法运算
    javs switch 语句
    git合并分支成功,但是push失败(remote: GitLab: You are not allowed to push code to protected branches on this project.)
    python 获取日期以及时间
    1713
    linux shell脚本中的延时
    java 类的继承
    Python3 使用企业微信 API 发送消息
    java if 条件语句
  • 原文地址:https://www.cnblogs.com/yujian-bcq/p/4226629.html
Copyright © 2020-2023  润新知