1. 程式人生 > >安卓自定義View在bitmap中玩轉大波浪進度

安卓自定義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