自定义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
原创粉丝点击