Android实战简易教程-第六十九枪(自定义控件实现雪花飘落效果)
现在APP要求越来越高了,不只是要求实现功能,颜值的要求也越来越高,下面我们通过自定义控件来实现雪花飘落的效果,可以作为界面背景哦。
1.自定义控件:
- package com.test.a;
- import java.util.Random;
- import android.content.Context;
- import android.content.res.Resources;
- import android.graphics.Bitmap;
- import android.graphics.Canvas;
- import android.graphics.Matrix;
- import android.graphics.Paint;
- import android.graphics.drawable.BitmapDrawable;
- import android.util.AttributeSet;
- import android.view.View;
- public class FlowerView extends View {
- Bitmap mFlowers = null;
- MyFlower flowers [] = new MyFlower[50];//50片雪花
- private Integer[] offsetX ;
- private Integer[] offsetY ;
- Random r = new Random();
- Matrix m = new Matrix();
- Paint p = new Paint();
- int mW = 480;
- int mH = 800;
- float de = 0f;
- public void setWH(int pW, int pH, float de){
- this.mW = pW;
- this.mH = pH;
- this.de = de;
- System.out.println("de ---->" + de);
- offsetX = new Integer[]{(int)(2*de), (int)(-2*de), (int)(-1*de), 0, (int)(1*de), (int)(2*de), (int)(1*de)};
- offsetY = new Integer[]{(int)(3*de), (int)(5*de), (int)(5*de), (int)(3*de), (int)(4*de)};
- }
- public FlowerView(Context context) {
- super(context);
- }
- public FlowerView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- }
- public FlowerView(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
- @Override
- protected void onDraw(Canvas canvas) {
- super.onDraw(canvas);
- for (int i = 0; i < flowers.length; i++) {
- MyFlower rect = flowers[i];
- int t = rect.t;
- t--;
- if (t <= 0) {
- rect.y += rect.g;
- canvas.save();
- m.reset();
- m.setScale(rect.s, rect.s);
- canvas.setMatrix(m);
- p.setAlpha(rect.a);
- canvas.drawBitmap(mFlowers, rect.x, rect.y, p);
- canvas.restore();
- }
- rect.t = t;
- if (rect.y >= mH) {
- rect.init();
- }
- if (rect.x >= mW || rect.x < - 20) {
- rect.init();
- }
- flowers[i] = rect;
- }
- }
- public void loadFlower(){
- Resources r = this.getContext().getResources();
- mFlowers = ((BitmapDrawable)r.getDrawable(R.drawable.snow)).getBitmap();
- }
- public void recly(){
- if (mFlowers != null && !mFlowers.isRecycled()) {
- mFlowers.recycle();
- }
- }
- public void addRect(){
- for (int i = 0; i < flowers.length; i++) {
- flowers[i] = new MyFlower();
- }
- }
- public void inva(){
- invalidate();
- }
- class MyFlower{
- int x;
- int y;
- float s;
- int a;
- int t;
- int g;
- public void init(){
- float aa = r.nextFloat();
- this.x = r.nextInt(mW - 80) + 80;
- this.y = 0;
- if (aa >= 1) {
- this.s = 1.1f;
- }else if (aa <= 0.2) {
- this.s = 0.4f;
- }else{
- this.s = aa;
- }
- this.a = r.nextInt(155) + 100;
- this.t = r.nextInt(105) + 1;
- this.g = offsetY[r.nextInt(4)];
- }
- public MyFlower(){
- super();
- init();
- }
- }
- }
2.布局:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:orientation="vertical" >
- <com.test.a.FlowerView
- android:id="@+id/flowerview"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent" >
- </com.test.a.FlowerView>
- </LinearLayout>
- package com.test.a;
- import java.util.Timer;
- import java.util.TimerTask;
- import android.app.Activity;
- import android.os.Bundle;
- import android.os.Handler;
- import android.os.Message;
- import android.util.DisplayMetrics;
- public class MainActivity extends Activity {
- /** Called when the activity is first created. */
- private FlowerView mFlowerView;
- // 屏幕宽度
- public static int screenWidth;
- // 屏幕高度
- public static int screenHeight;
- Timer myTimer = null;
- TimerTask mTask = null;
- private static final int SNOW_BLOCK = 1;
- private Handler mHandler = new Handler() {
- public void dispatchMessage(Message msg) {
- mFlowerView.inva();
- };
- };
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- mFlowerView = (FlowerView) findViewById(R.id.flowerview);
- screenWidth = getWindow().getWindowManager().getDefaultDisplay()
- .getWidth();//获取屏幕宽度
- screenHeight = getWindow().getWindowManager().getDefaultDisplay()
- .getHeight();//获取屏幕高度
- DisplayMetrics dis = new DisplayMetrics();
- getWindowManager().getDefaultDisplay().getMetrics(dis);
- float de = dis.density;
- mFlowerView.setWH(screenWidth, screenHeight, de);
- mFlowerView.loadFlower();
- mFlowerView.addRect();
- myTimer = new Timer();
- mTask = new TimerTask() {
- @Override
- public void run() {
- Message msg = new Message();
- msg.what = SNOW_BLOCK;
- mHandler.sendMessage(msg);
- }
- };
- myTimer.schedule(mTask, 3000, 10);
- }
- @Override
- protected void onDestroy() {
- // TODO Auto-generated method stub
- super.onDestroy();
- mFlowerView.recly();
- }
- }
运行实例如下:
喜欢的朋友请关注我!