亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 2211 | 回復(fù): 0
打印 上一主題 下一主題

[Android] android實(shí)現(xiàn)gif圖與文字混排 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2015-06-11 09:28 |只看該作者 |倒序?yàn)g覽
我們在進(jìn)行qq聊天的時候發(fā)送表情,但這些表情都是并不是靜態(tài)的,更多的是動態(tài)圖,gif圖,那么如何在android客戶端顯示動態(tài)gif圖呢。

我們首先來看一下該開源項目的代碼。該開源項目主要是通過自定義一個Adapter-------chatAdapter,在ChatAdapter每一條的setText屬性中使用了自定義的方法convertNormalStringToSpannableString

convertNormalStringToSpannableString方法的返回值是SpannableString

  我們首先來了解一下什么是SpannableString

  TextView通常用來顯示普通文本,但是有時候需要對其中某些文本進(jìn)行樣式、事件方面的設(shè)置。Android系統(tǒng)通過SpannableString類來對指定文本進(jìn)行相關(guān)處理,也就是說我們想要實(shí)現(xiàn)文字加動態(tài)表情的實(shí)現(xiàn)就要通過SpannableString這個類來實(shí)現(xiàn)。
  1. private SpannableString convertNormalStringToSpannableString(String message , final TextView tv) {
  2.         SpannableString value = SpannableString.valueOf(message);
  3.         Matcher localMatcher = EMOTION_URL.matcher(value);
  4.         while (localMatcher.find()) {
  5.             String str2 = localMatcher.group(0);
  6.             int k = localMatcher.start();
  7.             int m = localMatcher.end();
  8.             if (m - k < 8) {
  9.                 int face = fm.getFaceId(str2);
  10.                 if(-1!=face){//wrapping with weakReference
  11.                     WeakReference<AnimatedImageSpan> localImageSpanRef = new WeakReference<AnimatedImageSpan>(new AnimatedImageSpan(new AnimatedGifDrawable(cxt.getResources().openRawResource(face), new AnimatedGifDrawable.UpdateListener() {   
  12.                         @Override
  13.                         public void update() {//update the textview
  14.                             tv.postInvalidate();
  15.                         }
  16.                     })));
  17.                     value.setSpan(localImageSpanRef.get(), k, m, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
  18.                 }
  19.             }
  20.         }
  21.         return value;
  22.     }
復(fù)制代碼
首先將我們傳入的message轉(zhuǎn)化成SpannableString類,然后看一下傳入的值是否符合我們一開始寫好的正則表達(dá)式EMOTION_URL
  1. private Pattern EMOTION_URL = Pattern.compile("\\[(\\S+?)\\]");
復(fù)制代碼
如果符合的話 我們?nèi)roup(0)

  附:group是針對()來說的,group(0)就是指的整個串,group(1)指的是第一個括號里的東西,group(2)指的第二個括號里的東西。

  子表達(dá)式和起始位置和結(jié)束位置的差小于8,也就是符合我們的要求。調(diào)用FaceManager中的getFaceId方法
  1. public int getFaceId(String faceStr){
  2.         if(mFaceMap.containsKey(faceStr)){
  3.             return mFaceMap.get(faceStr);
  4.         }
  5.         return -1;
  6.     }
復(fù)制代碼
找到我們用Map進(jìn)行存儲的表情

  如果表情存在的話利用一個弱引用(WeakReference)把自定義的AnimatedImageSpan進(jìn)行處理,使AnimatedImageSpan不那么的消耗內(nèi)存,在UpdateListener中利用postInvalidate刷新界面。最后把SpannableString的setSpan方法,三個參數(shù)分別是要放進(jìn)去的span ,起始位置,結(jié)束位置,flag標(biāo)志。

  關(guān)于flag:
  1. Spanned.SPAN_EXCLUSIVE_EXCLUSIVE, 這是在 setSpan 時需要指定的 flag,它是用來標(biāo)識在 Span 范圍內(nèi)的文本前后輸入新的字符時是否把它們也應(yīng)用這個效果。分別有 Spanned.SPAN_EXCLUSIVE_EXCLUSIVE(前后都不包括)、 Spanned.SPAN_INCLUSIVE_EXCLUSIVE(前面包括,后面不包括)、 Spanned.SPAN_EXCLUSIVE_INCLUSIVE(前面不包括,后面包括)、 Spanned.SPAN_INCLUSIVE_INCLUSIVE(前后都包括)。
復(fù)制代碼
最后將SpannableString返回,實(shí)現(xiàn)動態(tài)圖文混排。

  關(guān)于自定義的AnimatedImageSpan如下:
  1. public class AnimatedImageSpan extends DynamicDrawableSpan {

  2.     private Drawable mDrawable;

  3.     public AnimatedImageSpan(Drawable d) {
  4.         super();
  5.         mDrawable = d;
  6.         // Use handler for 'ticks' to proceed to next frame
  7.         final Handler mHandler = new Handler();
  8.         mHandler.post(new Runnable() {
  9.             public void run() {
  10.                 ((AnimatedGifDrawable)mDrawable).nextFrame();
  11.                 // Set next with a delay depending on the duration for this frame
  12.                 mHandler.postDelayed(this, ((AnimatedGifDrawable)mDrawable).getFrameDuration());
  13.             }
  14.         });
  15.     }
  16.     @Override
  17.     public Drawable getDrawable() {
  18.         return ((AnimatedGifDrawable)mDrawable).getDrawable();
  19.     }

  20.     @Override
  21.     public int getSize(Paint paint, CharSequence text, int start, int end, Paint.FontMetricsInt fm) {
  22.         Drawable d = getDrawable();
  23.         Rect rect = d.getBounds();

  24.         if (fm != null) {
  25.             fm.ascent = -rect.bottom;
  26.             fm.descent = 0;

  27.             fm.top = fm.ascent;
  28.             fm.bottom = 0;
  29.         }

  30.         return rect.right;
  31.     }
  32.     @Override
  33.     public void draw(Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, Paint paint) {
  34.         Drawable b = getDrawable();
  35.         canvas.save();

  36.         int transY = bottom - b.getBounds().bottom;
  37.         if (mVerticalAlignment == ALIGN_BASELINE) {
  38.             transY -= paint.getFontMetricsInt().descent;
  39.         }

  40.         canvas.translate(x, transY);
  41.         b.draw(canvas);
  42.         canvas.restore();
  43.     }
  44. }
復(fù)制代碼
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP