通过自定义view实现简单的雪花飘落效果 :
public class snowFlakeView extends View {
private List<loadBean> loadBeans =new ArrayList<>();
private Paint paint;
public snowFlakeView(Context context) {
super(context);
init();
}
public snowFlakeView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init();
}
Random random = new Random();
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
for (int i = 0; i <getWidth()/3 ; i++) {
loadBean loadBean = new loadBean();
int x = random.nextInt(getWidth());
int y = random.nextInt(getHeight());
loadBean.setStartLoad(new Point(x,0));
loadBean.setNowLoad(new Point(x,y));
loadBean.setColor(Color.WHITE);
loadBean.setRadius(random.nextFloat()*6+1);
loadBean.setVelocity(random.nextInt(3)+1);
loadBeans.add(loadBean);
}
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
for (loadBean loadBean: loadBeans){
Point point = loadBean.getNowLoad();
point.y+=loadBean.getVelocity();
float randValue = random.nextFloat() *2 -0.5f;
point.x+=randValue;
if(point.y>getHeight()){
point.y = 0;
}
}
for (loadBean loadBean : loadBeans) {
paint.setColor(loadBean.getColor());
canvas.drawCircle(loadBean.getNowLoad().x, loadBean.getNowLoad().y, loadBean.getRadius(), paint);
}
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
private void init() {
paint = new Paint();
paint.setAntiAlias(true);
paint.setColor(Color.WHITE);
}
class loadBean {
//位置
private Point nowLoad;
//初始位置
private Point startLoad;
//速度
private int velocity;
//半径
private float radius;
//颜色
private int color;
public Point getNowLoad() {
return nowLoad;
}
public void setNowLoad(Point nowLoad) {
this.nowLoad = nowLoad;
}
public Point getStartLoad() {
return startLoad;
}
public void setStartLoad(Point startLoad) {
this.startLoad = startLoad;
}
public int getVelocity() {
return velocity;
}
public void setVelocity(int velocity) {
this.velocity = velocity;
}
public float getRadius() {
return radius;
}
public void setRadius(float radius) {
this.radius = radius;
}
public int getColor() {
return color;
}
public void setColor(int color) {
this.color = color;
}
}
public void startAnim(){
invalidate();
}
}