1. 程式人生 > >Android開發之讓你的文字顏色來回閃動

Android開發之讓你的文字顏色來回閃動

前言:經常使用頭條的朋友們都知道,每當我們切換頁面的載入的時候,然後都會閃現出一段文字“你關注的才是頭條”,一閃一閃的。在我們上一節《Android開發之高階渲染》大家對渲染有一定的瞭解,今天我們結合一個小案例,用到線性渲染和Matrix然後結合文字,實現這一個閃閃發光的文字,不過我們實現的要比頭條的那個更加豐富,更加亮眼!

---------------分割線-----------

ok,先來看一下效果


---------------分割線--------------

實現:1.首先繼承TextView類,方便我們獲取文字的資訊。

2.在onsizechanged裡面獲取文字的相關資訊。

3.在onsizechanged設定線性渲染(記得設定渲染的寬度)。

4.在onDraw裡面動態獲取文字的大小。

5.自增translateX,然後根據文字的大小判斷是否閃動到頭。

6.在onDraw裡面動態改變matrix.setTranslate(translateX, 0)。

7.最後在onDraw裡面重新整理頁面(延遲重新整理)。

--------------分割線---------------

ok我們來看下完整程式碼:

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.LinearGradient;
import android.graphics.Matrix;
import android.graphics.Shader;
import android.support.v7.widget.AppCompatTextView;
import android.text.TextPaint;
import android.util.AttributeSet;


/**
 * Created by Fly on 2017/6/6.
 */

public class LinearGradientTextView4 extends AppCompatTextView {

    private TextPaint paint;
    private LinearGradient linearGradient;
    private Matrix matrix;
    private float translateX;
    private float deltaX = 20;

    private int showTime;//顯示的時間
    private int lineNumber;//行數
    private int showStyle;
    public static final int UNIDIRECTION = 0;
    public static final int TWOWAY = 1;
    private int color;

    public LinearGradientTextView4(Context context, AttributeSet attrs) {
        super(context, attrs);
        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.LinearGradientTextView4);
        showTime = typedArray.getInteger(R.styleable.LinearGradientTextView4_showTime, 40);
        lineNumber = typedArray.getInteger(R.styleable.LinearGradientTextView4_lineNumber, 1);
        showStyle = typedArray.getInt(R.styleable.LinearGradientTextView4_showStyle, UNIDIRECTION);
        color = typedArray.getColor(R.styleable.LinearGradientTextView4_textColor, Color.BLUE);
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        paint = getPaint();
        String text = getText().toString();
        float textWidth = paint.measureText(text);
        //GradientSize=三個文字的大小
        int gradientSize = (int) (3 * textWidth / text.length());
        //邊緣融合
        linearGradient = new LinearGradient(-gradientSize, 0, gradientSize, 0, new int[]{color - 0xAF000000, color, color - 0xAF000000},
                new float[]{0, 0.5f, 1}, Shader.TileMode.CLAMP);
        paint.setShader(linearGradient);
        matrix = new Matrix();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        float textWidth = (getPaint().measureText(getText().toString())) / lineNumber;
        translateX += deltaX;
        switch (showStyle) {
            case UNIDIRECTION:
                //單向閃動
                if (translateX > textWidth + 1 || translateX < 1) {
                    translateX = 0;
                    translateX += deltaX;
                }
                break;
            case TWOWAY:
                //來回閃動
                if (translateX > textWidth + 1 || translateX < 1) {
                    deltaX = -deltaX;
                }
                break;
        }

        matrix.setTranslate(translateX, 0);
        linearGradient.setLocalMatrix(matrix);
//        if (lineNumber > 1) {
//            postInvalidateDelayed(showTime * lineNumber);
//        } else {
//            postInvalidateDelayed(showTime);
//        }
        postInvalidateDelayed(showTime * lineNumber);
//        postInvalidate();
    }
}
屬性:
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="LinearGradientTextView4">
        <attr name="lineNumber" format="integer"></attr>
        <attr name="showTime" format="integer"></attr>
        <attr name="textColor" format="color"></attr>
        <attr name="showStyle">
            <enum name="UNIDIRECTION" value="0"></enum>
            <enum name="TWOWAY" value="1"></enum>
        </attr>

    </declare-styleable>
</resources>
在佈局中具體使用:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#ffffff"
    android:gravity="center"
    android:orientation="vertical"
    tools:context="com.fly.lsn31_gradient.MainActivity">

    <com.fly.lsn31_gradient.LinearGradientTextView4
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="你關心的   \n    是Fly學院"
        android:textSize="35sp"
        app:lineNumber="2"
        app:showStyle="UNIDIRECTION"
        app:showTime="40" />

    <com.fly.lsn31_gradient.LinearGradientTextView4
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="你關心的是Fly學院"
        android:textSize="35sp"
        app:lineNumber="1"
        app:showStyle="TWOWAY"
        app:showTime="40"
        app:textColor="#6e6e6e" />

</LinearLayout>
-------------完!熬夜寫部落格,不容易,希望大家支援!-------------

相關推薦

Android開發文字顏色來回閃動

前言:經常使用頭條的朋友們都知道,每當我們切換頁面的載入的時候,然後都會閃現出一段文字“你關注的才是頭條”,一閃一閃的。在我們上一節《Android開發之高階渲染》大家對渲染有一定的瞭解,今天我們結合一個小案例,用到線性渲染和Matrix然後結合文字,實現這一個閃閃發光的文

Android開發TabLayout真正實現底部導航欄(可實現點選文字顏色圖片切換)

前言:關於這個TabLayout實現底部導航,在我的上篇《Android開發之TabLayout實現底部導航欄》部落格中有提到,但是後面在仔細的接觸專案中,發現了裡面有很多沒有解決的事情,比如不能實現點選文字顏色和圖片的切換,不能做到禁止左右滑動,所以趁著今天有時間的情況下

