IT技術互動交流平台

AndroidSpan進階

來源|132彩票官网注册用户名:IT165收集  發布日期_|久爱弹弹堂:2016-08-09 19:53:40

 在上篇文章《Android Span 架構介紹》_|_泥头车图片,我們講述了Android Span的基本概念和用法_|李乐伟,這篇文章我們就來擴展一下我們對Android Span的了解-_碧美斯,這一定會使你感到驚奇的_|钢铁机器人,驚歎Android Span竟然還能完成這些的效果|-_阳江红毯影院,讓你在Android自定義View和動畫方麵有更加深刻的理解---维护人员工具,可能會幫助你你想出更加簡潔的實現方式__|97香港回归晚会。
 本篇文章主要講述一下兩個方麵的內容:

自定義Android Span 使用Android Span實現動畫

 先貼一下本篇文章實現的自定義Span和動畫的效果圖
demo

demo

自定義Span

 我們都知道|_|108彩票娱乐平台骗局,自定義View有兩種方式-_众购彩票首页,一種是繼承特定的視圖類,比如你希望修改TextView的行為|尹国驹 何鸿燊,所以繼承了TextView;另一種就是直接繼承View或者ViewGroup,這樣可以實現全新的視圖和行為|-|进口货物报关单样本。如同自定義View一樣||电视棒密码,你有兩種自定義Span的方法|-众赢国际app,一種直接繼承特定類型的Span類-||土左旗吧,比如ForegroundColorSpan等|_著名现代诗,這樣你可以在這些類的基礎上進行修改_|_03wa论坛;另一種就是繼承ReplaceSpan這樣的抽象類或者實現LetterLineBackgroundSpan這樣的接口||csol腐化暴君,你隻要實現它給出的接口---八一八数据电视剧,就可以實現新的效果-对开海报尺寸。
 我們先來講解第一種方式_卓易彩票服务器关闭。直接繼承現有的Span-|银行期票。文章開頭時展示的ActionBar動畫就是通過繼承ForegroundSpan來實現的|-|村村通卫星。
 我們主要重載了updateDrawsState和getForegroundColor,這樣就可以通過改變setAlpha函數來改變顏色-|_金鼎轩团购,讓字體從透明(alpha為0)到某個特定顏色_||掌信彩网站。

public class MutableForegroundColorSpan extends ForegroundColorSpan {
    private int mAlpha = 255;
    private int mForegroundColor;
    public MutableForegroundColorSpan(int alpha,int color) {
        super(color);
        mAlpha = alpha;
        mForegroundColor = color;
    }
    @Override
    public void updateDrawState(TextPaint ds) {
        ds.setColor(getForegroundColor());
    }
    public void setAlpha(int alpha) {
        mAlpha = alpha;
    }
    public void setForegroundColor(int foregroundColor) {
        mForegroundColor = foregroundColor;
    }
    public float getAlpha() {
        return mAlpha;
    }
    @Override
    public int getForegroundColor() {
        return Color.argb(mAlpha,Color.red(mForegroundColor),Color.green(mForegroundColor),Color.blue(mForegroundColor));
    }
}

 第二種方法是繼承Span架構中的抽象類或者是實現特定接口|-陈明月爱情连连看。需要注意的是_|-银彩登录网址,在上一篇文章中說的CharacterStyle,ParagraphStyle.UpdateAppearance和UpdateLayout都是沒有函數的|_-长葛市教育局,所以|-|防爆机器人布里茨,我們無法直接繼承或者實現它們|-成都水疗论坛。除了第一篇文章中所介紹的那些Span可以使用第一種方法進行繼承--注册送彩金验证手机。我們一般都繼承或者實現MetricAffectingSpan,ReplacementSpan或者LineBackgroundSpan|--3550幸运彩票安全吗。
 比如我們想給每個字都添加一個不同顏色的背景|门德尔松随想回旋曲,我們就可以繼承ReplacementSpan

demo

public class BubbleSpan extends ReplacementSpan {
    private Paint mPaint;
    static Random random = new Random();
    private int mWidth = -1;
    private RectF mRectF = new RectF();

    private int[] mColors = new int[20];

    public BubbleSpan() {
        initPaint();
        initColors();
    }

    private void initPaint() {
        mPaint = new Paint();
        mPaint.setColor(Color.rgb(random.nextInt(255), random.nextInt(255), random.nextInt(255)));
        mPaint.setAntiAlias(true);
    }

    private void initColors() {
        for(int index = 0 ; index < mColors.length ; index++) {
            mColors[index] = Color.rgb(random.nextInt(255), random.nextInt(255), random.nextInt(255));
        }
    }

    @Override
    public int getSize(Paint paint, CharSequence text, int start, int end, Paint.FontMetricsInt fm) {
        //return text with relative to the Paint
        mWidth = (int) paint.measureText(text, start, end);
        return mWidth;
    }

    @Override
    public void draw(Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, Paint paint) {
        float charx = x;
        for(int i = start ; i<end; i++) {
            String charAt = extractText(text, i, i + 1);
            float charWidth = paint.measureText(charAt);
            mRectF.set(charx, top, charx += charWidth, bottom);
            mPaint.setColor(mColors[i % mColors.length]);
            //根據每個字的位置繪製背景
            canvas.drawOval(mRectF, mPaint);
        }
        //繪製字體-|-诺基亚手机主题制作,如果不掉用這個函數|--skinselect,就不會顯示字體啦-_-西单商场打折。
        canvas.drawText(text, start, end, x, y, paint);
    }

    private String extractText(CharSequence text, int start, int end) {
        return text.subSequence(start, end).toString();
    }
}

 我們可以看到_盈彩在线邀请码,我們要實現兩個函數:getSize和draw|赵学成。getSize是獲得字體的長度的__360大乐透专家杀号定胆,所以一般都是直接使用paint.measureText,然後draw中進行繪製|-_诺基亚ovi套件官方下载,你可以在這裏把每個字的背景繪製出來|陕西中医学院综合教务管理系统,而且你必須也要把字體給繪製出來||娱乐天地客服联系不上。如果你隻想繪製背景|-|守护甜心第四季预告,不想涉及字體的繪製__-青岛电视台2,那麼就可以直接實現LineBackgroundSpan接口|敕令大将军到此。

public class RectSpan extends ReplacementSpan {
    private final Paint mPaint;
    private int mWidth;

    public RectSpan() {
        mPaint = new Paint();
        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setColor(Color.BLUE);
        mPaint.setAntiAlias(true);
    }

    @Override
    public int getSize(Paint paint, CharSequence text, int start, int end, Paint.FontMetricsInt fm) {
        //return text with relative to the Paint
        mWidth = (int) paint.measureText(text, start, end);
        return mWidth;
    }

    @Override
    public void draw(Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, Paint paint) {
        //隻繪製了外圍矩形---赢彩彩票与你同行开奖,沒有繪製文字_-|金山快译通。
        canvas.drawRect(x, top, x + mWidth, bottom, mPaint);
    }
}

demo

通過Span實現動畫

 在上一節中__建厂网,我們已經實現了MutableForegroundColorSpan類-||11086移动彩票cn,那麼如何使用它來實現動畫呢_|阜新市交通违章?這裏我們就要使用到ObjectAnimator和Property<T1,T2>-抓住偷水贼。我們首先定義MutableForegroundColorSpan使用的property-建行活期存款利率。

private static final Property<MutableForegroundColorSpan, Integer> MUTABLE_FOREGROUND_COLOR_SPAN_PROPERTY =
        new Property<MutableForegroundColorSpan, Integer>(Integer.class, 'MUTABLE_FOREGROUND_COLOR_SPAN_FC_PROPERTY') {

        @Override
                public void set(MutableForegroundColorSpan alphaForegroundColorSpanGroup, Integer value) {
                        alphaForegroundColorSpanGroup.setForegroundColor(value);
                }

        @Override
                public Integer get(MutableForegroundColorSpan span) {
                        return span.getForegroundColor();
                }
};

 然後我們就可以使用ObjectAnimator對MutableForegroundColorSpan實現屬性動畫了|_咖啡恋人馆。

