package suda.sudamodweather.widget.weather; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.RectF; import android.view.SurfaceHolder; import java.util.ArrayList; /** * Created by ghbha on 2016/5/16. */ public class RainSnowHazeView extends BaseAnimView { public RainSnowHazeView(Context context, Type type,int backColor) { super(context,backColor); this.type = type; init2(); } /** * 初始化 */ protected void init2() { rainLines = new ArrayList<>(); switch (type) { case RAIN_SNOW: case SNOW: case RAIN: for (int i = 0; i < RAIN_COUNT; i++) { rainLines.add(new RainOrSnowLine(windowWidth, windowHeight)); } break; case HAZE: for (int i = 0; i < RAIN_COUNT; i++) { rainLines.add(new HazeLine(windowWidth, windowHeight)); } break; default: for (int i = 0; i < RAIN_COUNT; i++) { rainLines.add(new RainOrSnowLine(windowWidth, windowHeight)); } break; } paint = new Paint(); paint.setStrokeWidth(3); if (paint != null) { paint.setColor(Color.WHITE); } } /** * 画子类 * * @param canvas */ @Override protected void drawSub(Canvas canvas) { paint.setShadowLayer(getFitSize(10), 0, 0, Color.WHITE); boolean rain = true; for (BaseLine rainLine : rainLines) { paint.setAlpha(rainLine.getAlpha()); if (type == Type.HAZE) { paint.setAlpha(100); RectF rect1 = new RectF(rainLine.getStartX() - getFitSize(5), rainLine.getStartY() - getFitSize(5), rainLine.getStartX() + getFitSize(5), rainLine.getStartY() + getFitSize(5)); canvas.drawArc(rect1, 0, 360, false, paint); } else if (type == Type.SNOW) { RectF rect3 = new RectF(rainLine.getStartX() - getFitSize(8), rainLine.getStartY() - getFitSize(8), rainLine.getStartX() + getFitSize(8), rainLine.getStartY() + getFitSize(8)); canvas.drawArc(rect3, 0, 360, false, paint); } else { if (type == Type.RAIN_SNOW) rain = !rain; if (rain) { paint.setShadowLayer(0, 0, 0, Color.WHITE); canvas.drawLine(rainLine.getStartX(), rainLine.getStartY(), rainLine.getStopX(), rainLine.getStopY() + getFitSize(8), paint); } else { RectF rect3 = new RectF(rainLine.getStartX() - getFitSize(8), rainLine.getStartY() - getFitSize(8), rainLine.getStartX() + getFitSize(8), rainLine.getStartY() + getFitSize(5)); canvas.drawArc(rect3, 0, 360, false, paint); } } } } /** * 动画逻辑处理 */ @Override protected void animLogic() { for (BaseLine rainLine : rainLines) { rainLine.rain(); } } @Override public void surfaceCreated(SurfaceHolder holder) { startAnim(); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @Override protected void reset() { } @Override public void surfaceDestroyed(SurfaceHolder holder) { } @Override public void run() { doLogic(); } @Override protected int sleepTime() { return 3; } public enum Type { RAIN, SNOW, RAIN_SNOW, HAZE; } //////////////////////////////////////////////////////////////// private static final int RAIN_COUNT = 60; //雨点个数 private ArrayList<BaseLine> rainLines; private Paint paint; private Type type = Type.RAIN; }