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) {@Overridepublic 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();}@Overridepublic void onFinish() {drawNumber = 1;this.start();}};timer.start();}/*** 四种颜色*/private String color = "";private static final String YELLOW = "yellow",BLUE = "blue",RED = "red",GREEN = "green";@Overrideprotected 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