高仿墨迹天气 白天晴天

简介

一直对墨迹天气的绚丽的场景蛮感兴趣的,趁有时间,自己就高仿了其中的一个场景,其他场景呢,也是类似的,主要是写对象的AI也就是逻辑了。

先看看效果吧,动态效果比较坑,太模糊

代码分析

来看看代码结构吧

这里使用了

public SceneSurfaceView(Context context, AttributeSet attrs) {super(context, attrs);surfaceHolder = getHolder();surfaceHolder.addCallback(this);setFocusable(true);setFocusableInTouchMode(true);this.setKeepScreenOn(true);}这就是构造方法了,实现SurfaceHolder.Callback来监听事件

@Overridepublic void surfaceCreated(SurfaceHolder holder) {Log.d("weather", "surfaceCreated");if (renderThread == null) {renderThread = new RenderThread(surfaceHolder, getContext());renderThread.start();}}在

@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {width = getMeasuredWidth();height = getMeasuredHeight();super.onMeasure(widthMeasureSpec, heightMeasureSpec);Log.d("weather", "onMeasure width=" + width + ",height=" + height);if (renderThread != null) {renderThread.setWidth(width);renderThread.setHeight(height);}}记录下测量的宽高

@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {Log.d("weather", "surfaceDestroyed");renderThread.getRenderHandler().sendEmptyMessage(1);}销毁的时候要发一个消息,具体做什么,下面在来说

下面是RenderThread源码

public class RenderThread extends Thread {private Context context;private SurfaceHolder surfaceHolder;private RenderHandler renderHandler;private Scene scene;public RenderThread(SurfaceHolder surfaceHolder, Context context) {this.context = context;this.surfaceHolder = surfaceHolder;scene = new Scene(context);//add scene/actorscene.setBg(BitmapFactory.decodeResource(context.getResources(), R.drawable.bg0_fine_day));scene.add(new BirdUp(context));scene.add(new CloudLeft(context));scene.add(new CloudRight(context));scene.add(new BirdDown(context));scene.add(new SunShine(context));}@Overridepublic void run() {Log.d("weather", "run");//在非主线程使用消息队列Looper.prepare();renderHandler = new RenderHandler();renderHandler.sendEmptyMessage(0);Looper.loop();}public RenderHandler getRenderHandler() {return renderHandler;}public class RenderHandler extends Handler {@Overridepublic void handleMessage(Message msg) {switch (msg.what) {case 0:if (scene.getWidth() != 0 && scene.getHeight() != 0) {draw();}renderHandler.sendEmptyMessage(0);break;case 1:Looper.myLooper().quit();break;}}}private void draw() {Canvas canvas = surfaceHolder.lockCanvas();if (canvas != null) {scene.draw(canvas);surfaceHolder.unlockCanvasAndPost(canvas);}}public void setWidth(int width) {scene.setWidth(width);}public void setHeight(int height) {scene.setHeight(height);}}在构造方法中添加了场景背景,上下两个鸟,左右各一个云彩和阳光。

这里在

大家再来看看RenderHandler

情况分

还记得在surfaceDestroyed中调用的退出吧,现在就在这了,呵呵

然后就是最重要的draw方法了

绘制是在Scene中操作的,来看看代码

public class Scene {private Context context;private int width;private int height;private Bitmap bg;private List<Actor> actors = new ArrayList<Actor>();private Paint paint;public Scene(Context context) {this.context = context;paint = new Paint();paint.setAntiAlias(true);}public void setBg(Bitmap bg) {this.bg = bg;}public void add(Actor actor) {actors.add(actor);}public void draw(Canvas canvas) {canvas.drawBitmap(bg, new Rect(0, 0, bg.getWidth(), bg.getHeight()), new Rect(0, 0, width, height), paint);for (Actor actor : actors) {actor.draw(canvas,width,height);}}可以在场景中绘制一个背景图和Actor列表

Actor是啥呢,就是对象呗,像鸟啊,,云啊,雨啊等等吧

public abstract class Actor {protected Context context;protected Matrix matrix = new Matrix();protected Actor(Context context) {this.context = context;}public abstract void draw(Canvas canvas, int width, int height);}这是一个抽象类,

来看看上边的那个小鸟的代码吧

public class BirdUp extends Actor {private static final int[] imgs = new int[]{R.drawable.finedayup_1, R.drawable.finedayup_2, R.drawable.finedayup_3, R.drawable.finedayup_4, R.drawable.finedayup_5, R.drawable.finedayup_6, R.drawable.finedayup_7, R.drawable.finedayup_8};float initPositionX;float initPositionY;boolean isInit;List<Bitmap> frames;RectF box;RectF targetBox;int curFrameIndex;long lastTime;Paint paint = new Paint();protected BirdUp(Context context) {super(context);frames = new ArrayList<Bitmap>();box = new RectF();targetBox = new RectF();paint.setAntiAlias(true);}@Overridepublic void draw(Canvas canvas, int width, int height) {//逻辑处理//初始化if (!isInit) {initPositionX = width * 0.117F;initPositionY = height * 0.35F;matrix.reset();matrix.postTranslate(initPositionX, initPositionY);for (int res : imgs) {frames.add(BitmapFactory.decodeResource(context.getResources(), res));}box.set(0, 0, frames.get(0).getWidth(), frames.get(0).getHeight());isInit = true;lastTime = System.currentTimeMillis();return;}//移动matrix.postTranslate(2, 0);//边界处理matrix.mapRect(targetBox, box);if (targetBox.left > width) {matrix.postTranslate(-targetBox.right, 0);}//取得帧动画图片long curTime = System.currentTimeMillis();curFrameIndex = (int) ((curTime – lastTime) / 500 % 8);Bitmap curBitmap = frames.get(curFrameIndex);//绘制canvas.save();canvas.drawBitmap(curBitmap, matrix, paint);canvas.restore();}}主要逻辑就在

这里要特别说明一个方法

好了,下面的鸟其实跟上面的逻辑一样的,只是起始位置不一样。

云彩呢,和小鸟逻辑也差不多,但是需要注意一个地方,我把云彩给放大了2倍

一个人的期望值越大,心理承受力就会越小,就越经受不住失败的打击,

高仿墨迹天气 白天晴天

相关文章:

你感兴趣的文章:

标签云: