本文在实现雪花效果的基础上,根据漫天飞舞雪花,实现下雨天场景的效果,使用eclipse android 版本,具体内容如下

雪花效果图:

具体代码:

1、漫天飞舞的雪花主要代码

SnowView

package com.example.snowflake.view;

import android.content.Context;

import android.graphics.Canvas;

import android.graphics.Color;

import android.graphics.Paint;

import android.util.AttributeSet;

import android.view.View;

/**

* 雪花视图, DELAY时间重绘, 绘制NUM_SNOWFLAKES个雪花

*/

public class SnowView extends View {

private static final int NUM_SNOWFLAKES = 150; // 雪花数量

private static final int DELAY = 5; // 延迟

private SnowFlake[] mSnowFlakes; // 雪花

public SnowView(Context context) {

super(context);

}

public SnowView(Context context, AttributeSet attrs) {

super(context, attrs);

}

public SnowView(Context context, AttributeSet attrs, int defStyleAttr) {

super(context, attrs, defStyleAttr);

}

@Override

protected void onSizeChanged(int w, int h, int oldw, int oldh) {

super.onSizeChanged(w, h, oldw, oldh);

if (w != oldw || h != oldh) {

initSnow(w, h);

}

}

private void initSnow(int width, int height) {

Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); // 抗锯齿

paint.setColor(Color.WHITE); // 白色雪花

paint.setStyle(Paint.Style.FILL); // 填充;

mSnowFlakes = new SnowFlake[NUM_SNOWFLAKES];

//mSnowFlakes所有的雪花都生成放到这里面

for (int i = 0; i < NUM_SNOWFLAKES; ++i) {

mSnowFlakes[i] = SnowFlake.create(width, height, paint);

}

}

@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

//for返回SnowFlake

for (SnowFlake s : mSnowFlakes) {

//然后进行绘制

s.draw(canvas);

}

// 隔一段时间重绘一次, 动画效果

getHandler().postDelayed(runnable, DELAY);

}

// 重绘线程

private Runnable runnable = new Runnable() {

@Override

public void run() {

//自动刷新

invalidate();

}

};

}

SnowFlake

package com.example.snowflake.view;

import com.example.snowflake.RandomGenerator;

import android.graphics.Canvas;

import android.graphics.Paint;

import android.graphics.Point;

/**

* 雪花的类, 移动, 移出屏幕会重新设置位置.

*/

