1. 程式人生 > >使用SurfaceView實現簡單的紅包雨動畫

使用SurfaceView實現簡單的紅包雨動畫

使用SurfaceView實現簡單的紅包雨平移動畫

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;
    }

    /**
     * 是否點選在紅包區域
     * @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);
    }
}


相關推薦

使用SurfaceView實現簡單紅包動畫

使用SurfaceView實現簡單的紅包雨平移動畫 public class TranslateSurfaceView extends SurfaceView implements DrawInterface { private DrawHandler draw

QML學習之路03: 滑鼠點選視窗實現簡單的旋轉動畫

main.cpp #include <QGuiApplication> //#include <QQmlApplicationEngine> #include <QQ

CSS3 建立簡單的網頁動畫實現彈跳球動

基礎準備對於這個實現,我們需要一個簡單的 div ,並且樣式類名為 ball : HTML 程式碼: &lt;div class="ball"&gt;&lt;/div&gt; 我們將使用 Flexbox 佈局,把球放到頁面中間,尺寸為 100px * 100px,

CSS3 創建簡單的網頁動畫實現彈跳球動

lte 進入 是不是 radius 想要 ofa enter 全面 封裝 基礎準備對於這個實現,我們需要一個簡單的 div ,並且樣式類名為 ball : HTML 代碼: &lt;div class="ball"&gt;&l

css3動畫實現簡單的幻燈片效果

css3 Animation屬性        css3的animation屬性可以像Flash製作動畫一樣,通過關鍵幀控制動畫的每一步,實現複雜的動畫效果。@keyframes規則是建立動畫。 @keyframes規則內指定一個CSS樣式和動畫將逐步從目

php實現簡單的搶紅包

/** * 簡單 搶紅包 示例 */ header("Content-Type: text/html;charset=utf-8");//輸出不亂碼,你懂的 $total=10;//紅包總額

JAVA實現 簡單紅包演算法,模擬真實搶紅包

import java.math.BigDecimal; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Random; p

如何實現一個簡單的雨滴動畫?手把手告訴你

本文由雲+社群發表 目的 寫了幾個Flutter的demo,但是對Flutter的自定義view和動畫都不太瞭解,看到一個類似效果在android的實現,就嘗試用Flutter做一下。同時也是學習Flutter的自定義view和動畫相關的知識。 效果 效果動圖

SurfaceView+MediaPlayer 實現簡單的視訊播放

一、實現原理由於MediaPlayer沒有播放視訊的介面,所以需要通過SurfaceView顯示視訊。SurfaceView相當於一個容器,可以把內嵌的MediaPlayer的視訊資料顯示出來。二、實現步驟1、佈局檔案中新增SurfaceView控制元件2、通過Surface

使用canvas實現簡單動畫

大多數 Canvas 繪圖 API 都沒有定義在 <canvas> 元素本身上,而是定義在通過畫布的 getContext()獲得的一個“繪圖環境”物件上。實現如下星星的運動<!DOCTYPE html> <html> <head&g

html+css3實現簡單載入動畫,loading實現

animation:用於使用動畫animation屬性描述原始碼如下:<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport"

vue 在移動端實現紅包 (相容性好)

:class="item.cls" :data-index="index" @webkitAnimationEnd="removeDom">                    <a href='javascript:;'>                        <i :st

用css動畫寫一個下紅包的效果

紅包雨的功能相信大家都做過,不過一般都是用js計算的,閒著無聊用css的樣式寫了類似的,主要用的是css的transform和animation結合。大概程式碼邏輯: @keyframes startHB { 0% { transform: translateY(-300px); -ms

使用SurfaceView實現動畫

與自定義view繪圖進行對比:1.view繪圖沒有雙緩衝機制,而surfaceview有2.view繪圖更新時,要全部更新整張圖片,而surfaceview可以更新部分割槽域3.新執行緒無法直接更新view繪圖,需要handler配合。魚兒遊動的動畫:<?xml ver

Android用兩張圖片實現簡單動畫效果

直接在java程式碼裡寫圖片佈局,而不用XML檔案。 先宣告定義: ImageView imageviewsudubg; ImageView imageviewsudu; LinearLayout l

JavaScript 字符串拼接 & setInterval()實現簡單動畫

一次 spa bsp pan 加油 move col func prop 在學習JavaScript DOM編程藝術第十章時,遇到了一個小問題: 想要實現的最終效果:一個小方塊不斷的向下移動。 小方塊絕對定位,設置好top與left值後,寫了一個動態獲取方塊到上方距離並在

怎樣實現通過Animate硬編碼實現簡單的平移、旋轉、縮放及透明度動畫過程

以下只列出主要程式碼: [java] private ImageView scanLight; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInsta

實現簡單的旋轉動畫

簡單的實現了以上動畫,程式碼如下: public class MainActivity extends AppCompatActivity implements View.OnClickListener { private Animation animatio

JAVA 實現簡單的發紅包案例

png image bsp move span 展示 member img 代碼 1 package Demo511; 2 3 import java.util.ArrayList; 4 5 public class DemoSend { 6

利用css3的animation實現點點點loading動畫效果(二)

設置 str ack rdp 提交 ssi frame spin color box-shadow實現的打點效果 簡介 box-shadow理論上可以生成任意的圖形效果,當然也就可以實現點點點的loading效果了。 實現原理 html代碼,首先需要寫如下html代