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);
}
}
點(diǎn)擊查看更多內(nèi)容
1人點(diǎn)贊
評(píng)論
評(píng)論
共同學(xué)習(xí),寫下你的評(píng)論
評(píng)論加載中...
作者其他優(yōu)質(zhì)文章
正在加載中
感謝您的支持,我會(huì)繼續(xù)努力的~
掃碼打賞,你說(shuō)多少就多少
贊賞金額會(huì)直接到老師賬戶
支付方式
打開(kāi)微信掃一掃,即可進(jìn)行掃碼打賞哦