public class SnowFlake {

// 雪花的角度

private static final float ANGE_RANGE = 0.1f; // 角度范围

private static final float HALF_ANGLE_RANGE = ANGE_RANGE / 2f; // 一般的角度

private static final float HALF_PI = (float) Math.PI / 2f; // 半PI

private static final float ANGLE_SEED = 25f; // 角度随机种子

private static final float ANGLE_DIVISOR = 10000f;

// 雪花的移动速度

private static final float INCREMENT_LOWER = 2f;

private static final float INCREMENT_UPPER = 4f;

// 雪花的大小

private static final float FLAKE_SIZE_LOWER = 7f;

private static final float FLAKE_SIZE_UPPER = 20f;

private final RandomGenerator mRandom; // 随机控制器

private final Point mPosition; // 雪花位置

private float mAngle; // 角度

private final float mIncrement; // 雪花的速度

private final float mFlakeSize; // 雪花的大小

private final Paint mPaint; // 画笔

private SnowFlake(RandomGenerator random, Point position, float angle, float increment, float flakeSize, Paint paint) {

mRandom = random;

mPosition = position;

mIncrement = increment;

mFlakeSize = flakeSize;

mPaint = paint;

mAngle = angle;

}

public static SnowFlake create(int width, int height, Paint paint) {

RandomGenerator random = new RandomGenerator();

int x = random.getRandom(width);

int y = random.getRandom(height);

Point position = new Point(x, y);

float angle = random.getRandom(ANGLE_SEED) / ANGLE_SEED * ANGE_RANGE + HALF_PI - HALF_ANGLE_RANGE;

float increment = random.getRandom(INCREMENT_LOWER, INCREMENT_UPPER);

float flakeSize = random.getRandom(FLAKE_SIZE_LOWER, FLAKE_SIZE_UPPER);

return new SnowFlake(random, position, angle, increment, flakeSize, paint);

}

// 绘制雪花

public void draw(Canvas canvas) {

int width = canvas.getWidth();

int height = canvas.getHeight();

move(width, height);

canvas.drawCircle(mPosition.x, mPosition.y, mFlakeSize, mPaint);

}

// 移动雪花

private void move(int width, int height) {

//x水平方向,那么需要晃动,主要设置这个值就可以,现在取消晃动了

//如果 mPosition.x不加上后面那个值,就不会晃动了

double x = mPosition.x + (mIncrement * Math.cos(mAngle));

//y是竖直方向,就是下落

double y = mPosition.y + (mIncrement * Math.sin(mAngle));

mAngle += mRandom.getRandom(-ANGLE_SEED, ANGLE_SEED) / ANGLE_DIVISOR;

//这个是设置雪花位置,如果在很短时间内刷新一次,就是连起来的动画效果

mPosition.set((int) x, (int) y);

// 移除屏幕, 重新开始

if (!isInside(width, height)) {

// 重置雪花

reset(width);

}

}

// 判断是否在其中

private boolean isInside(int width, int height) {

int x = mPosition.x;

int y = mPosition.y;

return x > mFlakeSize -5 && x + mFlakeSize <= width && y >= -mFlakeSize - 1 && y - mFlakeSize < height;

}

// 重置雪花

private void reset(int width) {

mPosition.x = mRandom.getRandom(width);

mPosition.y = (int) (-mFlakeSize - 1); // 最上面

mAngle = mRandom.getRandom(ANGLE_SEED) / ANGLE_SEED * ANGE_RANGE + HALF_PI - HALF_ANGLE_RANGE;

}

}

2、实现下雨天效果代码

RainView

package com.example.raindrop.view;

import com.example.raindrop.R;

import android.content.Context;

import android.graphics.Canvas;

import android.graphics.Paint;

import android.util.AttributeSet;

import android.view.View;

/**

* 雨滴视图, DELAY时间重绘, 绘制NUM_SNOWFLAKES个雨滴

*/

public class RainView extends View {

private static final int NUM_SNOWFLAKES = 150; // 雨滴数量

private static final int DELAY = 5; // 延迟

private RainFlake[] mSnowFlakes; // 雨滴

public RainView(Context context) {

super(context);

}

public RainView(Context context, AttributeSet attrs) {

super(context, attrs);

}

public RainView(Context context, AttributeSet attrs, int defStyleAttr) {

super(context, attrs, defStyleAttr);

}

@Override

protected void onSizeChanged(int w, int h, int oldw, int oldh) {

super.onSizeChanged(w, h, oldw, oldh);

if (w != oldw || h != oldh) {

initSnow(w, h);

}

}

private void initSnow(int width, int height) {

Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); // 抗锯齿

paint.setColor(getResources().getColor(R.color.colorWater)); // 雨滴的颜色

paint.setStyle(Paint.Style.FILL); // 填充;

mSnowFlakes = new RainFlake[NUM_SNOWFLAKES];

//mSnowFlakes所有的雨滴都生成放到这里面

for (int i = 0; i < NUM_SNOWFLAKES; ++i) {

mSnowFlakes[i] = RainFlake.create(width, height, paint);

}

}

@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

//for返回SnowFlake

for (RainFlake s : mSnowFlakes) {

//然后进行绘制

s.draw(canvas);

}

// 隔一段时间重绘一次, 动画效果

getHandler().postDelayed(runnable, DELAY);

}

// 重绘线程

private Runnable runnable = new Runnable() {

@Override

public void run() {

//自动刷新

invalidate();

}

};

}

RainFlake

package com.example.raindrop.view;

import com.example.raindrop.RandomGenerator;

import android.graphics.Canvas;

