Android如何用自定義View實現(xiàn)雪花效果
效果圖

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;//風(fēng)向 >0 右邊飄 <0 左邊飄
private float vY = 5f;//下落速度 <0你的雪花要往上飄呀
private int snowCount = 50;//雪花個數(shù)
private List<SnowBean> 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;
}
以上就是Android如何用自定義View實現(xiàn)雪花效果的詳細內(nèi)容,更多關(guān)于Android自定義View雪花效果的資料請關(guān)注腳本之家其它相關(guān)文章!
- canvas雪花效果核心代碼分享
- Canvas實現(xiàn)動態(tài)的雪花效果
- jquery實現(xiàn)漫天雪花飛舞的圣誕祝福雪花效果代碼分享
- android自定義view實現(xiàn)圓周運動
- Android自定義view實現(xiàn)輸入框效果
- Android自定義View實現(xiàn)雪花特效
- Android自定義view之太極圖的實現(xiàn)教程
- Android自定義View實現(xiàn)分段選擇按鈕的實現(xiàn)代碼
- Android自定義View圓形圖片控件代碼詳解
- Android自定義View實現(xiàn)跟隨手指移動的小兔子
- Android自定義view實現(xiàn)倒計時控件
相關(guān)文章
Android中的Permission權(quán)限機制介紹
這篇文章主要介紹了Android中的Permission權(quán)限機制介紹,本文講解了權(quán)限策略、權(quán)限聲明、權(quán)限請求、獲取權(quán)限等內(nèi)容,需要的朋友可以參考下2015-04-04
Android Studio三方引用報錯但是項目可以運行的解決方案
今天小編就為大家分享一篇關(guān)于Android Studio三方引用報錯但是項目可以運行的解決方案,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-03-03
Android實現(xiàn)獲取未接來電和未讀短信數(shù)量的方法
這篇文章主要介紹了Android實現(xiàn)獲取未接來電和未讀短信數(shù)量的方法,是Android程序開發(fā)中非常常見的重要功能,需要的朋友可以參考下2014-08-08
Android編程實現(xiàn)狀態(tài)保存的方法分析
這篇文章主要介紹了Android編程實現(xiàn)狀態(tài)保存的方法,結(jié)合實例形式分析了Android狀態(tài)保存的原理、實現(xiàn)方法與相關(guān)注意事項,需要的朋友可以參考下2017-08-08
Android NestedScrolling嵌套滾動的示例代碼
這篇文章主要介紹了Android NestedScrolling嵌套滾動的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-05-05
Android筆記之:App模塊化及工程擴展的應(yīng)用
這篇文章是android開發(fā)人員的必備知識,是我特別為大家整理和總結(jié)的,不求完美,但是有用2013-04-04
Android使用Notification實現(xiàn)通知功能
這篇文章主要為大家詳細介紹了Android使用Notification實現(xiàn)通知功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-11-11
android閃關(guān)燈的開啟和關(guān)閉方法代碼實例
這篇文章主要介紹了android閃關(guān)燈的開啟和關(guān)閉方法代碼實例,本文直接給出代碼和配置實例,需要的朋友可以參考下2015-05-05
Android基于BaseExpandableListAdapter實現(xiàn)的二級列表仿通話記錄功能詳解
這篇文章主要介紹了Android基于BaseExpandableListAdapter實現(xiàn)的二級列表仿通話記錄功能,結(jié)合具體實例形式分析了Android實現(xiàn)通話記錄功能的布局與功能相關(guān)操作技巧,需要的朋友可以參考下2017-07-07

