自定义View下雪效果
来源:互联网 发布:手机怎么设置禁用网络 编辑:程序博客网 时间:2024/05/24 16:14
飘雪成心
若干天前就想实现飘雪成心的效果,迟迟没有动手。近期闲来无事,动手写了一下,和大家分享一下。
代码比较短,就没有添加注释,望谅解!!!
下面是部分截取效果图
设计思想:
1.雪花飘落是随机的,给雪花对象一个x,和一个y,加上随机移动的方法足以。
2.由于产生雪花对象太多,性能不好,因此要复用之前产生的雪花。
3.ArrayList性能低下,最初使用了ArrayList,发现效果并不好,还总是报错(多线程对同一对象操作,加同步锁后性能太低,不加报错),因此采用一维数组。
4.中心的♥形,使用了一张图片作为数据来源,当雪花下落到♥的范围内,改变颜色,改变运动模式。
代码如下:
注意:需要在assets目录下放进去这张图片
SnowHeart.java
package com.example.snowheart;import java.io.IOException;import java.io.InputStream;import java.util.ArrayList;import java.util.Random;import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Paint;import android.util.AttributeSet;import android.view.View;public class SnowHeart extends View{private static final int MAX_SNOW_NUM=1600;private static final int ONCE_PRODUCT=2;protected static final long SLEEP_TIME=10;private InputStream is;private Bitmap img;private Paint p=new Paint();private Paint p2=new Paint();//ArrayList<Snow> snow=new ArrayList<Snow>(MAX_SNOW_NUM);效率太低,采用了数组;Snow snow[]=new Snow[MAX_SNOW_NUM+20];int num;boolean state=true;public SnowHeart(Context context, AttributeSet attrs) {super(context, attrs);init();}public void init(){p2.setColor(0xaaffaaaa);//粉红p.setColor(0xffffffff);//白色is = getClass().getResourceAsStream("/assets/heart.png");img=BitmapFactory.decodeStream(is);new Thread(){public void run() {while(state&&num<MAX_SNOW_NUM){try {Thread.sleep(SLEEP_TIME+80);}catch(Exception e) {e.printStackTrace();}for(int i=0;i<ONCE_PRODUCT;i++){snow[num++]=new Snow();}postInvalidate();}while(state){try {Thread.sleep(SLEEP_TIME);}catch(Exception e) {}postInvalidate();}};}.start();}@Overrideprotected void onDraw(Canvas canvas) {if(getHeight()>0)Snow.height=getHeight();if(getWidth()>0)Snow.width=getWidth();int cp=num;for(int i=0;i<cp;i++){float x=snow[i].x;float y=snow[i].y;canvas.drawCircle(x,y, snow[i].r, p);x-=(getWidth()-img.getWidth())/2f;y-=(getHeight()-img.getWidth())/2f;if(x<0||x>img.getWidth()-2||y<0||y>img.getHeight()-2){snow[i].move();continue;}if(img.getPixel((int)x, (int)y)==0){snow[i].move();}else{canvas.drawCircle(snow[i].x,snow[i].y, snow[i].r, p2);snow[i].slowMove();}}}public void close(){state=false;img.recycle();img=null;try {is.close();} catch (IOException e) {e.printStackTrace();}snow=null;}}class Snow{public static int width=100;public static int height=300;public final static Random rd=new Random();public final static float SNOW_R=2.5f;public final static float SNOW_MIN=1.0f;public final static float SNOW_MOVE_X=2.0f;public final static float SNOW_MOVE_Y=2.5f;public final static float SNOW_SLOW_MOVE_X=0.3f;public final static float SNOW_SLOW_MOVE_Y=0.5f;public final static int STEP=15;float x,y,r,dx,dy;int step=0;public Snow(){init();}public void init(){y=0;x=rd.nextInt(width);r=rd.nextFloat()*SNOW_R+SNOW_MIN;}public void move(){if(step<=0){step=STEP;dx=rd.nextFloat()*SNOW_MOVE_X-SNOW_MOVE_X/2f+0.05f;dy=rd.nextFloat()*SNOW_MOVE_Y;}else{step--;}x+=dx;y+=dy;if(y>=height) init();}public void slowMove(){if(step<=0){step=STEP;dx=rd.nextFloat()*SNOW_SLOW_MOVE_X-SNOW_SLOW_MOVE_X/2f;dy=rd.nextFloat()*SNOW_SLOW_MOVE_Y+0.1f;}else{step--;}y+=dy;x+=dx;if(y>=height) init();}}
MainActivity.java
package com.example.snowheart;import android.app.Activity;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;public class MainActivity extends Activity {SnowHeart sh;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);sh=(SnowHeart) findViewById(R.id.snowHeart1);}@Overrideprotected void onDestroy() {sh.close();super.onDestroy();}}
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#000" tools:context="${relativePackage}.${activityClass}" > <com.example.snowheart.SnowHeart android:id="@+id/snowHeart1" android:layout_width="match_parent" android:layout_height="match_parent" /></RelativeLayout>
0 0
- 自定义View下雪效果
- 自定义view 落叶效果
- 自定义view刮刮卡效果
- 自定义View---抽屉效果
- javascript实现下雪效果
- WPF实现下雪效果 ...
- 圣诞下雪效果
- canvas下雪效果
- 下雪了动态效果
- Android 仿下雪效果
- 实现下雪效果
- jQuery实现下雪效果
- snowStorm.js下雪效果
- andriod 自定义view动画效果
- 自定义View实现刮刮卡效果
- 自定义view之倒影效果
- 自定义View,动态波纹效果
- 自定义View-跑马灯效果
- #warning: 尚未导入平台类型:[XXXXXXX (1)]
- MySQL中优化sql语句查询常用的30种方法
- DL学习笔记【6】caffe参数调节-卷积层(convolution)
- 求学Android——1.无标题代码 2.隐式启动及其配置与参数
- DFS 深度优先遍历
- 自定义View下雪效果
- C++线程 消息队列
- Doing Homework again
- Window下Apache 源代码编译
- 2016/07/26 标识符 数据类型 运算符
- 加密和签名的区别?
- uva 10041 Vito's Family
- jQuery插件AjaxFileUpload实现ajax文件上传
- C++开源代码项目