android桌面雪花效果代码,Android雪花特效 – 自定义View

效果图

f2ce43877286f78c6e761e35ef9111ce.png

1.SnowView 类

package com.ilz.rocketapplication.handaccount.view;

import android.content.Context;

import android.graphics.Canvas;

import android.graphics.Color;

import android.graphics.Paint;

import android.util.AttributeSet;

import android.view.GestureDetector;

import android.view.MotionEvent;

import android.widget.RelativeLayout;

import com.ilz.rocketapplication.handaccount.R;

import com.ilz.rocketapplication.handaccount.bean.SnowBean;

import com.ilz.rocketapplication.handaccount.utils.ColorUtils;

import com.ilz.rocketapplication.handaccount.utils.Tools;

import java.util.ArrayList;

import java.util.List;

import java.util.Timer;

import java.util.TimerTask;

public class SnowView extends RelativeLayout {

// private final String SNOW = "❄";

// private final String SNOW = "☀❆★❉❈❀✿❃❁";

private final String SNOW = "❄";

private float vX = 2.5f;//风向 >0 右边飘 <0 左边飘

private float vY = 5f;//下落速度 <0你的雪花要往上飘呀

private int snowCount = 50;//雪花个数

private List snowBeanList = new ArrayList<>();

private int XB = Tools.getWindowsWidth();

private int YB = Tools.getWindowsHeight();

private Paint paint = new Paint();

private Timer timer;

private boolean isStart = false;

public SnowView(Context context) {

this(context, null);

}

public SnowView(Context context, AttributeSet attrs) {

this(context, attrs, 0);

}

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

super(context, attrs, defStyleAttr);

initView();

}

private void initView() {

paint.setAntiAlias(true);

initSnowData();

}

public void start() {

if (timer == null) {

timer = new Timer();

}

isStart = true;

timer.schedule(new TimerTask() {

@Override

public void run() {

if (!isStart) return;

for (int i = 0; i < snowBeanList.size(); i++) {

snowBeanList.get(i).setX(snowBeanList.get(i).getX() + vX);

snowBeanList.get(i).setY(snowBeanList.get(i).getY() + vY);

if (snowBeanList.get(i).getX() < 0 || snowBeanList.get(i).getX() > XB) {

snowBeanList.get(i).setX(getRandomX());

}

if (snowBeanList.get(i).getY() < 0 || snowBeanList.get(i).getY() > YB) {

snowBeanList.get(i).setY(0f);

}

}

postInvalidate();

}

}, 0, 15);

}

public void resume() {

if (timer == null) {

start();

}

isStart = true;

}

public void pause(){

isStart = false;

}

public void destroy() {

isStart = false;

if (snowBeanList != null) {

snowBeanList.clear();

}

invalidate();

if (timer != null) {

timer.cancel();

timer = null;

}

}

private void initSnowData() {

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

SnowBean bean = new SnowBean();

bean.setX(getRandomX());

bean.setY(getRandomY());

bean.setSize((float) (Math.random() * 50) + 5);

snowBeanList.add(bean);

}

}

private float getRandomX() {

return (float) (Math.random() * Tools.getWindowsWidth());

}

private float getRandomY() {

return (float) (Math.random() * Tools.getWindowsHeight());

}

@Override

protected void onLayout(boolean changed, int l, int t, int r, int b) {

super.onLayout(changed, l, t, r, b);

}

@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

for (int i = 0; i < snowBeanList.size(); i++) {

SnowBean bean = snowBeanList.get(i);

paint.setTextSize(bean.getSize());

paint.setColor(bean.getColor());

canvas.drawText(SNOW, bean.getX(), bean.getY(), paint);

}

}

private GestureDetector detector = new GestureDetector(getContext(),new MyGestureDetector());

private boolean isPoint = false;

private long pointTime = 0;

@Override

public boolean onTouchEvent(MotionEvent event) {

// switch (event.getAction()) {

// case MotionEvent.ACTION_DOWN:

// pointTime = 0;

// int pCount = event.getPointerCount();

// if (pCount >= 2) {

// isPoint = true;

// pointTime = System.currentTimeMillis();

// }

// break;

// case MotionEvent.ACTION_MOVE:

// break;

// case MotionEvent.ACTION_UP:

// isPoint = false;

// pointTime = 0;

// break;

// }

// return super.onTouchEvent(event);

return detector.onTouchEvent(event);

}

private class MyGestureDetector implements GestureDetector.OnGestureListener, GestureDetector.OnDoubleTapListener {

@Override

public boolean onDown(MotionEvent e) {

return false;

}

@Override

public void onShowPress(MotionEvent e) {

}

@Override

public boolean onSingleTapUp(MotionEvent e) {

return false;

}

@Override

public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {

return false;

}

@Override

public void onLongPress(MotionEvent e) {

}

@Override

public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {

return false;

}

@Override

public boolean onSingleTapConfirmed(MotionEvent e) {

return false;

}

@Override

public boolean onDoubleTap(MotionEvent e) {

return false;

}

@Override

public boolean onDoubleTapEvent(MotionEvent e) {

return false;

}

}

}

2.SnowBean

package com.ilz.rocketapplication.handaccount.bean;

import android.graphics.Color;

import com.ilz.rocketapplication.handaccount.utils.ColorUtils;

public class SnowBean {

float x;

float y;

float size;

int color = Color.WHITE;

public float getX() {

return x;

}

public void setX(float x) {

this.x = x;

}

public float getY() {

return y;

}

public void setY(float y) {

this.y = y;

}

public float getSize() {

return size;

}

public void setSize(float size) {

this.size = size;

}

public int getColor() {

return color;

}

public void setColor(int color) {

this.color = color;

}

}

3.Tools

/**

* 获取屏幕的宽度

*/

public static int getWindowsWidth() {

WindowManager wm = (WindowManager) (MyApplication.getInstance().getSystemService(Context.WINDOW_SERVICE));

DisplayMetrics dm = new DisplayMetrics();

wm.getDefaultDisplay().getMetrics(dm);

int mScreenWidth = dm.widthPixels;

return mScreenWidth;

}

/**

* 获取屏幕的高度

*/

public static int getWindowsHeight() {

WindowManager wm = (WindowManager) (MyApplication.getInstance().getSystemService(Context.WINDOW_SERVICE));

DisplayMetrics dm = new DisplayMetrics();

wm.getDefaultDisplay().getMetrics(dm);

int mScreenHeigh = dm.heightPixels;

return mScreenHeigh;

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值