SurfaceView實(shí)現(xiàn)紅包雨平移動(dòng)畫
使用SurfaceView實(shí)現(xiàn)簡(jiǎn)單的紅包雨動(dòng)畫,供大家參考,具體內(nèi)容如下

具體代碼:SurfaceViewDemo
public class TranslateSurfaceView extends SurfaceView implements DrawInterface {
private DrawHandler drawHandler;
private int width;
private int height;
private Bitmap bitmap;
private int bitmapWidth;
private int bitmapHeight;
private Toast toast;
private int count = 0;
private ArrayList<MoveModel> moveList = new ArrayList<>();
public TranslateSurfaceView(Context context) {
this(context, null);
}
public TranslateSurfaceView(Context context, AttributeSet attrs) {
this(context, attrs, -1);
}
public TranslateSurfaceView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
SurfaceHolder holder = getHolder();
setZOrderOnTop(true);
holder.setFormat(PixelFormat.TRANSLUCENT);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
width = getMeasuredWidth();
height = getMeasuredHeight();
}
public void prepare() {
DrawThread drawThread = new DrawThread();
drawThread.start();
drawHandler = new DrawHandler(drawThread.getLooper(), this);
bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.icon_redenvelope2);
bitmapWidth = bitmap.getWidth();
bitmapHeight = bitmap.getHeight();
}
public void addMoveModel(MoveModel moveModel) {
moveList.add(moveModel);
}
public void start() {
count = 0;
moveList.clear();
for (int i = 0; i < 10; i++) {
generateModel();
}
drawHandler.sendEmptyMessage(DrawHandler.START_DRAW_KEY);
}
public void resume() {
drawHandler.sendEmptyMessage(DrawHandler.START_DRAW_KEY);
}
public void pause() {
drawHandler.sendEmptyMessage(DrawHandler.STOP_DRAW_KEY);
}
public void quit() {
if (null != bitmap) {
bitmap.recycle();
}
if (null != drawHandler) {
drawHandler.removeCallbacksAndMessages(null);
drawHandler.getLooper().quit();
}
}
@Override
public void startDraw() {
SurfaceHolder holder = getHolder();
Canvas canvas = holder.lockCanvas();
if (null == canvas) {
return;
}
Paint paint = new Paint();
paint.setAntiAlias(true);
canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
for (MoveModel moveModel : moveList) {
canvas.drawBitmap(bitmap, moveModel.x, moveModel.y, paint);
if (moveModel.x > width || moveModel.y > height) {
resetMoveModel(moveModel);
} else {
moveModel.y += moveModel.randomY;
}
}
holder.unlockCanvasAndPost(canvas);
drawHandler.sendEmptyMessage(DrawHandler.START_DRAW_KEY);
}
@Override
public void stopDraw() {
drawHandler.removeMessages(DrawHandler.START_DRAW_KEY);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
int action = event.getActionMasked();
switch (action) {
case MotionEvent.ACTION_DOWN:
checkInRect((int) event.getX(), (int) event.getY());
break;
}
return true;
}
/**
* 是否點(diǎn)擊在紅包區(qū)域
* @param x
* @param y
*/
private void checkInRect(int x, int y) {
int length = moveList.size();
for (int i = 0; i < length; i++) {
MoveModel moveModel = moveList.get(i);
Rect rect = new Rect((int) moveModel.x, (int) moveModel.y, (int) moveModel.x + bitmapWidth, (int) moveModel.y + bitmapHeight);
if (rect.contains(x, y)) {
count++;
resetMoveModel(moveModel);
if (toast == null) {
toast = Toast.makeText(getContext(), "", Toast.LENGTH_SHORT);
}
toast.setText("搶到紅包" + count);
toast.show();
break;
}
}
}
private void resetMoveModel(MoveModel moveModel) {
Random random = new Random();
moveModel.x = random.nextInt(11) * (width / 10);
moveModel.y = 0;
moveModel.randomY = (random.nextInt(5) + 2) * getResources().getDisplayMetrics().density * 1.4f;
}
private void generateModel() {
Random random = new Random();
MoveModel moveModel = new MoveModel();
moveModel.moveId = moveList.size() + 1;
moveModel.x = random.nextInt(11) * (width / 10);
moveModel.y = 0;
moveModel.randomY = (random.nextInt(5) + 2) * getResources().getDisplayMetrics().density * 1.4f;
moveList.add(moveModel);
}
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 教你一步步實(shí)現(xiàn)Android微信自動(dòng)搶紅包
- Android輔助功能AccessibilityService與搶紅包輔助
- Android實(shí)現(xiàn)QQ搶紅包插件
- Android中微信搶紅包插件原理解析及開(kāi)發(fā)思路
- Android搶紅包插件實(shí)現(xiàn)原理淺析
- Android輔助功能實(shí)現(xiàn)自動(dòng)搶紅包(附源碼)
- Android實(shí)現(xiàn)紅包雨動(dòng)畫效果
- 分享Android微信紅包插件
- Android實(shí)現(xiàn)微信自動(dòng)搶紅包的程序
- Android微信自動(dòng)搶紅包插件優(yōu)化和實(shí)現(xiàn)
相關(guān)文章
淺析Android手機(jī)衛(wèi)士之號(hào)碼歸屬地查詢
這篇文章主要介紹了淺析Android手機(jī)衛(wèi)士之號(hào)碼歸屬地查詢的相關(guān)資料,需要的朋友可以參考下2016-04-04
Android獲取當(dāng)前位置的經(jīng)緯度數(shù)據(jù)
這篇文章主要介紹了Android獲取當(dāng)前位置的經(jīng)緯度數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下2016-02-02
Android 使用SwipeRefreshLayout控件仿抖音做的視頻下拉刷新效果
這篇文章主要介紹了Android 使用SwipeRefreshLayout控件仿抖音做的視頻下拉刷新效果,需要的朋友可以參考下2018-05-05
Android ExpandableListView單選以及多選實(shí)現(xiàn)代碼
這篇文章主要為大家詳細(xì)介紹了Android ExpandableListView單選以及多選的實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06
創(chuàng)建Android守護(hù)進(jìn)程實(shí)例(底層服務(wù))
這篇文章主要介紹了創(chuàng)建Android守護(hù)進(jìn)程實(shí)例(底層服務(wù)),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03
Android中自定義控件的declare-styleable屬性重用方案
這篇文章主要介紹了Android中自定義控件的declare-styleable屬性重用方案,本文給出了一個(gè)終極重用解決方案,需要的朋友可以參考下2015-01-01
Android PopWindow 設(shè)置背景亮度的實(shí)例
這篇文章主要介紹了Android PopWindow 設(shè)置背景亮度的實(shí)例的相關(guān)資料,這里提供實(shí)現(xiàn)方法,希望能幫助有所需要的朋友,需要的朋友可以參考下2017-08-08
android BitmapFactory.Options使用方法詳解
這篇文章主要為大家詳細(xì)介紹了android BitmapFactory.Options使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01

