安卓自定義View在bitmap中玩轉大波浪進度
迫不及待拿出了效果圖:
可切換波瀾4種狀態:
覺得不錯順手給個star謝謝大兄弟們了
使用方法:
考入BitmapWave還是一個200行的小鬼:
兩個自定義屬性:
<declare-styleable name="bitmapWave">
<attr name="backbitmap" format="reference"/>
<attr name="overColor" format="color"/>
</declare-styleable>
並在佈局中使用:
<com .example.liangmutian.bitmapwaveview.BitmapWave
android:id="@+id/bitmapwave2"
bitmapwave:backbitmap="@mipmap/q1"
bitmapwave:overColor="#eddf0e"
android:layout_width="100dp"
android:layout_height="250dp"
/>
支援修改的屬性:
屬性名稱 | 描述 | 備註 |
---|---|---|
Bitmap bitmap | 背景圖 | |
private int mWaveLength = 700; | 浪寬 | |
private int progerss = 50; | 浪總高 | |
private int mWaveHeight = 80; | 浪振幅高 | |
private float waveBit = 1 / 4f; | 左右浪比例 | 預設1:1 |
private int mWavePaintColor; | 浪顏色 |
方法支援:
mBitmapWave.setMode(1);
值 | 描述 | 備註 |
---|---|---|
0 | 基本波浪 | |
1 | 重疊部分消失 | 可以表示反向載入 |
2 | 浸泡感覺 | |
3 | 紅色覆蓋 | 波浪透明切顏色加深 |
改變顏色
public void setColor(int c) {
mWavePaint.setColor(c);
}
改變進度
public void setProgerss(int c) {
this.progerss = c;
}
原理解析
思路整理
1.將影象繪製在一個bitmap上
2.繪製背景圖片
3.繪製大波浪
4.用特定的畫筆型別繪製
5.用value動畫讓波浪動起來
6.提供設計設定進度,設定顏色等方法和xml屬性標籤
難點解析
通過ValueAnimator產生差值並重回view產生波浪:
ValueAnimator animator = ValueAnimator.ofInt(0, mWaveLength);
animator.setDuration(1000);
animator.setRepeatCount(ValueAnimator.INFINITE);
animator.setInterpolator(new LinearInterpolator());
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
mOffset = (int) animation.getAnimatedValue();
postInvalidate();
}
});
animator.start();
繪製波瀾path源自貝塞爾曲線:
mPath.reset();
mPath.moveTo(-mWaveLength + mOffset, mCenterY);
for (int i = 0; i < mWaveCount; i++) {
mPath.quadTo((-mWaveLength * (1 - waveBit)) + (i * mWaveLength) + mOffset, mCenterY + mWaveHeight,
(-mWaveLength / 2) + (i * mWaveLength) + mOffset, mCenterY);
mPath.quadTo((-mWaveLength * waveBit) + (i * mWaveLength) + mOffset, mCenterY - mWaveHeight, i * mWaveLength + mOffset, mCenterY);
}
mPath.lineTo(mWidth, mHeight);
mPath.lineTo(0, mHeight);
mPath.close();
貝塞爾曲線還不瞭解的可以看一下醫生的一篇貝塞爾的文章很全。
關鍵在玩轉16中畫筆
private PorterDuffXfermode mMode3 = new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY);//透明出來
//private PorterDuffXfermode mMode = new PorterDuffXfermode(PorterDuff.Mode.XOR);//紅色覆蓋
private PorterDuffXfermode mMode2 = new PorterDuffXfermode(PorterDuff.Mode.DST_ATOP);//浸泡感覺
private PorterDuffXfermode mMode1 = new PorterDuffXfermode(PorterDuff.Mode.DST_OUT);//重疊部分消失 可以表示反向載入
private PorterDuffXfermode mMode0 = new PorterDuffXfermode(PorterDuff.Mode.SRC_IN);//基本波浪
提供更改高畫筆型別方法:
public void setMode(int c) {
switch (c) {
case 0:
mWavePaint.setXfermode(mMode0);
break;
case 1:
mWavePaint.setXfermode(mMode1);
break;
case 2:
mWavePaint.setXfermode(mMode2);
break;
case 3:
mWavePaint.setXfermode(mMode3);
break;
}
}
簡簡單單的介紹完了。
程式碼不多但是真心想一起飛。
歡迎關注作者。歡迎評論討論。歡迎拍磚。 如果覺得這篇文章對你有幫助,歡迎打賞, 歡迎star,Fork我的github。 喜歡作者的也可以Follow。也算對作者的一種支援。 本文Github程式碼連結
https://github.com/AndroidMsky/BitmapWaveView
順手給個star謝謝大兄弟們了
歡迎加作者自營安卓開發交流群:308372687
相關推薦
安卓自定義View在bitmap中玩轉大波浪進度
迫不及待拿出了效果圖: 可切換波瀾4種狀態: 覺得不錯順手給個star謝謝大兄弟們了 使用方法: 考入BitmapWave還是一個200行的小鬼: 兩個自定義屬性: <declare-styleable name="bi
安卓 自定義 日期和時間選擇器,在一個佈局中,可以直接呼叫
廢話不多說先看效果,效果不符合,就不要用看了。 安卓提供自己的日期選擇和時間選擇,但是樣式並不是自己想要的,如果非要把他們放在一起,會發現,樣式不好看,而且時間和日期選擇控制元件的大小不好控制,甚至根本沒法放在一行上,所以實現自定義日期時間選擇器有兩種方式 1.自己寫自定
安卓自定義View進階:Path之玩出花樣(PathMeasure)
PS:不要問我為什麼不講 PathEffect,因為這個方法在後面的Paint系列中。 先放一個圖鎮樓,省的下面無聊的內容把你們都嚇跑了Σ( ̄。 ̄ノ)ノ Path & PathMeasure 顧名思義,PathMeasure是一個用來測量Path的類,主要有以下方法: 構造方法 方法名 釋
【安卓-自定義佈局】安卓App開發思路 一步一個腳印(十)實現內嵌在app中的webview 騰訊開源X5 高效安全
實現內嵌在app中的webview 採用騰訊開源X5 高效安全 webview在app的使用中,十分頻繁,原生的webview載入速度相對來說很慢,而且很費流量。騰訊開源了x5的webview
去除安卓自定義Dialog黑色背景,設置無邊框,透明
isf window bsp 希望 nbsp tle -name rep lan 我們在自定義Dialog的時候,往往會希望除去安卓系統定義背景和標題,以便於更好的顯示我們自己想要的效果。 其實我們只需要註意幾個地方就行了。 1.在Style文件的中定義Dialog的主題
安卓自定義:Toast 以及Toast的出場動畫 以及Toast上新增圖片 以及點選事件
安卓自定義Toast: 1.自定義一個類:CustomToast 繼承自:Toast 2.在CustomToast類中 新增一個靜態 mCustomToast 物件 private static CustomToast mCustomToast; 3.在CustomToast類中 新
安卓自定義switch樣式
榮耀手機鬧鐘開關的switch樣式,最近簡單的方法可以直接設定兩張圖片,根據按鈕狀態來進行切換。 這裡主要說另外一種方式 首先建立兩個track的資原始檔,也就是後面的背景 建立未開啟狀態下的track起名為track_bg_gray <?xml version="1.0
Android安卓自定義由底部彈出對話方塊
努力不一定立刻會有好的結果,但一定是朝著好的方向 ——李尚龍 《你所謂的穩定,不過是在浪費生命》
安卓自定義View進階-手勢檢測(GestureDecetor)
Android 手勢檢測,主要是 GestureDetector 相關內容的用法和注意事項,本文依舊屬於事件處理這一體系,部分內容會涉及到之前文章提及過的知識點,如果你沒看過之前的文章,可以到 自定義 View 系列 來檢視這些內容。 在開發 Android 手機應用過程中,可
安卓自定義View進階-多點觸控詳解
Android 多點觸控詳解,在前面的幾篇文章中我們大致瞭解了 Android 中的事件處理流程和一些簡單的處理方案,本次帶大家瞭解 Android 多點觸控相關的一些知識。 多點觸控 ( Multitouch,也稱 Multi-touch ),即同時接受螢幕上多個點的人機互動
安卓自定義View進階-特殊控制元件的事件處理方案
本文帶大家瞭解 Android 特殊形狀控制元件的事件處理方式,主要是利用了 Region 和 Matrix 的一些方法,超級實用的事件處理方案,相信看完本篇之後,任何奇葩控制元件的事件處理都會變得十分簡單。 不得不說,Android 對事件體系封裝的非常棒,即便對事件體系不太
安卓自定義View進階-MotionEvent詳解
Android MotionEvent 詳解,之前用了兩篇文章 事件分發機制原理 和 事件分發機制詳解 來講解事件分發,而作為事件分發主角之一的 MotionEvent 並沒有過多的說明,本文就帶大家瞭解 MotionEvent 的相關內容,簡要介紹觸控事件,主要包括 單點觸控、多點
安卓自定義View進階-事件分發機制詳解
Android 事件分發機制詳解,在上一篇文章 事件分發機制原理 中簡要分析了一下事件分發機制的原理,原理是十分簡單的,一句話就能總結:責任鏈模式,事件層層傳遞,直到被消費。 雖然原理簡單,但是隨著 Android 不斷的發展,實際運用場景也越來越複雜,所以想要徹底玩轉事件分發機制還
安卓自定義View進階-Matrix Camera
本篇依舊屬於Matrix,主要講解Camera,Android下有很多相機應用,其中的美顏相機更是不少,不過今天這個Camera可不是我們平時拍照的那個相機,而是graphic包下的Camera,專業給View拍照的相機,不過既然是相機,作用都是類似的,主要是將3D的內容拍扁變成2D
安卓自定義View進階-Matrix詳解
這應該是目前最詳細的一篇講解Matrix的中文文章了,在上一篇文章Matrix原理中,我們對Matrix做了一個簡單的瞭解,偏向理論,在本文中則會詳細的講解Matrix的具體用法,以及與Matrix相關的一些實用技巧。 ⚠️ 警告:測試本文章示例之前請關閉硬體加速。
安卓自定義View進階-Matrix原理
本文內容偏向理論,和 畫布操作 有重疊的部分,本文會讓你更加深入的瞭解其中的原理。 本篇的主角Matrix,是一個一直在後臺默默工作的勞動模範,雖然我們所有看到View背後都有著Matrix的功勞,但我們卻很少見到它,本篇我們就看看它是何方神聖吧。 由於Goog
安卓自定義View進階-PathMeasure
可以看到,在經過 Path之基本操作 Path之貝塞爾曲線 和 Path之完結篇 後, Path中各類方法基本上都講完了,表格中還沒有講解到到方法就是矩陣變換了,難道本篇終於要講矩陣了? 非也,矩陣這一部分仍在後面單獨講解,本篇主要講解 PathMeasure 這個類與 Path 的
安卓自定義View進階-Path之貝塞爾曲線
在上一篇文章Path之基本操作中我們瞭解了Path的基本使用方法,本次瞭解Path中非常非常非常重要的內容-貝塞爾曲線。 一.Path常用方法表 為了相容性(偷懶) 本表格中去除了在API21(即安卓版本5.0)以上
安卓自定義View進階-Path之基本操作
在上一篇Canvas之圖片文字中我們瞭解瞭如何使用Canvas中繪製圖片文字,結合前幾篇文章,Canvas的基本操作已經差不多完結了,然而Canvas不僅僅具有這些基本的操作,還可以更加炫酷,本次會了解到path(路徑)這個Canvas中的神器,有了這個神器,就能創造出更多炫(zhu
安卓自定義View進階-Canvas之圖片文字
在上一篇文章Canvas之畫布操作中我們瞭解了畫布的一些基本操作方法,本次瞭解一些繪製圖片文字相關的內容。如果你對前幾篇文章講述的內容熟練掌握的話,那麼恭喜你,本篇結束之後,大部分的自定義View已經難不倒你了,當然了,這並不是終點,接下來還會有更加炫酷的技能。 一.Canva