public class MyMarqueeView extends View {
private Paint paint;
private RectF rect;
private float startX, startY, endX, endY;
private float currentX,currentY;
/**
* 灯大小
*/
private int radius = 15;
/**
* 多少毫秒绘制一个圆点
* 最小80
*/
private int time = 100;
/**
* 绘制的圆点个数,如果数量等于全部数量重新绘制或者取消
*/
int drawNumber = 1;
private int[] myColors = new int[]{Color.YELLOW,Color.BLUE,Color.RED,Color.GREEN};
private String colorPurple = "#8000FF";
private String colorOrange = "#FFA500";
private String colorPink = "#FFC0CB";
private String colorGolden = "#D4AF37";
public MyMarqueeView(Context context) {
super(context);
init();
}
public MyMarqueeView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public MyMarqueeView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
public int getStatusBarHeight() {
int result = 0;
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
result = getResources().getDimensionPixelSize(resourceId);
}
return result;
}
/**
* 一行多少个点点
* 一列有多少个点点
*/
private int hNumber,vNumber;
/**
* 单行某个颜色有多少个
* 单列某个颜色有多少个
*/
private int hChildNumber,vChildNumber;
int width,height;
private void init() {
paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setStyle(Paint.Style.FILL);
width = ScreenUtils.getScreenWidth();
height = ScreenUtils.getScreenHeight()-getStatusBarHeight()-radius;
//获取一行一列有多少个点点
hNumber = width/(2*radius)-1;
hChildNumber = hNumber/myColors.length;
vNumber = height/(2*radius)-1;
vChildNumber = vNumber/myColors.length;
rect = new RectF(0, 0, width, height);
startX = rect.left+ radius;
startY = rect.top + radius;
endX = rect.right - radius;
endY = rect.bottom - 2*radius;
currentX = startX;
currentY = startY;
startTimer();
}
private void startTimer(){
CountDownTimer timer = new CountDownTimer(4*time,time) {
@Override
public void onTick(long millisUntilFinished) {
switch (drawNumber){
case 1:
color = YELLOW;
break;
case 2:
color = BLUE;
break;
case 3:
color = RED;
break;
case 4:
color = GREEN;
break;
}
drawNumber++;
invalidate();
}
@Override
public void onFinish() {
drawNumber = 1;
this.start();
}
};
timer.start();
}
/**
* 四种颜色
*/
private String color = "";
private static final String YELLOW = "yellow",BLUE = "blue",RED = "red",GREEN = "green";
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
paint.setStrokeWidth(20);
// 绘制跑马灯效果
switch (color){
case YELLOW:
LinearGradient gradient = new LinearGradient(0,0,width,height,Color.parseColor(colorPurple),
Color.parseColor(colorPink), Shader.TileMode.CLAMP);
paint.setShader(gradient);
drawYellowCircle(canvas,0,0);
break;
case BLUE:
LinearGradient gradient1 = new LinearGradient(0,0,width,height,Color.GREEN,
Color.YELLOW, Shader.TileMode.CLAMP);
paint.setShader(gradient1);
drawYellowCircle(canvas,hChildNumber,vChildNumber);
break;
case RED:
LinearGradient gradient2 = new LinearGradient(0,0,width,height,Color.RED,
Color.parseColor(colorOrange), Shader.TileMode.CLAMP);
paint.setShader(gradient2);
drawYellowCircle(canvas,2*hChildNumber,2*vChildNumber);
break;
case GREEN:
LinearGradient gradient3 = new LinearGradient(0,0,width,height,Color.parseColor(colorPurple),
Color.parseColor(colorGolden), Shader.TileMode.CLAMP);
paint.setShader(gradient3);
drawYellowCircle(canvas,3*hChildNumber,3*vChildNumber);
break;
}
}
private void drawYellowCircle(Canvas canvas,int hStartNumebr,int vStartNumebr){
//画上边点点
currentX = startX + hStartNumebr*2*radius;
currentY = startY;
canvas.drawLine(currentX,startY,currentX+hChildNumber*2 * radius,startY,paint);
//画右边
currentY = startY+vStartNumebr*2*radius;
canvas.drawLine(endX,currentY,endX,currentY+vChildNumber*2*radius,paint);
//画底部点点
currentX = endX-hStartNumebr*2*radius;
canvas.drawLine(currentX,endY,currentX-hChildNumber*2*radius,endY,paint);
//画左边
currentY = endY-vStartNumebr*2*radius;
canvas.drawLine(startX,currentY,startX,currentY-vChildNumber*2*radius,paint);
}
}
这里用LinearGradient加的渐变色
也可以直接paint.setColor设置颜色,time的大小控制画的速度也就是灯的速度,建议100毫秒
使用的话直接布局用就就可以
另一种方案是画圆点,就是换换方法的事,drawLine换drawCircle