91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

在Android開發中如何實現花瓣飄落效果

發布時間:2022-02-25 14:40:58 來源:億速云 閱讀:169 作者:小新 欄目:開發技術

這篇文章給大家分享的是有關在Android開發中如何實現花瓣飄落效果的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

實現步驟

1.定義變量將變量初始化

    private SurfaceHolder mHolder;
    private boolean mFlag = true;//繪制小花線程的開關標志
    private ArrayList<PointF> mFlowers;//小花點的坐標集合
    private Random mRandom;//負責隨機數生成
    private Bitmap mBitmap;//小花的圖案

    public FlowerView(Context context) {
        super(context);
        init();
    }

    public FlowerView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public FlowerView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }
    private void init(){
        mHolder = getHolder();
        mHolder.addCallback(this);
        //設置背景透明
        this.setZOrderOnTop(true);
        mHolder.setFormat(PixelFormat.TRANSLUCENT);

        mFlowers = new ArrayList<>();
        mRandom = new Random();

        mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_hua);

    }

2.實現添加花朵坐標點的方法

/**
     * 添加花朵
     */
    private void addFlower(){
        PointF point = new PointF();
        point.x=mRandom.nextInt(getWidth());//根據控件寬度隨機生成X軸坐標
        point.y=-mBitmap.getHeight();//縱坐標設置為小花圖像的負值(產生從屏幕外進入的效果)
        mFlowers.add(point);//將坐標點添加進集合
    }

3.實現SurfaceHolder.Callback及Runnable接口

public class FlowerView extends SurfaceView implements SurfaceHolder.Callback,Runnable

4.在run方法中實現繪制邏輯

 @Override
    public void run() {
        while (mFlag){
            try {
                Thread.sleep(80);//控制小花的下落速度
                Canvas canvas = mHolder.lockCanvas();
                PointF pointF = null;
                //清屏操作(否則會殘留一些無用圖像)
                if(canvas!=null){
                    canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
                }else {
                    continue;
                }
                for(PointF point: mFlowers){
                    pointF = point;
                    canvas.drawBitmap(mBitmap,pointF.x,pointF.y,null);
                    int i = mRandom.nextInt(getHeight()/50)+getHeight()/50;//修改雨滴線的縱坐標,使其看起來在下雨
                    pointF.y=pointF.y+i;
                }
                mHolder.unlockCanvasAndPost(canvas);
                addFlower();
                //當繪制點的縱坐標大于控件高度時,將該點移除
                if(mFlowers.size()>0&&pointF!=null&&pointF.y>=getHeight()){
                    mFlowers.remove(pointF);
                }

            }catch (Exception e){}
        }
    }

5.在SurfaceHolder.Callback的回調方法中開啟繪制線程

 @Override
    public void surfaceCreated(SurfaceHolder holder) {
        mFlag = true;//surface創建時將線程開關打開
        new Thread(this).start();//開啟線程繪制
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        mFlowers.clear();//當控件發生改變時清除之前的繪制點
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        mFlag = false;//當surface銷毀時關掉繪制線程
    }

完整代碼展示

public class FlowerView extends SurfaceView implements SurfaceHolder.Callback,Runnable{
    private SurfaceHolder mHolder;
    private boolean mFlag = true;//繪制小花線程的開關標志
    private ArrayList<PointF> mFlowers;//小花點的坐標集合
    private Random mRandom;//負責隨機數生成
    private Bitmap mBitmap;//小花的圖案

    public FlowerView(Context context) {
        super(context);
        init();
    }

    public FlowerView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public FlowerView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }
    private void init(){
        mHolder = getHolder();
        mHolder.addCallback(this);
        //設置背景透明
        this.setZOrderOnTop(true);
        mHolder.setFormat(PixelFormat.TRANSLUCENT);

        mFlowers = new ArrayList<>();
        mRandom = new Random();

        mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_hua);

    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        mFlag = true;
        new Thread(this).start();
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        mFlowers.clear();
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        mFlag = false;
    }

    @Override
    public void run() {
        while (mFlag){
            try {
                Thread.sleep(80);
                Canvas canvas = mHolder.lockCanvas();
                PointF pointF = null;
                //清屏操作
                if(canvas!=null){
                    canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
                }else {
                    continue;
                }
                for(PointF point: mFlowers){
                    pointF = point;
                    canvas.drawBitmap(mBitmap,pointF.x,pointF.y,null);
                    int i = mRandom.nextInt(getHeight()/50)+getHeight()/50;//修改雨滴線的縱坐標,使其看起來在下雨
                    pointF.y=pointF.y+i;
                }
                mHolder.unlockCanvasAndPost(canvas);
                addFlower();
                if(mFlowers.size()>0&&pointF!=null&&pointF.y>=getHeight()){
                    mFlowers.remove(pointF);
                }

            }catch (Exception e){}
        }
    }

    /**
     * 添加花朵
     */
    private void addFlower(){
        PointF point = new PointF();
        point.x=mRandom.nextInt(getWidth());
        point.y=-mBitmap.getHeight();
        mFlowers.add(point);
    }
}

感謝各位的閱讀!關于“在Android開發中如何實現花瓣飄落效果”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

南召县| 突泉县| 连云港市| 永善县| 阿坝| 安化县| 三河市| 萨嘎县| 蓬溪县| 东辽县| 天等县| 灵台县| 绥滨县| 宝兴县| 秦安县| 永泰县| 宁阳县| 阆中市| 新龙县| 沙坪坝区| 高碑店市| 云和县| 高密市| 嘉禾县| 德州市| 宝山区| 汾阳市| 阿克| 文昌市| 阳朔县| 石楼县| 库尔勒市| 普兰县| 双牌县| 陈巴尔虎旗| 阳原县| 双柏县| 绥中县| 仁怀市| 化隆| 惠州市|