Android 流星效果的实现
大晚上实在无聊,看着天空突然流星划过,心想,是不是也能在App上做出一个这个效果来 ,其实2年前当时用最简单的JavaScript实现过流星效果,于是乎今天也试着写了下,当时心想,网络上应该有相似的Demo,结果我并没有找到,真是一些下雪的例子,我下载过来看了一下,就是刷新View的操作,个人感觉这样做不妥,于是考虑使用SurfaceView实现
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 SurfaceViewimplements 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 抽屉效果Demo
2019独角兽企业重金招聘Python工程师标准>>> Android 抽屉效果Demo. 转载:http://www.adobex.com/android/source/detai ...
- android中倒计时动画,简单实现Android倒计时效果
本文实例为大家分享了Android倒计时效果的具体代码,供大家参考,具体内容如下 需求: a.在后台添加时,如果是今日直播,则需要添加开始时间(精确到秒): b.离开始时间超过1天,显示为:" ...
- 6 cocos2dx粒子效果,类图关系,系统原生粒子和自定义粒子效果,粒子编译器软件,爆炸粒子效果,烟花效果,火焰效果,流星效果,漩涡粒子效果,雪花效果,烟雾效果,太阳效果,下雨效果
1 粒子 示例 2 类图关系 3 系统原生粒子 CCParticleSystem 所有粒子系统的父类 CCParticleSystemPoint. CCParticleSystemQuad 点粒 ...
- 程序员表白神器。安卓程序员表白软件。程序员追女友利器=android+雪花效果+彩色气泡+心形花园+心形玫瑰花+相爱天数计时器
程序员表白神器.安卓程序员表白软件.程序员追女友利器=android+雪花效果+彩色气泡+心形花园+心形玫瑰花 +相爱天数计时器. APK下载(把这个给女朋友,她一定会高兴的):http://down ...
- android 圆角效果
android 圆角效果 最近做一个效果,要一个上边两个角为圆角,下面两个角为直角的四边形白色背景: 如下图: 这里用到了shape属性中的corners 属性, api原文中是这样: <cor ...
- php直播源码,css实现流星效果
php直播源码,css实现流星效果相关的代码 <div id="stars" style="width: 100%;height: 100vh;margin: 0; ...
- 年会酷炫抽奖,绚丽3D照片墙效果,html抽奖功能,canvas星空 流星效果
年会酷炫抽奖,绚丽3D照片墙效果,html抽奖功能,canvas星空 流星效果,抽奖功能完善,中奖人员不会再次中奖,适合10-200人抽奖活动 源码下载地址:https://download.csdn ...
- Android 3D效果的实现
系列文章目录 Android 3D效果的实现 文章目录 系列文章目录 前言 一.先看看聊天(需求) 二.实现效果 三.实现 1.通过getSystemService获得SensorManager实例对 ...
- css3星球围绕轨迹开场动画特效 带流星效果
css3星球围绕轨迹开场动画特效 带流星效果 .star 控制流星效果,角度速度可自定义 <!DOCTYPE html> <html class="two"> ...
最新文章
- QIIME 2用户文档. 14机器学习预测样品元数据分类和回归q2-sample-classifier(2018.11)
- 监听服务端口及邮件报警脚本
- 模块加载过程代码分析1
- Linux 内核抓包功能实现基础(四) 手动查找邻居缓存填充MAC地址
- 深度学习-Tensorflow2.2-图像处理{10}-UNET图像语义分割模型-24
- 在VS2003下把一个DataTable Update 到数据库
- 关于easyui的一些小知识点(1)
- 实验1 熟悉实验环境
- 深入理解 nvidia-docker 2.0
- 这样做,RMAN备份速度可提高6倍!
- 让普通用户可以kill自己用户下的session(转)
- Throwable、Error、Exception、RuntimeException 区别
- 深入理解Java虚拟机运行时数据区
- ffmpeg 最简单的转码封装mp4文件
- 简述java 内存回收机制_简单介绍Java垃圾回收机制
- Anjuta for liunx
- 【随笔】Java团长
- 去YY欢聚时代的一次面试经历
- Linux配置文件-limits.conf
- Perl面向对象编程入门