Android開發神奇的Fading Edge,的View更有層次感!

最近在研究Android Framework層原始碼,發現我們對原始碼的理解應該建立在對API的理解之上,如果有一些API你沒用過,那麼即使你在原始碼中見到這個東西都不知道是幹嘛的,更談不上理解了。一直以來我都很想把View的繪製方法draw詳細的走一遍,但是這裡涉及到的細節

Android遊戲開發二十】物理遊戲重力系統開發的遊戲變得有質有量!

原創,轉載務必在明顯處註明:    今天群裡一哥哥說急需關於物理遊戲方面的資料,so~下午就隨手寫了一個簡單的圓形自由落體Demo,正好一起分享給大家學習下吧;    先大概說一下,之前的文章中,給大家介紹過重力感測器,那麼和今天要說的重力系統,其實是一樣的!    在重力感

Android高效內存的圖片省內存

單位 內存占用 取值 span text bounds size 5.4 dpi Android高效內存之讓你的圖片省內存 在做內存優化的時候,我們發現除了解決內存泄露問題,剩下的就只有想辦法減少真實的內存占用。而在App中,大部分內存可能被我們圖片占用了,所

Android原生繪圖瞭解View的運動

一、前言 1.我一直想寫一篇關於運動的文章,現在總算千呼萬喚始出來了。 2.本篇是一個長篇,各位看官自備水果、飲料、花生米,相信會給你會吃的很開心。 3.本專案原始碼見文尾捷文規範第一條 先看一下幾個效果:(留圖鎮樓) 1.---瘋狂的分裂 2.---粉身碎骨

Android開發手把手教寫ButterKnife框架(一)

系列文章目錄導讀: 一、概述 JakeWharton我想在Android界無人不知,無人不曉的吧, ButterKnife這個框架就是出自他隻手。這個框架我相信很多人都用過,本系列部落格就是帶大家更加深入的認識這個框架,ButterKnife截至目前

Android開發手把手教寫ButterKnife框架(三)

系列文章目錄導讀: 一、概述 然後在Processor裡生成自己的程式碼,把要輸出的類,通過StringBuilder拼接字串,然後輸出。 try { // write the file JavaFileObject

Android-x86入門--Android-x86豎屏起來-- 安裝到虛擬機器裡的

前提是看這個: http://blog.csdn.net/louiswangbing/article/details/6715930 http://blog.csdn.net/louiswangbing/article/details/6660824 me

Android開發getX,getRawX,getWidth,getTranslationX等的區別

save string hlist getwidth sta 是我 touch 項目 寬度 轉載請註明出處:http://blog.csdn.net/dmk877/article/details/51550031 好久沒寫博客了,最近工作確實挺忙的,剛剛結束了一個

Android 開發Windows環境下Android Studio安裝和使用教程(圖文詳細步驟)

9.png 虛擬機 jdk版本 編寫 clip 開發平臺 集成開發 arc 電腦安裝 鑒於谷歌最新推出的Android Studio備受開發者的推崇,所以也跟著體驗一下。 一、介紹Android Studio Android Studio 是一個Android

Android開發AudioManager(音頻管理器)具體解釋

應該 數量 service eth out 開發 要求 type 路由 AudioManager簡單介紹: AudioManager類提供了訪問音量和振鈴器mode控制。使用Context.getSystemService(Context.AUDIO_SERVICE)

【入門篇】ANDROID開發BUG專講

world 自然 執行 類型 效率 str 積累 全部 href 話說諸葛亮是一個優秀的程序員,每個錦囊都是應對不同的case而編寫的。可是優秀的程序員也敵只是更優秀的bug。六出祈山。七進中原,鞠躬盡瘁,死而後已的諸葛亮僅僅由於有一

android開發merge結合include優化布局

ted com match clas you title example ews 文件的 merge結合include優化android布局,效果不知道。個人感覺使用上也有非常大的局限。只是還是了解一下。記錄下來。 布局文件都要有根節點,但androi

Android開發增量更新

avt exp chm 這一 font ams extern city ron 一、使用場景 apk升級,節省服務器和用戶的流量 二、原理 自從 Android 4.1 開始, Google Play 引入了應用程序的增量更新功能,App使用該升級方式,可節省約2/3

Android開發布局文件裏實現OnClick事件關聯處理方法

intent dsm nbsp ext 關聯 you vertica findview 時間 一般監聽OnClickListener事件,我們都是通過Button button = (Button)findViewById(....); button.se

Android 開發 ---- bootloader (LK)

ttl tab 不同的 opera 指定 isa system void mem LK是什麽 LK 是 Little Kernel 它是 appsbl (Applications ARM Boot Loader)流程代碼 ,little kernel

Android開發藍牙連接打印機

cep sdi tco disable ner gis util receiver count 代碼很簡單,直接一個布局文件和一個activity。需要的朋友可以直接將這兩部分粘貼復制到項目中即可。 Activity部分: package com.anhua.bluet

Android開發新建項目報錯的問題

instr rul txt gin 通過 ini .com org top 通過android studio新建一個空項目。在新建完項目之後,gradle編譯會報錯。 發生問題的原因是build.gradle(Project:TopDialog)中: allproject

Android開發CriminalIntent項目開發(其一)

開發項目 1.0 enc 增加 委派 其他 date 應用 module 前言   這次的開發項目是一個叫做CriminalIntent的應用,該應用可以詳細記錄各種辦公室陋習。這個應用記載的陋習記錄包括標題、日期和圖片,支持在聯系人中查找當事人,通過E-mail、Twit