Android繪制音樂(lè)播放器示波器
示波器是在大學(xué)的時(shí)候老師教的,但是出來(lái)工作一直沒(méi)有用到過(guò),漸漸的也就忘記了,現(xiàn)在重新學(xué)習(xí)一下。來(lái)看看效果圖:

這里是一個(gè)自定義的柱狀圖,然后有一個(gè)按鈕,點(diǎn)擊按鈕的時(shí)候,這里柱子會(huì)不停的運(yùn)動(dòng),類似于音樂(lè)播放器里示波器的跳動(dòng)。
跟前面幾個(gè)自定義view的方式類似,重寫了onSizeChange()方法和onDraw()方法
先列一下我們要用到的變量:
/**畫筆*/ private Paint mPaint; /**控件的寬度*/ private float mWidth; /**單個(gè)柱子的寬度*/ private float mRectWidth; /**單個(gè)柱子的高度*/ private float mRectHeight; /**柱子的總個(gè)數(shù)*/ private float mRectCount = 10; /**柱子之間的間隔*/ private int offsets = 2; /**Android中的線性漸變*/ private LinearGradient mLinearGradient; /**隨機(jī)的柱子的高度*/ private double mRandom;
所有的變量都在這里了
下面給畫筆初始化
/**
* 初始化畫筆
*/
private void initView() {
mPaint = new Paint();
mPaint.setAntiAlias(true);
}
然后在onSizeChange()里面給變量賦值
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
mWidth = getWidth();
mRectHeight = getHeight();
mRectWidth = (int) (mWidth * 0.6 / mRectCount);
mLinearGradient = new LinearGradient(0, 0, mRectWidth, mRectHeight,
Color.YELLOW, Color.BLUE, Shader.TileMode.CLAMP);
mPaint.setShader(mLinearGradient);
}
最后繪制柱狀圖
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
for (int i = 0; i < mRectCount; i++) {
mRandom = Math.random();
float currentHeight = (float) (mRectHeight * mRandom);
canvas.drawRect(
(float) (mWidth * 0.4 / 2 + mRectWidth * i + offsets),
currentHeight, (float) (mWidth * 0.4 / 2 + mRectWidth
* (i + 1)), mRectHeight, mPaint);
}
}
這個(gè)時(shí)候,一個(gè)音樂(lè)播放器的示波器已經(jīng)完成了,但是,這個(gè)是靜態(tài)的,接下來(lái),向外面暴露一個(gè)方法,用于刷新View,實(shí)現(xiàn)動(dòng)態(tài)的效果。
public void onStart() {
postInvalidateDelayed(300);
}
每間隔300ms對(duì)View進(jìn)行重繪,就可以有一個(gè)比較好的視覺(jué)效果了。
好了,最后我貼上全部的代碼:
public class MusicLine extends View {
private Paint mPaint;
private float mWidth;
private float mRectWidth;
private float mRectHeight;
private float mRectCount = 10;
private int offsets = 2;
private LinearGradient mLinearGradient;
private double mRandom;
public MusicLine(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initView();
}
public MusicLine(Context context, AttributeSet attrs) {
super(context, attrs);
initView();
}
public MusicLine(Context context) {
super(context);
initView();
}
/**
* 初始化工具類
*/
private void initView() {
mPaint = new Paint();
mPaint.setAntiAlias(true);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
mWidth = getWidth();
mRectHeight = getHeight();
mRectWidth = (int) (mWidth * 0.6 / mRectCount);
mLinearGradient = new LinearGradient(0, 0, mRectWidth, mRectHeight,
Color.YELLOW, Color.BLUE, Shader.TileMode.CLAMP);
mPaint.setShader(mLinearGradient);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
for (int i = 0; i < mRectCount; i++) {
mRandom = Math.random();
float currentHeight = (float) (mRectHeight * mRandom);
canvas.drawRect(
(float) (mWidth * 0.4 / 2 + mRectWidth * i + offsets),
currentHeight, (float) (mWidth * 0.4 / 2 + mRectWidth
* (i + 1)), mRectHeight, mPaint);
}
}
public void onStart() {
postInvalidateDelayed(300);
}
}
至此,全部完成了。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android音樂(lè)播放器制作 點(diǎn)擊歌曲實(shí)現(xiàn)播放(二)
- Android音樂(lè)播放器制作 掃描本地音樂(lè)顯示在手機(jī)(一)
- Android簡(jiǎn)易音樂(lè)播放器實(shí)現(xiàn)代碼
- Android仿音樂(lè)播放器功能
- 詳解Android應(yīng)用開發(fā)--MP3音樂(lè)播放器代碼實(shí)現(xiàn)(一)
- Android MediaPlayer實(shí)現(xiàn)音樂(lè)播放器實(shí)例代碼
- Android 開源在線音樂(lè)播放器
- Android 音樂(lè)播放器的開發(fā)實(shí)例詳解
- Android基于Service的音樂(lè)播放器
- Android音樂(lè)播放器制作 加入控制臺(tái)(三)
相關(guān)文章
iOS UIButton 點(diǎn)擊無(wú)響應(yīng)的解決辦法
在開發(fā)中按鈕我們經(jīng)常會(huì)遇到,但是有時(shí)候會(huì)碰到一些難以處理的問(wèn)題,就是按鈕點(diǎn)擊無(wú)響應(yīng),其實(shí)解決方法也不難。下面小編之家小編抽空給大家介紹iOS UIButton 點(diǎn)擊無(wú)響應(yīng)的解決辦法,需要的朋友參考下吧2017-12-12
Android實(shí)現(xiàn)左右擺動(dòng)的球體動(dòng)畫效果
這篇文章主要介紹了Android實(shí)現(xiàn)左右擺動(dòng)的球體動(dòng)畫效果,本文介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-09-09
Flutter應(yīng)用框架運(yùn)行微信小程序方法
這篇文章主要介紹了在Flutter?App內(nèi)運(yùn)行微信小程序的過(guò)程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2023-02-02
Android學(xué)習(xí)筆記之AndroidManifest.xml文件解析(詳解)
這篇文章主要介紹了Android學(xué)習(xí)筆記之AndroidManifest.xml文件解析,需要的朋友可以參考下2015-10-10
Android?OpenCV基礎(chǔ)API清晰度亮度識(shí)別檢測(cè)
這篇文章主要為大家介紹了Android?OpenCV基礎(chǔ)API清晰度亮度識(shí)別檢測(cè),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01
詳解如何使用VisualStudio高效開發(fā)調(diào)試AndroidNDK
這篇文章主要介紹了詳解如何使用VisualStudio高效開發(fā)調(diào)試AndroidNDK,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-12-12
Android編程實(shí)現(xiàn)GPS位置獲取的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)GPS位置獲取的方法,結(jié)合具體實(shí)例形式分析了Android針對(duì)GPS定位的常見操作技巧,需要的朋友可以參考下2017-07-07

