這是我第一次寫博客同時也是剛接觸android開發,如果有什麼不對的地方請多多包含。
閃動的文字效果
此處利用LinearGradient Shader和Matrix來實現動態的文字閃動效果,效果如圖所示:
想要實現這一效果,可以充分利用android中Paint對象的Shader渲染器。
設置一個不斷變化的LinearGradient,使用帶有屬性的Paint對象來繪製要顯示的文字。首先,在
onSizeChanged()方法中進行對象的初始化,代碼如下所示:
@Override
protected void onSizeChanged(int w,int h,int oldw,int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
// 根據畫布的寬,判斷是否需要初始化
if (mViewWidth == 0) {
// 測量獲取畫布的寬
mViewWidth = getMeasuredWidth();
if (mViewWidth > 0) {
// 獲取畫筆
mPaint = getPaint();
// 設置線性漸變
mLinearGradient = new LinearGradient(
// 起始點的x位置
0,
// 起始點的y位置
0,
// 終點的x位置
mViewWidth,
// 終點的y位置
0,
// 漸變顏色
new int[]{
Color.BLUE, 0xffffffff,
Color.BLUE
},
null,
// 平鋪方式
Shader.TileMode.CLAMP
);
// 爲畫筆設置着色器
mPaint.setShader(mLinearGradient);
// 設置傾斜矩形
mGradientMatrix = new Matrix();
}
}
}
最後,在onDraw()方法中,通過矩陣的方式來不斷平移漸變效果,從而在繪製文字時,產生動態的閃動效果,代碼如下所示:
@Override
protected void onDraw(Canvas canvas){
super.onDraw(canvas);
// 判斷是否實例化矩形(執行順序理論上是先執行onSizeChanged()方法後再執行此方法)
if(mGradientMatrix != null){
// 距離每次增加總寬的五分之一
mTranslate += mViewWidth/5;
// 超過兩個畫布長度就重新回到畫布以外,防止出現閃屏的效果
if(mTranslate > 2*mViewWidth){
mTranslate = -mViewWidth;
}
// 給矩陣設置過度效果和初始點
mGradientMatrix.setTranslate(mTranslate, 0);
mLinearGradient.setLocalMatrix(mGradientMatrix);
// 延遲重繪(設置爲100ms)
postInvalidateDelayed(100);
}
}
以上就是閃動文字的實現方法,其實可以通過res資源目錄的values目錄下創建一個attrs.xml的屬性定義文件來自定義屬性,比如設置閃動的速度或是閃動的矩形大小。
代碼
以下是完整代碼:
package com.example.customConcrols;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.LinearGradient;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Shader;
import android.util.AttributeSet;
import android.widget.TextView;
/**
* 重寫TextView控件,閃動的文字效果
* Created by shize on 2016/8/29.
*/
public class CustomTextView extends TextView {
private int mViewWidth = 0;
// 水平方向上平移的距離
private int mTranslate = 0;
private LinearGradient mLinearGradient;
private Matrix mGradientMatrix;
private Paint mPaint;
public CustomTextView(Context context) {
super(context);
}
// 此處必須使用構造方法二(沒有程序會報錯)
public CustomTextView(Context context, AttributeSet attrs){
super(context,attrs);
}
@Override
protected void onSizeChanged(int w,int h,int oldw,int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
if (mViewWidth == 0) {
mViewWidth = getMeasuredWidth();
if (mViewWidth > 0) {
mPaint = getPaint();
mLinearGradient = new LinearGradient(
0,
0,
mViewWidth,
0,
new int[]{
Color.BLUE, 0xffffffff,
Color.BLUE
},
null,
// 平鋪方式
Shader.TileMode.CLAMP
);
mPaint.setShader(mLinearGradient);
mGradientMatrix = new Matrix();
}
}
}
@Override
protected void onDraw(Canvas canvas){
super.onDraw(canvas);
if(mGradientMatrix != null){
mTranslate += mViewWidth/5;
if(mTranslate > 2*mViewWidth){
mTranslate = -mViewWidth;
}
mGradientMatrix.setTranslate(mTranslate, 0);
mLinearGradient.setLocalMatrix(mGradientMatrix);
// 延遲重繪
postInvalidateDelayed(100);
}
}
}
感謝閱讀,學習重在堅持,貴在堅持,下次再見。