上代码:
package cn.find;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.util.AttributeSet;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import androidx.annotation.NonNull;
import java.util.Random;
public class RainSurfaceView extends SurfaceView implements Runnable, SurfaceHolder.Callback {
private final String TAG = this.getClass().getName();
private final SurfaceHolder mHolder;
Paint paint = new Paint();
Rain[] rains = new Rain[200];
Random random = new Random();
public RainSurfaceView(Context context) {
this(context, null);
}
public RainSurfaceView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public RainSurfaceView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
mHolder = getHolder();
mHolder.addCallback(this);
paint.setAntiAlias(true);
paint.setColor(Color.WHITE);
paint.setStyle(Paint.Style.FILL);
for (int i = 0; i < rains.length; i++) {
rains[i] = new Rain();
}
}
@Override
public void surfaceCreated(@NonNull SurfaceHolder holder) {
//SurfaceView 的 onDraw 方法生效
setWillNotDraw(false);
//开启绘制线程
new Thread(this).start();
}
@Override
public void surfaceChanged(@NonNull SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(@NonNull SurfaceHolder holder) {
}
@Override
public void run() {
try {
Canvas canvas = mHolder.lockCanvas();
//SurfaceView 清屏
canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
drawRain(canvas);
mHolder.unlockCanvasAndPost(canvas);
//定时 50 毫秒 刷新
postDelayed(this, 50);
} catch (Exception e) {
Log.e(TAG, "run-ex=" + e.getMessage());
}
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// drawRain(canvas);
// postInvalidateDelayed(50);
}
private void drawRain(Canvas canvas) {
for (Rain r : rains) {
if ( r.sx<=0 || r.sx>getWidth() || r.sy > getHeight()) {
r.sx = random.nextInt(getWidth()) + r.xMin;
r.sy = -(random.nextInt(getHeight()) + r.yMin);
r.ex=r.sx+r.wind;
r.ey=r.sy+r.rainLen;
r.r = random.nextInt(r.rBound) + r.rMin;
r.speed = random.nextInt(r.speedBound) + r.speedMin;
}
r.sx+=r.swing;
r.ex+=r.swing;
r.sy += r.speed;
r.ey +=r.speed;
//雨点的透明度
paint.setAlpha(random.nextInt(20)+200);
canvas.drawLine(r.sx,r.sy,r.ex,r.ey,paint);
}
}
class Rain {
int sx, sy,ex,ey;
int xMin=1;
int yMin=1;
int rainLen=100;
//没有风
int wind=0;
int swing=0;
//风往左吹
// int wind=-10;
// int swing=-1;
//风往右吹
// int wind=10;
// int swing=1;
int r;
int rBound = 6;
int rMin = 4;
int speed;
int speedBound=20;
int speedMin=20;
}
}
demo 下载地址:https://download.csdn.net/download/qq_29364417/80965695