import android.graphics.Paint;

/**

* 雨滴的类, 移动, 移出屏幕会重新设置位置.

*/

public class RainFlake {

// 雨滴的移动速度

private static final float INCREMENT_LOWER = 6f;

private static final float INCREMENT_UPPER = 8f;

// 雨滴的大小

private static final float FLAKE_SIZE_LOWER = 2f;

private static final float FLAKE_SIZE_UPPER = 5f;

private final float mIncrement; // 雨滴的速度

private final float mFlakeSize; // 雨滴的大小

private final Paint mPaint; // 画笔

private Line mLine; // 雨滴

private RandomGenerator mRandom;

private RainFlake(RandomGenerator random,Line line, float increment, float flakeSize, Paint paint) {

mRandom = random;

mLine = line;

mIncrement = increment;

mFlakeSize = flakeSize;

mPaint = paint;

}

//生成雨滴

public static RainFlake create(int width, int height, Paint paint) {

RandomGenerator random = new RandomGenerator();

int [] nline;

nline = random.getLine(width, height);

Line line = new Line(nline[0], nline[1], nline[2], nline[3]);

float increment = random.getRandom(INCREMENT_LOWER, INCREMENT_UPPER);

float flakeSize = random.getRandom(FLAKE_SIZE_LOWER, FLAKE_SIZE_UPPER);

return new RainFlake(random,line, increment, flakeSize, paint);

}

// 绘制雨滴

public void draw(Canvas canvas) {

int width = canvas.getWidth();

int height = canvas.getHeight();

drawLine(canvas, width, height);

}

/**

* 改成线条,类似于雨滴效果

* @param canvas

* @param width

* @param height

*/

private void drawLine(Canvas canvas, int width, int height) {

//设置线宽

mPaint.setStrokeWidth(mFlakeSize);

//y是竖直方向,就是下落

double y1 = mLine.y1 + (mIncrement * Math.sin(1.5));

double y2 = mLine.y2 + (mIncrement * Math.sin(1.5));

//这个是设置雨滴位置,如果在很短时间内刷新一次,就是连起来的动画效果

mLine.set(mLine.x1,(int) y1,mLine.x2 ,(int) y2);

if (!isInsideLine(height)) {

resetLine(width,height);

}

canvas.drawLine(mLine.x1, mLine.y1, mLine.x2, mLine.y2, mPaint);

}

// 判断是否在其中

private boolean isInsideLine(int height) {

return mLine.y1 < height && mLine.y2 < height;

}

// 重置雨滴

private void resetLine(int width, int height) {

int [] nline;

nline = mRandom.getLine(width, height);

mLine.x1 = nline[0];

mLine.y1 = nline[1];

mLine.x2 = nline[2];

mLine.y2 = nline[3];

}

}

雨滴效果图:

以上就是本文的全部内容,帮助大家轻松实现浪漫的雪花雨滴效果,大家可以把效果运用到自己的项目中,希望大家喜欢。

