Android直播app原始碼超簡單氣泡效果
Android直播app原始碼超簡單氣泡效果實現的相關程式碼
1.1 定義氣泡
氣泡效果我們關心的屬性並不多,主要有這幾種:半徑、座標、上升速度、水平平移速度。由於我們只在 View 內部使用,因此直接建立一個內部類,然後在內部類中定義這些屬性。
private class Bubble { int radius; // 氣泡半徑 float speedY; // 上升速度 float speedX; // 平移速度 float x; // 氣泡x座標 float y; // 氣泡y座標 }
1.2 生命週期處理
由於需要用執行緒來進行計算和控制重新整理,就少不了開啟和關閉執行緒,這個自然要符合 View 的生命週期,因此我在 View 被新增到介面上時開啟了一個執行緒用於生成氣泡和重新整理氣泡位置,然後在 View 從介面上移除的時候關閉了這個執行緒。
@Override protected void onAttachedToWindow() { super.onAttachedToWindow(); startBubbleSync(); } @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); stopBubbleSync(); }
1.3 開啟執行緒
開啟執行緒非常簡單,就是簡單的建立了一個執行緒,然後在裡面添加了一個 while 死迴圈,然後不停的執行 休眠、建立氣泡、重新整理氣泡位置、申請更新UI 等操作。
這裡沒有用變數來控制迴圈,而是監聽了中斷事件,在當攔截到 InterruptedException 的時候,使用 break 跳出了死迴圈,因此執行緒也就結束了,方法簡單粗暴。
// 開始氣泡執行緒 private void startBubbleSync() { stopBubbleSync(); mBubbleThread = new Thread() { public void run() { while (true) { try { Thread.sleep(mBubbleRefreshTime); tryCreateBubble(); refreshBubbles(); postInvalidate(); } catch (InterruptedException e) { System.out.println("Bubble執行緒結束"); break; } } } }; mBubbleThread.start(); }
1.4 關閉執行緒
由於執行緒執行時監聽了 interrupt 中斷,這裡直接使用 interrupt 通知執行緒中斷就可以了。 // 停止氣泡執行緒 private void stopBubbleSync() { if (null == mBubbleThread) return; mBubbleThread.interrupt(); mBubbleThread = null; }
1.5 建立氣泡
為了防止氣泡數量過多而佔用太多的效能,因此在建立氣泡之前需要先判斷當前已經有多少個氣泡,如果已經有足夠多的氣泡了,則不再建立新的氣泡。
同時,為了讓氣泡產生過程看起來更合理,在氣泡數量沒有達到上限之前,會隨機的建立氣泡,以防止氣泡扎堆出現,因此設立了一個隨機項,生成的隨機數大於 0.95 的時候才生成氣泡,讓氣泡生成過程慢一些。
建立氣泡的過程也很簡單,就是隨機的在設定範圍內生成一些屬性,然後放到 List 中而已。
PS:這裡使用了一些硬編碼和魔數,屬於不太好的習慣。不過由於應用場景固定,這些引數需要調整的概率比較小,影響也不大。
// 嘗試建立氣泡 private void tryCreateBubble() { if (null == mContentRectF) return; if (mBubbles.size() >= mBubbleMaxSize) { return; } if (random.nextFloat() < 0.95) { return; } Bubble bubble = new Bubble(); int radius = random.nextInt(mBubbleMaxRadius - mBubbleMinRadius); radius += mBubbleMinRadius; float speedY = random.nextFloat() * mBubbleMaxSpeedY; while (speedY < 1) { speedY = random.nextFloat() * mBubbleMaxSpeedY; } bubble.radius = radius; bubble.speedY = speedY; bubble.x = mWaterRectF.centerX(); bubble.y = mWaterRectF.bottom - radius - mBottleBorder / 2; float speedX = random.nextFloat() - 0.5f; while (speedX == 0) { speedX = random.nextFloat() - 0.5f; } bubble.speedX = speedX * 2; mBubbles.add(bubble); }
以上就是Android直播app原始碼超簡單氣泡效果實現的相關程式碼, 更多內容歡迎關注之後的文章