前言
根據(jù)啟艦 的博客所學習的自定義View。
大家還記得gradient標簽么?這里的LinearGradient的效果是線性漸變,可以設置多種顏色的漸變。
一、 初識LinearGradient
public LinearGradient(float x0, float y0, float x1, float y1,int color0, int color1, TileMode tile)
- (x0,y0): 起始漸變點坐標
- (x1,y1): 結(jié)束漸變點坐標
- color0:起始顏色,顏色值必須使用0xAARRGGBB形式的16進制表示!表示透明度的AA一定不能少
- color1:終止顏色
- TileMode tile:與BitmapShader一樣,用于指定控件區(qū)域大于指定的漸變區(qū)域時,空白區(qū)域的顏色填充方法。忘記的,可以進入paint的各種方法的BitmapShader一節(jié)查看。
這里稍微提一下吧!??
| 模式 | 效果 |
|---|---|
| Shader.TileMode.CLAMP | 會將邊緣的一個像素進行拉伸、擴展 |
| Shader.TileMode.MIRROR | 鏡面翻轉(zhuǎn) |
| Shader.TileMode.REPEAT | 平移復制 |
看了半天,這個明明只能設置兩種顏色漸變吧,表擔心,看這個
public LinearGradient(float x0, float y0, float x1, float y1,int colors[], float positions[], TileMode tile)
- (x0,y0): 起始漸變點坐標
- (x1,y1): 結(jié)束漸變點坐標
- colors[]: 用于指定漸變的顏色值數(shù)組,同樣,顏色值必須使用0xAARRGGBB形式的16進制表示!表示透明度的AA一定不能少。
- positions[]: 與漸變的顏色相對應,取值是0-1的float類型,表示在每一個顏色在整條漸變線中的百分比位置
- TileMode tile:指定控件區(qū)域大于指定的漸變區(qū)域時,空白區(qū)域顏色填充方法。
這個構(gòu)造函數(shù)則可以實現(xiàn)多種顏色漸變哦!
二、小試牛刀
//從紅色到藍色兩色漸變,從(0,0)到(100,100)漸變,模式為平移復制
paint.setShader(new LinearGradient(0, 0, 100, 100, 0xffff0000, 0xff0000ff, Shader.TileMode.REPEAT));
canvas.drawRect(0, 0, 200, 200, paint);
canvas.translate(0,300);
//多色漸變
int[] colors = {0xffff0000,0xff00ff00,0xffff0000,0xffffff00,0xff0000ff};
float[] pos = {0f,0.2f,0.4f,0.6f,1.0f};
paint.setShader(new LinearGradient(0, 0, 100, 100, colors, pos, Shader.TileMode.REPEAT));
canvas.drawRect(0, 0, 200, 200, paint);
paint.setTextSize(50);
canvas.drawText("HELLO WORLD",0,300,paint);

效果圖
注意: colors和pos的個數(shù)一定要相等
三、動起來~

效果圖
原理:
讓漸變的LinearGradient逐漸從屏幕外移動到文字上。
源碼如下:
int x;
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
ValueAnimator animator=ValueAnimator.ofInt(getMeasuredWidth());
animator.setRepeatCount(ValueAnimator.INFINITE);
animator.setDuration(3000);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
x = (int) animation.getAnimatedValue();
postInvalidate();
}
});
animator.start();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
setLayerType(LAYER_TYPE_SOFTWARE, null);//對單獨的View在運行時階段禁用硬件加速
canvas.drawColor(Color.BLACK);
Matrix matrix = new Matrix();
matrix.setTranslate(x, 0);
LinearGradient linearGradient = new LinearGradient(-getMeasuredWidth(), 300, 0, 0 ,0xffff0000,0xff0000ff, Shader.TileMode.REPEAT);
linearGradient.setLocalMatrix(matrix);
paint.setShader(linearGradient);
paint.setTextSize(50);
canvas.drawText("HELLO WORLD", 0, 300, paint);
}
四、SweepGradient:掃描式漸變
SweepGradient(float cx, float cy, int color0, int color1)
SweepGradient(float cx, float cy, int[] colors, float[] positions)
- (cx,cy) 掃描中心的坐標
- color0:起始顏色,顏色值必須使用0xAARRGGBB形式的16進制表示!表示透明度的AA一定不能少
- color1:終止顏色
舉個栗子
SweepGradient sweepGradient = new SweepGradient(100, 100, 0x00FF0000, 0xFF0000FF);
paint.setShader(sweepGradient);
canvas.drawCircle(100, 100, 50, paint);

效果圖
詳細的就不講解啦,自己試一下吧