android桌面雪花效果代码,Android营造雪花和雨滴浪漫效果相关推荐

  1. Android桌面悬浮窗进阶,QQ手机管家小火箭效果实现

    这次我们将代码的重点放在火箭升空的效果上,因此简单起见,就直接在模仿360手机卫士悬浮窗的那份代码的基础上继续开发了,如果你还没有看过那篇文章的话,建议先去阅读 Android桌面悬浮窗效果实现,仿3 ...

  2. android 仿ios动画效果代码,Android仿IOS上拉下拉弹性效果的实例代码

    用过iphone的朋友相信都体验过页面上拉下拉有一个弹性的效果,使用起来用户体验很好:Android并没有给我们封装这样一个效果,我们来看下在Android里如何实现这个效果.先看效果,感觉有些时候还 ...

  3. Android微信通讯录界面代码,Android中使用Expandablelistview实现微信通讯录界面

    之前的博文<Android 中使用ExpandableListView 实现分组的实例>我简单介绍了使用ExpandableListView实现简单的好友分组功能,今天我们针对之前的所做的 ...

  4. Android运行ListView的代码,Android ListView组件详解及示例代码

    Android 列表组件 ListView 列表组件是开发中经常用到组件,使用该组件在使用时需要为它提供适配器,由适配器提供来确定显示样式和显示数据. 下面看一个例子: 新建一个项目Lesson8_L ...

  5. android html 字体颜色代码,Android TextView通过解析html显示不同颜色和大小

    先贴一张效果图 效果 介绍 通过SpannableString.SpannableStringBuilder可以很方便的给TextView加上各种各样的样式,比如不同的颜色和大小,这里就不多说了,具体 ...

  6. android 图片变颜色代码,Android -对图片Drawable进行变色

    Android 图片DrawableCompat利用setTint()对图片Drawable进行变色 1.利用color资源对Drawable变色 Drawable对象的来源不限制,可以是从资源get ...

  7. opengl android 纹理贴图 代码,Android 使用opengl es的纹理贴图白屏问题请教。

    各位大侠好: 我在使用open gl es的做显示的时候,发现一个问题,请各位帮助一下,谢谢. 环境:opengl es 1.x,2D的模式显示纹理图片. 在LG-P990,HTC-C510E上显示附 ...

  8. android下拉框代码,Android下拉列表spinner的实例代码

    spinner组件有点类型于HTML中的下拉框的样子,让用户每次从下拉框中选取一个,本文为大家分享了Android下拉列表spinner的具体实现代码,供大家参考,具体内容如下 mian.xml xm ...

  9. android实时监控屏幕代码,Android 屏幕切换监听的实例代码

    昨天,我试着在屏幕切换时,使View显示在不同的位置,在网上搜索了一些资料,自己做了一段时间,终于完成了功能. 由于屏幕切换会调用activity的各个生命周期,所以需要在manifest的activ ...

最新文章

  1. [导入]Actual Windows Manager 3.7
  2. MongoDB记录操作日志的Base类实现
  3. 我是怎么通过技术白手起家创业 续2
  4. Java经典逻辑编程题(不死神兔问题)
  5. 用最少数量的箭引爆气球
  6. 为 Angular service 注册 provider 的三种方式
  7. 在ARM Linux下使用GPIO模拟SPI时序详解
  8. 《DOS命令全集(中英文对照)》CHM版.CHM
  9. IntelliJ IDEA 最常用配置详细图解,新手入门必看
  10. linux netfilter 过滤数据包,Netfilter-iptabes报文过滤框架(一)
  11. Fleet究竟是什么?为什么最近这么火~
  12. 使用Pixel Bender Toolkit制作特效——给过滤器增加参数(Part 3)
  13. Win下JDK的安装和简单使用教程
  14. 通过《Java核心编程》探索程序设计
  15. 手机数控模拟器安卓版_CNC模拟器安卓中文版下载
  16. 软件发明专利实例_软件系统专利申请案例
  17. Chrome主页为360首页
  18. 小猪短租网多个价格的查找,requests库,o( ̄ヘ ̄o#)bs4库的简单使用
  19. 东原罗韶颖:城市深耕中的社区商业逻辑
  20. 电脑下载速度一快电脑就卡的问题解决

热门文章

  1. 解决java编译错误( 程序包javax.servlet不存在javax.servlet.*)
  2. 朴素贝叶斯模型简单理解
  3. 装机必备,四款良心软件释放你的电脑潜力,用了就离不开
  4. 计算机与现代化在线投稿,计算机与现代化审稿周期
  5. 太爽了!花了6个月18天,达内Java培优百度网盘
  6. python实现利用留数定理分解分式多项式
  7. 【译文】MapReduce:大型集群上的简化数据处理
  8. Python爬取猫眼电影数据并对其进行数据可视化
  9. Scipy.sparse中coo_matrix、csc_matrix、csr_matrix、lil_matrix区别与特点
  10. 华为鸿蒙系统提升,首个华为鸿蒙2.0续航测试来了!实打实10%提升