Android 流星效果的实现
2016-06-11 03:13
337 查看
大晚上实在无聊,看着天空突然流星划过,心想,是不是也能在App上做出一个这个效果来 ,其实2年前当时用最简单的JavaScript实现过流星效果,于是乎今天也试着写了下,当时心想,网络上应该有相似的Demo,结果我并没有找到,真是一些下雪的例子,我下载过来看了一下,就是刷新View的操作,个人感觉这样做不妥,于是考虑使用SurfaceView实现
SurfaceView的使用我就不介绍了,百度一大把
直接看代码吧 理解起来也很简单 只有一个View
demo下载地址 http://download.csdn.net/detail/u010192548/9546043
SurfaceView的使用我就不介绍了,百度一大把
直接看代码吧 理解起来也很简单 只有一个View
demo下载地址 http://download.csdn.net/detail/u010192548/9546043
package itxwy.vacationdemo; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.PorterDuff; import android.graphics.PorterDuffXfermode; import android.util.AttributeSet; import android.util.DisplayMetrics; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.WindowManager; import java.util.ArrayList; import java.util.List; import java.util.Random; /** * 绘画View * author True Lies * Created by Administrator on 2016/6/11. */ public class MeteorView extends SurfaceView implements SurfaceHolder.Callback { private SurfaceHolder mSurfaceHolder = null; private boolean isThreadOpen = false; private Bitmap mMeteorBmp = null; private List<MeteorAddressModule> mMeteorAddressModuleArray = new ArrayList<MeteorAddressModule>(); private Random mRandom = new Random(); private Paint mPaint = new Paint(); public MeteorView(Context context) { this(context, null); } public MeteorView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public MeteorView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(context); } private void init(Context mContext) { WindowManager windowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE); DisplayMetrics displayMetrics = new DisplayMetrics(); windowManager.getDefaultDisplay().getMetrics(displayMetrics); App.SCREEN_WIDTH = displayMetrics.widthPixels; App.SCREEN_HEIGHT = displayMetrics.heightPixels; mSurfaceHolder = getHolder(); mSurfaceHolder.addCallback(this);//事件添加 } private class DrawThread extends Thread { private SurfaceHolder mSurfaceHolder; public boolean isRun; public DrawThread(SurfaceHolder holder) { this.mSurfaceHolder = holder; isRun = true; for (int i = 0; i < 10; i++) { float mX = mRandom.nextInt(App.SCREEN_WIDTH); float mY = mRandom.nextInt(500); MeteorAddressModule meteorAddressModule = new MeteorAddressModule(); meteorAddressModule.setmX(mX); meteorAddressModule.setmY(mY); mMeteorAddressModuleArray.add(meteorAddressModule); } } @Override public void run() { Canvas mCanvas = null; while (isRun) { try { synchronized (mSurfaceHolder) { mCanvas = mSurfaceHolder.lockCanvas(); //下面三句段代码 重置画板的作用 先清除xfermode对象再设置 mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); mCanvas.drawPaint(mPaint); mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC)); for (int i = 0; i < mMeteorAddressModuleArray.size(); i++) { Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.meteor); MeteorAddressModule meteorAddressModule = mMeteorAddressModuleArray.get(i); meteorAddressModule.setmX(meteorAddressModule.getmX()-5); meteorAddressModule.setmY(meteorAddressModule.getmY()+5); System.out.println(meteorAddressModule.getmX()+"x"); System.out.println(meteorAddressModule.getmY()+"y"); mCanvas.drawBitmap(bitmap, meteorAddressModule.getmX(), meteorAddressModule.getmY(), mPaint); if(meteorAddressModule.getmX()<0||meteorAddressModule.getmY()>App.SCREEN_HEIGHT){ if(!bitmap.isRecycled()){ bitmap.recycle(); } mMeteorAddressModuleArray.remove(meteorAddressModule); } } if(mMeteorAddressModuleArray.size()<=0){ isRun = false; } } } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } finally { if(mCanvas!=null){ mSurfaceHolder.unlockCanvasAndPost(mCanvas); } } } } } //绘画事件 @Override public void surfaceCreated(SurfaceHolder holder) {//surface创建的时候 DrawThread mDrawThread = new DrawThread(mSurfaceHolder); mDrawThread.start(); isThreadOpen = true; } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {//surfaceView改变的时候 } @Override public void surfaceDestroyed(SurfaceHolder holder) {//surfaceView销毁的时候 isThreadOpen = false; }
相关文章推荐
- Android 布局开发之百分比布局、弹性布局
- Android手机平板两不误,使用Fragment实现兼容手机和平板的程序
- Android View工作机制(2)—measure过程 上
- Android View工作机制(1)—基本知识点
- Android联系人搜索之LoaderCallbacks
- Fragment基础解析
- 使用Hierarchy Viewer
- Android 官方资料
- Android-数据存储1
- English short country names
- 安卓实现手机sim卡的绑定与监听
- Android 轻松实现仿淘宝地区选择
- Android数据库新王者-Realm入门教程
- Android消息机制剖析—Looper篇
- Android中的sqlite个人的理解
- Android中的sqlite个人的理解
- Android中的sqlite个人的理解
- Android中的sqlite个人的理解
- Handler机制详解
- android /system/vold源码分析(6)