自定義TextView,實(shí)現(xiàn)文字變色

今天有點(diǎn)時(shí)間,跟著大牛們學(xué)習(xí)了下自定義textview琼懊,實(shí)現(xiàn)文字變色,效果如下:

device-2017-06-25-161933.gif

上面效果實(shí)現(xiàn)的大致的思路為:

1:寫一個(gè)類爬早,繼承自textview哼丈,這里繼承自view也可以,不過繼承自textview的話筛严,只需要重寫onDraw()方法就可以了醉旦,同時(shí)可以使用textview的getText()等方法,代碼邏輯上就要少些處理桨啃;
2:根據(jù)需要自定義一些屬性车胡,并初始這些屬性;
3:初始化畫筆照瘾,這里需要初始化兩個(gè)畫筆吨拍,一個(gè)是變色的畫筆,另一個(gè)是不變色的畫筆网杆,并設(shè)置好相應(yīng)的屬性;
4:重寫onDraw()方法,進(jìn)行繪制

繼承textview時(shí)實(shí)現(xiàn)的那三個(gè)構(gòu)造方法什么時(shí)候調(diào)用在上篇播客中說了碳却,這里就不說了队秩,直接對(duì)畫筆進(jìn)行初始化;

    private Paint getPaintByColor(int color) {
        Paint paint = new Paint();
        //設(shè)置顏色
        paint.setColor(color);
        //設(shè)置抗鋸齒
        paint.setAntiAlias(true);
        //設(shè)置防抖動(dòng)
        paint.setDither(true);
        //設(shè)置字體大小
        paint.setTextSize(getTextSize());
        return paint;
    }

根據(jù)傳入的顏色返回一個(gè)Paint對(duì)象昼浦;接下來就是在onDraw()方法中進(jìn)行繪制馍资;

    @Override
    protected void onDraw(Canvas canvas) {
//        super.onDraw(canvas); 

        //根據(jù)進(jìn)度計(jì)算中間值
        int middle = (int) (mCurrentProgres * getWidth());
        //從左到右繪制
        if(mDirection==Direction.LEFT_TO_RIGHT){
            //右邊是紅色左邊是黑色
            drawText(canvas, changePaint, 0, middle);
            drawText(canvas, originPaint, middle, getWidth());
        }else{
            drawText(canvas, changePaint, getWidth()-middle, getWidth());
            drawText(canvas, originPaint, 0, getWidth()-middle);
        }
    }

在這里要將super.onDraw(canvas);注釋掉,自己去實(shí)現(xiàn)繪制关噪,如果沒有注釋掉就會(huì)調(diào)用TextView的onDraw方法將文字繪制出來鸟蟹;首先需要計(jì)算出文字的中間值,根據(jù)計(jì)算出來的中間值可以確定變色的繪制的end位置和不變色繪制的start開始位置使兔,因?yàn)閷?shí)現(xiàn)的是從左到右或者從右到左的變色建钥,所有要定義兩個(gè)方式并初始化值;

    //實(shí)現(xiàn)不同朝向變色
    private Direction mDirection=Direction.LEFT_TO_RIGHT;
    public enum Direction{
        LEFT_TO_RIGHT,RIGHT_TO_LEFT;
    }

在繪制的時(shí)候其實(shí)還是對(duì)Paint和Canvas的使用虐沥;調(diào)用Canvas的

//保存畫布
canvas.save();

方法保存畫布熊经,接著調(diào)用Canvas的

 Rect rt = new Rect(start, 0, end, getHeight());
 canvas.clipRect(rt);

方法進(jìn)行變色和不變色區(qū)域的裁剪,跟著就使用Paint畫筆進(jìn)行繪制了欲险;

String text = getText().toString();
 //獲取字體的寬度
Rect rect = new Rect();
paint.getTextBounds(text, 0, text.length(), rect);
int x = getWidth() / 2 - rect.width() / 2;
//基線
Paint.FontMetricsInt metricsInt = paint.getFontMetricsInt();
int dy = (metricsInt.bottom - metricsInt.top) / 2 - metricsInt.bottom;
int baseLine = getHeight() / 2 + dy;
canvas.drawText(text, x, baseLine, paint);

繪制完后要記得重置畫布镐依,

//釋放畫布
canvas.restore();

這樣就繪制完成了,在調(diào)用的地方設(shè)置相應(yīng)的一些動(dòng)畫效果就可以了天试,

    /**
     * 設(shè)置屬性動(dòng)畫
     * @param direction
     */
    private void setAnimator(ColorTextView.Direction direction){
        colorText.setDirection(direction);
        ValueAnimator animator = ObjectAnimator.ofFloat(0, 1);
        animator.setDuration(2000);
        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                float animatedValue = (float) animation.getAnimatedValue();
                colorText.setCurrentProgress(animatedValue);
            }
        });
        animator.start();
    }

源碼地址:http://pan.baidu.com/s/1jIHYyvs

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末槐壳,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子喜每,更是在濱河造成了極大的恐慌务唐,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,542評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件灼卢,死亡現(xiàn)場(chǎng)離奇詭異绍哎,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)鞋真,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門崇堰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人涩咖,你說我怎么就攤上這事海诲。” “怎么了檩互?”我有些...
    開封第一講書人閱讀 158,021評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵特幔,是天一觀的道長。 經(jīng)常有香客問我闸昨,道長蚯斯,這世上最難降的妖魔是什么薄风? 我笑而不...
    開封第一講書人閱讀 56,682評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮拍嵌,結(jié)果婚禮上遭赂,老公的妹妹穿的比我還像新娘。我一直安慰自己横辆,他們只是感情好撇他,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著狈蚤,像睡著了一般困肩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上脆侮,一...
    開封第一講書人閱讀 49,985評(píng)論 1 291
  • 那天锌畸,我揣著相機(jī)與錄音,去河邊找鬼他嚷。 笑死蹋绽,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的筋蓖。 我是一名探鬼主播卸耘,決...
    沈念sama閱讀 39,107評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼粘咖!你這毒婦竟也來了蚣抗?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,845評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤瓮下,失蹤者是張志新(化名)和其女友劉穎翰铡,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體讽坏,經(jīng)...
    沈念sama閱讀 44,299評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡锭魔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了路呜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片迷捧。...
    茶點(diǎn)故事閱讀 38,747評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖胀葱,靈堂內(nèi)的尸體忽然破棺而出漠秋,到底是詐尸還是另有隱情,我是刑警寧澤抵屿,帶...
    沈念sama閱讀 34,441評(píng)論 4 333
  • 正文 年R本政府宣布庆锦,位于F島的核電站,受9級(jí)特大地震影響轧葛,放射性物質(zhì)發(fā)生泄漏搂抒。R本人自食惡果不足惜艇搀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望燕耿。 院中可真熱鬧中符,春花似錦、人聲如沸誉帅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蚜锨。三九已至,卻和暖如春慢蜓,著一層夾襖步出監(jiān)牢的瞬間亚再,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評(píng)論 1 267
  • 我被黑心中介騙來泰國打工晨抡, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留氛悬,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,545評(píng)論 2 362
  • 正文 我出身青樓耘柱,卻偏偏與公主長得像如捅,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子调煎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容