Android自定義View實(shí)現(xiàn)簡單水波紋效果
本文實(shí)例為大家分享了Android自定義View實(shí)現(xiàn)水波紋效果的具體代碼,供大家參考,具體內(nèi)容如下
效果如下:

原理

控制代碼
//這里用的kotlin
//主線程刷新控件
?val mHandler = object : Handler() {
? ? ? ? override fun handleMessage(msg: Message?) {
? ? ? ? ? ? waterRippleView.refreshView()
? ? ? ? }
? ??
//開啟動(dòng)畫,開線程,延時(shí)刷新period值,畫布進(jìn)行x方向平移
private fun progressAdd() {
? ? ? ? isAnimate = true
? ? ? ? Thread(Runnable {
? ? ? ? ? ? while (isAnimate) {
? ? ? ? ? ? ? ? Thread.sleep(100)
? ? ? ? ? ? ? ? mHandler.sendEmptyMessage(0)
? ? ? ? ? ? }
? ? ? ? }).start()
? ? }
//停止動(dòng)畫
? ? private fun progressReduce() {
? ? ? ? isAnimate = false
? ? }控件源碼:
//java編寫
public class WaterRippleView extends View {
? ??
? ? private float mWidth;
? ? private float mHeight;
? ? //總周期為2s
? ? private int CIRCLE_PERIOD = 2000;
? ? //振幅,波紋高度
? ? private float ampltitude = 100;
? ? //填充顏色
? ? private int paintColor = 0xff57c011;
? ? //當(dāng)前時(shí)間值,累加并循環(huán)
? ? private int period = 0;
? ? private Paint paint;
? ? private Path path;
? ? public WaterRippleView(Context context) {
? ? ? ? this(context, null);
? ? }
? ? public WaterRippleView(Context context, @Nullable AttributeSet attrs) {
? ? ? ? this(context, attrs, 0);
? ? }
? ? public WaterRippleView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
? ? ? ? super(context, attrs, defStyleAttr);
? ? ? ? paint = new Paint();
? ? ? ? paint.setColor(paintColor);
? ? ? ? paint.setStyle(Paint.Style.FILL);
? ? ? ? paint.setAntiAlias(true);
? ? ? ? path = new Path();
? ? }
? ? @Override
? ? protected void onSizeChanged(int w, int h, int oldw, int oldh) {
? ? ? ? super.onSizeChanged(w, h, oldw, oldh);
? ? ? ? mWidth = w;
? ? ? ? mHeight = h;
? ? }
? ? public void refreshView() {
? ? ? ? period += 100;
? ? ? ? if (period > CIRCLE_PERIOD) period %= CIRCLE_PERIOD;
? ? ? ? invalidate();
? ? }
? ? @Override
? ? protected void onDraw(Canvas canvas) {
? ? ? ? super.onDraw(canvas);
? ? ? ? //周期性的移動(dòng)畫布
? ? ? ? float offsetX = mWidth / CIRCLE_PERIOD * period;
? ? ? ? canvas.translate(-offsetX, 0);
? ? ? ? path.reset();
? ? ? ? //第一個(gè)正弦曲線
? ? ? ? path.moveTo(0, mHeight / 2);
? ? ? ? path.cubicTo(mWidth / 4, mHeight / 2 - ampltitude,
? ? ? ? ? ? ? ? mWidth * 3 / 4, mHeight / 2 + ampltitude, mWidth, mHeight / 2);
? ? ? ? //第二個(gè)正弦曲線
? ? ? ? path.cubicTo(mWidth * 5 / 4, mHeight / 2 - ampltitude,
? ? ? ? ? ? ? ? mWidth * 7 / 4, mHeight / 2 + ampltitude, 2 * mWidth, mHeight / 2);
? ? ? ? //形成閉合路徑
? ? ? ? path.lineTo(2 * mWidth, mHeight);
? ? ? ? path.lineTo(0, mHeight);
? ? ? ? path.lineTo(0, mHeight / 2);
? ? ? ? canvas.drawPath(path, paint);
? ? }
}以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android水波紋載入控件CircleWaterWaveView使用詳解
- android自定義WaveView水波紋控件
- Android自定義View控件實(shí)現(xiàn)多種水波紋漣漪擴(kuò)散效果
- Android自定義WaveProgressView實(shí)現(xiàn)水波紋加載需求
- Android自定義View實(shí)現(xiàn)水波紋效果
- Android自定義View實(shí)現(xiàn)水波紋引導(dǎo)動(dòng)畫
- Android 自定義view實(shí)現(xiàn)水波紋動(dòng)畫效果
- Android自定義View 實(shí)現(xiàn)水波紋動(dòng)畫引導(dǎo)效果
- Android自定義view實(shí)現(xiàn)水波紋進(jìn)度球效果
- Android項(xiàng)目實(shí)戰(zhàn)手把手教你畫圓形水波紋loadingview
相關(guān)文章
使用User Agent分辨出Android設(shè)備類型的安全做法
這篇文章主要介紹了使用User Agent分辨出Android設(shè)備類型的安全做法,本文得出的結(jié)論是當(dāng)你依據(jù)檢測UA來判斷Android手機(jī)設(shè)備,請(qǐng)同時(shí)檢查android和mobile兩個(gè)字符串,需要的朋友可以參考下2015-01-01
Android 使用selector改變按鈕狀態(tài)實(shí)例詳解
這篇文章主要介紹了Android 使用selector改變按鈕狀態(tài)實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-01-01
Android如何在一個(gè)TextView中設(shè)置不同字體大小、不同字體顏色封裝
在開發(fā)過程中遇到過這樣一種業(yè)務(wù),有很多單行文本字體,字符串中每一部分的字體樣式、大小、顏色都不相同,傳統(tǒng)的做法是放多個(gè)TextView以達(dá)到效果,這篇文章主要介紹了android在一個(gè)TextView中設(shè)置不同字體大小、不同字體顏色封裝,需要的朋友可以參考下2024-07-07
Android實(shí)現(xiàn)靜態(tài)廣播監(jiān)聽器的方法
這篇文章主要介紹了Android實(shí)現(xiàn)靜態(tài)廣播監(jiān)聽器的方法,涉及Android的廣播機(jī)制與記錄監(jiān)聽廣播信息的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07
Android 中出現(xiàn)java.net.BindException: bind failed: EADDRINUSE 問
這篇文章主要介紹了Android 中出現(xiàn)java.net.BindException: bind failed: EADDRINUSE 問題解決辦法的相關(guān)資料,需要的朋友可以參考下2017-04-04
Android中使用Toast.cancel()方法優(yōu)化toast內(nèi)容顯示的解決方法
做程序員的,基本一看api就知道,用這個(gè)可以取消上一個(gè)toast的顯示,然后顯示下一個(gè),這樣就能解決出現(xiàn)的問題??墒窃跍y試的過程中,發(fā)現(xiàn)卻沒有想象中的那么簡單,不信可以百度一下,很多很多人發(fā)現(xiàn)toast的cancel()方法不起作用2013-05-05
Android?Studio實(shí)現(xiàn)音樂播放器的全過程(簡單易上手)
這篇文章主要給大家介紹了關(guān)于Android?Studio實(shí)現(xiàn)音樂播放器的相關(guān)資料,文中通過實(shí)例代碼以及圖文介紹的非常詳細(xì),對(duì)各位Android開發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-02-02
Android編程實(shí)現(xiàn)ListView頭部ViewPager廣告輪詢圖效果
這篇文章主要介紹了Android編程實(shí)現(xiàn)ListView頭部ViewPager廣告輪詢圖效果,較為詳細(xì)的分析了自定義ListView實(shí)現(xiàn)ViewPager廣告圖輪詢的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10
Android Activity的生命周期與啟動(dòng)模式全面解讀
雖然說我們天天都在使用Activity,但是你真的對(duì)Activity的生命機(jī)制完全了解了嗎?Activity的生命周期方法只有七個(gè),但是其實(shí)那只是默認(rèn)的情況。也就是說在其他情況下,Activity的生命周期可能不會(huì)是按照我們以前所知道的流程,這就要說到Activity的啟動(dòng)模式2021-10-10

