设为首页 加入收藏

TOP

闪动的文字和文字进度条控件
2015-07-20 17:24:00 来源: 作者: 【 】 浏览:2
Tags:闪动 文字 进度 控件

以前看到过有进度条是填充文字的,好奇心作祟,便想自己写一个试试,但是还是比较粗糙,进度条末端没有水流等涌动的效果。

?

两个控件都是继承TextView,便于设置字体大小等相关属性。

\

1,GradientTextView 渐变颜色的文字控件

主要用到LinearGradient类,用于渐变颜色,

new LinearGradient(0, 0, width, height, colorArrays[colorIndex], gradientSpread, Shader.TileMode.MIRROR);

参数对应如下,

参数1,参数2:渐变色起点位置。

参数3,参数4:渐变色终点位置。

参数5:渐变色的渐变颜色数组

参数6:渐变色的分布数组(需要和参数5中数组长度相同)

参数7:着色器模式

?

例子中定时替换渐变色数组colorArrays来达到文字颜色闪动的效果。

?

?

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.LinearGradient;
import android.graphics.Paint;
import android.graphics.Shader;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.widget.TextView;

/**
 * @author jayce
 * @date 2015/1/23
 */
public class GradientTextView extends TextView {
    private int[] colorArray1 = new int[]{Color.RED, Color.GREEN, Color.BLUE};
    private int[] colorArray2 = new int[]{Color.GREEN, Color.BLUE, Color.RED};
    private int[] colorArray3 = new int[]{Color.BLUE, Color.RED, Color.GREEN};

    private int[][] colorArrays = new int[][]{colorArray1, colorArray2, colorArray3};
    private int colorIndex = 0;
    private float[] gradientSpread = new float[]{0, 0.5f, 1.0f};

    private static final int COLORINVALIDATE=0;

    private int width;
    private int height;

    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);

            colorIndex = (colorIndex + 1) % 3;
            invalidate();
        }
    };

    public GradientTextView(Context context) {
        this(context, null);
    }

    public GradientTextView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public GradientTextView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        width = getMeasuredWidth();
        height = getMeasuredHeight();
    }



    @Override
    protected void onDraw(Canvas canvas) {
        //super.onDraw(canvas);
        Paint paint = getPaint();
        paint.setAntiAlias(true);
        LinearGradient lg = new LinearGradient(0, 0, width, height, colorArrays[colorIndex], gradientSpread, Shader.TileMode.MIRROR);
        paint.setShader(lg);

        canvas.drawText(getText().toString(), 0, height, paint);
        handler.sendEmptyMessageDelayed(COLORINVALIDATE,500);
    }
}



?

?

2,GradientTextViewProgress
在onDraw()中drawText,注意drawText中 canvas.drawText(getText().toString(), 0, baseline, paint);
参数3是baseline的高度。
先用背景画笔画出背景文字,然后用另外一个画笔画出进度,调用canvas.clipRect来裁剪。每次设置进度后,刷新控件。

package huwei.com.gradienttextviewdemo;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.LinearGradient;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.Shader;
import android.util.AttributeSet;
import android.view.View;
import android.widget.TextView;

/**
 * @author jayce
 * @date 2015/1/23
 */
public class GradientTextProgress extends TextView {
    private String mText;
    private int maxValue;
    private int curValue;
    private Paint bgPaint,paint;// 
 

?

?

?

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇POJ 1182 食物链 (种类并查集) 下一篇ZOJ 3334 Body Check 贪心算法

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Python 数据分析与可 (2025-12-26 21:51:20)
·从零开始学Python之 (2025-12-26 21:51:17)
·超长干货:Python实 (2025-12-26 21:51:14)
·为什么 Java 社区至 (2025-12-26 21:19:10)
·Java多线程阻塞队列 (2025-12-26 21:19:07)