Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 使用android SpannableStringBuilder實現圖文混排,查看更多

使用android SpannableStringBuilder實現圖文混排,查看更多

編輯:關於Android編程

項目開發中需要實現這種效果

\\

\

多余兩行,兩行最後是省略號,省略號後面是下拉更多

之前用過的是Html.fromHtml去處理圖文混排的,僅僅是文字後圖片或者文字顏色字體什麼的,

但是這裡需要在最後文字的省略號後面添加圖片。<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+1rG908nPtPrC67DJo6y0+sLr16LKzbrctuCjrML9wv3R0L6/PC9wPgo8cD48L3A+CjxwcmUgY2xhc3M9"brush:java;">private void toggleEllipsize(final TextView tv,final String desc){ if(desc == null){ return; } tv.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { boolean isEllipsized = (tv.getTag()==null||tv.getTag().equals(false))?false:(Boolean)tv.getTag(); if(isEllipsized){ tv.setTag(false); tv.setText(desc); }else{ tv.setTag(true); int paddingLeft = tv.getPaddingLeft(); int paddingRight = tv.getPaddingRight(); TextPaint paint = tv.getPaint(); float moreText = tv.getTextSize()*3; float availableTextWidth = (tv.getWidth()-paddingLeft-paddingRight)*2-moreText; CharSequence ellipsizeStr = TextUtils.ellipsize(desc,paint,availableTextWidth,TextUtils.TruncateAt.END); if(ellipsizeStr.length()=16){ tv.getViewTreeObserver().removeOnGlobalLayoutListener(this); }else{ tv.getViewTreeObserver().removeGlobalOnLayoutListener(this); } } }); }
主要是通過SpannableStringBuilder把省略的文字和最後的圖片給拼接起來。也可以最後拼接的是文字,

不讓...更多

轉篇博客:

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;  
    }


有疑問可以留言,交流討論

復制去Google翻譯翻譯結果
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved