實現雪花飛舞效果

2021-07-09 17:04:07 字數 1907 閱讀 7629

英文原文:

這篇文章的發布日期是2023年的聖誕節,貌似唯一能與之匹配的就是就是在styling android上來點喜慶的東西。為那些不過聖誕節,或者在六月份讀這篇文章的人而寫 - 原諒我又調皮了。

那麼問題來了,怎麼才能詮釋聖誕的意義呢?最明顯的答案就是:一張戴了聖誕帽的**:

雖然我覺得這張**足以結束這篇文章了,不過我就再慷慨的來點下雪的效果吧。

<?xml  version="1.0" encoding="utf-8"?>

本來想在乙個自定義的imageview裡面做這件事情,但是還是選擇了把它們分開,這樣我就不需要每次重新整理動畫的時候都重新渲染一遍影象。

那麼就讓我們看看我們的自定義view:

public class snowview extends view 

public snowview(context context, attributeset attrs) 

public snowview(context context, attributeset attrs, int defstyleattr) 

protected void resize(int width, int height) 

}@override

protected void onsizechanged(int w, int h, int oldw, int oldh) 

}@override

protected void ondraw(canvas canvas) 

gethandler().postdelayed(runnable, delay);

}private runnable runnable = new runnable() };}

這非常簡單。當view被resized的時候,我們初始化150個隨即放置的snowflake物件。ondraw() 方法繪製所有的snowflake物件,然後週期性的執行invalidate()。為了不完全占用ui執行緒,我們在呼叫這個的時候稍微延遲了一點點時間。

snowflake的**大致是基於 samuel arbesman的snowfall演算法:

class snowflake 

snowflake(random random, point position, float angle, float increment, float flakesize, paint paint) 

private void move(int width, int height) 

}private boolean isinside(int width, int height) 

private void reset(int width) 

public void draw(canvas canvas) 

}

當每朵雪花初始化之後它被放在canvas上的乙個隨機位置。這是為了確保在首次繪製的時候,雪花看起來像是正在進行中,而如果一開始所有的雪花都是從頂部落下的話,就會覺得雪是剛開始下的。當一片雪花離開了畫布的時候,它會被重新放置在頂部橫軸的乙個隨機位置 - 這樣我們就能**雪花,避免不必要的物件建立。

繪製每一幀的時候,我們首先為雪花的移動新增一些隨機因素來模擬風吹的效果,讓每片雪花稍微改變下自己的方向。然後在實際繪製雪花之前,我們執行邊界檢查(如果必要,把它移到上方)。

所有的常量都經過調整,知道雪花模擬達到我滿意的效果為止。

執行效果如下:

當然,在canvas繪製並不是渲染這類東西最高效的方法(比如使用opengl渲染),但是我還有禮物要開啟,還有火雞要吃所以這個只能改天再說了。

本文的源**在這裡。

作者  mark allison。最初發表在 styling android。

Qt實現櫻花飛舞效果

應女友要求,使用qt做了乙個在電腦桌面櫻花飛舞的小程式。這裡面用到了qt動畫效果qpropertyanimation類來控制飛舞效果。使用label載入櫻花圖案。大概的核心 如下 widget widget qwidget parent qwidget parent timer new qtimer...

CAEmitterLayer實現雪花效果

如果大家突然需要乙個雪花效果,我相信大部分人的第一反應是使用定時器建立大量的imageview物件,然後給每個imageview物件新增動畫。這種做法一方面操作複雜,一方面效能方面堪憂.既然現在大家都了解了caemitterlayer引擎,因此下面使用caemitterlayer引擎實現這個效果,看...

c語言 easyx實現飄雪花效果

首先,需要設定雪花在乙個視窗中的總數目,這個關係到雪花的空間密度。假定有20個雪花。就需要兩個陣列,分別為x 20 y 20 來分別記錄x座標和y座標。通過自定義乙個函式來初始化雪花的位置。這裡需要用到隨機數的相關知識。其次,如果當雪花落下時,在雪花落的位置畫乙個雪花,模擬雪花殘留在地面上。當雪花的...