英文原文:
這篇文章的發布日期是2023年的聖誕節,貌似唯一能與之匹配的就是就是在styling android上來點喜慶的東西。為那些不過聖誕節,或者在六月份讀這篇文章的人而寫 - 原諒我又調皮了。
那麼問題來了,怎麼才能詮釋聖誕的意義呢?最明顯的答案就是:一張戴了聖誕帽的**:
雖然我覺得這張**足以結束這篇文章了,不過我就再慷慨的來點下雪的效果吧。
<?xml version="1.0" encoding="utf-8"?>本來想在乙個自定義的imageview裡面做這件事情,但是還是選擇了把它們分開,這樣我就不需要每次重新整理動畫的時候都重新渲染一遍影象。
那麼就讓我們看看我們的自定義view:
public class snowview extends view這非常簡單。當view被resized的時候,我們初始化150個隨即放置的snowflake物件。ondraw() 方法繪製所有的snowflake物件,然後週期性的執行invalidate()。為了不完全占用ui執行緒,我們在呼叫這個的時候稍微延遲了一點點時間。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() };}
snowflake的**大致是基於 samuel arbesman的snowfall演算法:
class snowflake當每朵雪花初始化之後它被放在canvas上的乙個隨機位置。這是為了確保在首次繪製的時候,雪花看起來像是正在進行中,而如果一開始所有的雪花都是從頂部落下的話,就會覺得雪是剛開始下的。當一片雪花離開了畫布的時候,它會被重新放置在頂部橫軸的乙個隨機位置 - 這樣我們就能**雪花,避免不必要的物件建立。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繪製並不是渲染這類東西最高效的方法(比如使用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座標。通過自定義乙個函式來初始化雪花的位置。這裡需要用到隨機數的相關知識。其次,如果當雪花落下時,在雪花落的位置畫乙個雪花,模擬雪花殘留在地面上。當雪花的...