继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

使用自定义布局模仿下雨(只是小线条~)

小哥歌
关注TA
已关注
手记 6
粉丝 4
获赞 155

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);
    }
}
打开App,阅读手记
1人推荐
发表评论
随时随地看视频慕课网APP

热门评论

可以发下项目源码的地址不

可不可以来几条注释啊亲

查看全部评论