大晚上实在无聊,看着天空突然流星划过,心想,是不是也能在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 流星效果的实现相关推荐

  1. Android 抽屉效果Demo

    2019独角兽企业重金招聘Python工程师标准>>> Android 抽屉效果Demo. 转载:http://www.adobex.com/android/source/detai ...

  2. android中倒计时动画,简单实现Android倒计时效果

    本文实例为大家分享了Android倒计时效果的具体代码,供大家参考,具体内容如下 需求: a.在后台添加时,如果是今日直播,则需要添加开始时间(精确到秒): b.离开始时间超过1天,显示为:" ...

  3. 6 cocos2dx粒子效果,类图关系,系统原生粒子和自定义粒子效果,粒子编译器软件,爆炸粒子效果,烟花效果,火焰效果,流星效果,漩涡粒子效果,雪花效果,烟雾效果,太阳效果,下雨效果

     1 粒子 示例 2 类图关系 3 系统原生粒子 CCParticleSystem 所有粒子系统的父类 CCParticleSystemPoint. CCParticleSystemQuad 点粒 ...

  4. 程序员表白神器。安卓程序员表白软件。程序员追女友利器=android+雪花效果+彩色气泡+心形花园+心形玫瑰花+相爱天数计时器

    程序员表白神器.安卓程序员表白软件.程序员追女友利器=android+雪花效果+彩色气泡+心形花园+心形玫瑰花 +相爱天数计时器. APK下载(把这个给女朋友,她一定会高兴的):http://down ...

  5. android 圆角效果

    android 圆角效果 最近做一个效果,要一个上边两个角为圆角,下面两个角为直角的四边形白色背景: 如下图: 这里用到了shape属性中的corners 属性, api原文中是这样: <cor ...

  6. php直播源码,css实现流星效果

    php直播源码,css实现流星效果相关的代码 <div id="stars" style="width: 100%;height: 100vh;margin: 0; ...

  7. 年会酷炫抽奖,绚丽3D照片墙效果,html抽奖功能,canvas星空 流星效果

    年会酷炫抽奖,绚丽3D照片墙效果,html抽奖功能,canvas星空 流星效果,抽奖功能完善,中奖人员不会再次中奖,适合10-200人抽奖活动 源码下载地址:https://download.csdn ...

  8. Android 3D效果的实现

    系列文章目录 Android 3D效果的实现 文章目录 系列文章目录 前言 一.先看看聊天(需求) 二.实现效果 三.实现 1.通过getSystemService获得SensorManager实例对 ...

  9. css3星球围绕轨迹开场动画特效 带流星效果

    css3星球围绕轨迹开场动画特效 带流星效果 .star 控制流星效果,角度速度可自定义 <!DOCTYPE html> <html class="two"> ...

最新文章

  1. QIIME 2用户文档. 14机器学习预测样品元数据分类和回归q2-sample-classifier(2018.11)
  2. 监听服务端口及邮件报警脚本
  3. 模块加载过程代码分析1
  4. Linux 内核抓包功能实现基础(四) 手动查找邻居缓存填充MAC地址
  5. 深度学习-Tensorflow2.2-图像处理{10}-UNET图像语义分割模型-24
  6. 在VS2003下把一个DataTable Update 到数据库
  7. 关于easyui的一些小知识点(1)
  8. 实验1 熟悉实验环境
  9. 深入理解 nvidia-docker 2.0
  10. 这样做,RMAN备份速度可提高6倍!
  11. 让普通用户可以kill自己用户下的session(转)
  12. Throwable、Error、Exception、RuntimeException 区别
  13. 深入理解Java虚拟机运行时数据区
  14. ffmpeg 最简单的转码封装mp4文件
  15. 简述java 内存回收机制_简单介绍Java垃圾回收机制
  16. Anjuta for liunx
  17. 【随笔】Java团长
  18. 去YY欢聚时代的一次面试经历
  19. Linux配置文件-limits.conf
  20. Perl面向对象编程入门

热门文章

  1. SQL数据库基础语法总结
  2. 跨境运营培训班亚马逊产品视频如何上传
  3. 当 HR 问到你这些问题时,你该如何回答?
  4. 保姆级教程,6步学会影视解说,一个月多赚6000+
  5. AI文件怎样转为cdr格式文件(二)
  6. FreeRTOS——静态与动态内存分配
  7. [曾贤志]-Excel数据透视表与SQL技术-曾贤志-专题视频课程
  8. windows安装net4.5.2
  9. 大型旅游景区指挥调度通信系统解决方案
  10. Unable to connect to Redis无法连接到Redis