public abstract class BaseView extends View {
private Thread thread;
public BaseView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public BaseView(Context context) {
super(context);
}
protected abstract void drawSub(Canvas canvas);
protected abstract void logic();
protected abstract void init();
@Override
protected void onDraw(Canvas canvas) {
if (thread == null) {
thread = new MyThread();
thread.start();
} else {
drawSub(canvas);
}
}
@Override
protected void onDetachedFromWindow() {
running = false;
super.onDetachedFromWindow();
}
private boolean running = true;
class MyThread extends Thread {
@Override
public void run() {
init();
while (running) {
logic();
postInvalidate();
try {
Thread.sleep(30);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
public RainItem(int width, int height) {
this.width = width;
this.height = height;
init();
}
public RainItem(int width, int height, int size) {
this.width = width;
this.height = height;
this.size = size;
init();
}
public RainItem(int width, int height, int size, int color) {
this.width = width;
this.height = height;
this.size = size;
this.color = color;
init();
}
public RainItem(int width, int height, int size, int color,
boolean randColor) {
this.width = width;
this.height = height;
this.size = size;
this.color = color;
this.randColor = randColor;
init();
}
private void init() {
random = new Random();
sizeX = 1 + random.nextInt(size / 2);
sizeY = 10 + random.nextInt(size);
startX = random.nextInt(width);
startY = random.nextInt(height);
stopX = startX + sizeX;
stopY = startY + sizeY;
opt = 0.2f + random.nextFloat();
paint = new Paint();
if (randColor) {
int r = random.nextInt(256);
int g = random.nextInt(256);
int b = random.nextInt(256);
paint.setARGB(255, r, g, b);
} else {
paint.setColor(0xffffffff);
}
}
public void draw(Canvas canvas) {
canvas.drawLine(startX, startY, stopX, stopY, paint);
}
public void move() {
startX += sizeX * opt;
stopX += sizeX * opt;
startY += sizeY * opt;
stopY += sizeY * opt;
if (startY > height) {
init();
}
}
public RainView(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray ta = context.obtainStyledAttributes(attrs,
R.styleable.RainView);
rainNum = ta.getInteger(R.styleable.RainView_rainNum, 80);
size = ta.getInteger(R.styleable.RainView_size, 20);
rainColor = ta.getInteger(R.styleable.RainView_rainColor, 0xffffff);
randColor = ta.getBoolean(R.styleable.RainView_randColor, false);
ta.recycle();
}
public RainView(Context context) {
super(context);
}
@Override
protected void drawSub(Canvas canvas) {
for (RainItem item : list) {
item.draw(canvas);
}
}
@Override
protected void logic() {
for (RainItem item : list) {
item.move();
}
}
@Override
protected void init() {
for (int i = 0; i < rainNum; i++) {
RainItem item = new RainItem(getWidth(), getHeight(), size);
list.add(item);
}
}
热门评论
可以发下项目源码的地址不
可不可以来几条注释啊亲