MutableForegroundColorSpan span = new MutableForegroundColorSpan(255, Color.BLUE);
final SpannableString spannableString = new SpannableString(CONTENT);
spannableString.setSpan(span, 0,4, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
ObjectAnimator objectAnimator = ObjectAnimator.ofInt(span, MUTABLE_FOREGROUND_COLOR_SPAN_PROPERTY, Color.BLACK, Color.RED);
objectAnimator.setEvaluator(new ArgbEvaluator());
objectAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
        //refresh
                mTvTextView.setText(spannableString);
        }       
});
objectAnimator.setInterpolator(mSmoothInterpolator);
objectAnimator.setDuration(600);
objectAnimator.start();

 這裏還隻是單獨一個Span實例的動畫效果-_|花家姑娘,你可以對多個Span實例進行屬性動畫--瑞丽裳电子杂志,從而實現更加複雜的動畫效果-_下一站幸福剧情。就比如文章開始時的文字逐漸顯示的動畫效果__-药酒是在哪个朝代后出现的。
 我們可以給每個字都設置一個MutableForegroundColorSpan實例,並將這些實例都添加到一個對象中_掌上彩票骗局,然後在屬性動畫過程中|||江苏点招网,亂序設置每個實例的alpha的值-|-fm2010战术包,從而達到文字逐漸顯現的動畫|-兰西小屋论坛。

public class FireWorkGroup {
    private final float mProgress;
    private final ArrayList<MutableForegroundColorSpan> mSpans;
    private final ArrayList<Integer> mSpanIndexes;

    public FireWorkGroup() {
        mProgress = 0;
        mSpans  = new ArrayList<>();
        mSpanIndexes = new ArrayList<>();
    }

    public void addSpan(MutableForegroundColorSpan span) {
        span.setAlpha(0);
        mSpanIndexes.add(mSpans.size());
        mSpans.add(span);
    }
    public void init() {
        Collections.shuffle(mSpans);
    }
    public void setProgress(float progress) {
        int size = mSpans.size();
        float total  = 1.0f * size * progress;
        for (int index = 0 ; index < size ; index++) {
            MutableForegroundColorSpan span = mSpans.get(index);
            if (total > 1.0f) {
                span.setAlpha(255);
                total -= 1.0f;
            } else {
                span.setAlpha((int)(total * 255));
                total = 0.0f;
            }
        }
    }
    public float getProgress() {
        return mProgress;
    }
    public static final Property<FireWorkGroup, Float> FIREWORKS_GROUP_PROGRESS_PROPERTY =
            new Property<FireWorkGroup, Float>(Float.class, 'FIREWORKS_GROUP_PROGRESS_PROPERTY') {

                @Override
                public void set(FireWorkGroup spanGroup, Float value) {
                    spanGroup.setProgress(value);
                }

                @Override
                public Float get(FireWorkGroup spanGroup) {
                    return spanGroup.getProgress();
                }
            };
}

後記

 上述的這些動畫都是我在第一篇文章提到的那篇博文中實現過的效果-__11086时时彩官网ip禁止,我在學習過程中又發現了一個實現了很多TextView相關動畫的開源項目HTextView_-_永盛国际赢了取不出来。所以接下來的任務就是想使用Span機製去實現這個項目中的一些動畫效果-_河北区haobc。希望大家繼續支持我的文章_--终难忘 秋夜雨寒,並積極指出文中的錯誤-盈众彩票正规吗。
 !!!源碼都在我的github裏_|qq下载2011正式版官方下载。

延伸閱讀--_冰城文明小博客:

Tag標簽|上海sony笔记本维修: 進階  
  • 專題推薦

  • Windows7係統入門 優化 技巧技術專題
  • Windows7係統專題 無論是升級操作係統运盛彩票app、資料備份_|和龙市政务信息网、加強資料的安全及管...... 詳細
About IT165 - 廣告服務 - 隱私聲明 - 版權申明 - 免責條款 - 網站地圖 - 網友投稿 - 聯係方式
本站內容來自於互聯網,僅供用於網絡技術學習,學習中請遵循相關法律法規
qq分分彩金祥彩票大地彩票神州彩天下彩票免费资料大全双赢彩票

免责声明: 本站资料及图片来源互联网文章,本网不承担任何由内容信息所引起的争议和法律责任。所有作品版权归原创作者所有,与本站立场无关,如用户分享不慎侵犯了您的权益,请联系我们告知,我们将做删除处理!