国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 系統(tǒng) > Android > 正文

Android繪制音樂(lè)播放器示波器

2019-12-12 06:02:09
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

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

這里是一個(gè)自定義的柱狀圖,然后有一個(gè)按鈕,點(diǎn)擊按鈕的時(shí)候,這里柱子會(huì)不停的運(yùn)動(dòng),類(lèi)似于音樂(lè)播放器里示波器的跳動(dòng)。

跟前面幾個(gè)自定義view的方式類(lèi)似,重寫(xiě)了onSizeChange()方法onDraw()方法
先列一下我們要用到的變量:

 /**畫(huà)筆*/ 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;

所有的變量都在這里了

下面給畫(huà)筆初始化

 /**  * 初始化畫(huà)筆  */ 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(); } /**  * 初始化工具類(lèi)  */ 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í)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 修文县| 湖北省| 巴楚县| 和田县| 固阳县| 北辰区| 鸡西市| 改则县| 嘉祥县| 稷山县| 新蔡县| 巴塘县| 柯坪县| 喀什市| 渭南市| 雅江县| 沅江市| 盐边县| 沁阳市| 闽侯县| 五台县| 仪陇县| 牙克石市| 杭锦后旗| 鹿邑县| 门源| 开封县| 荔浦县| 伊宁市| 拜泉县| 丰城市| 连平县| 尖扎县| 会宁县| 湘潭县| 凤庆县| 九台市| 和田县| 新沂市| 金川县| 澜沧|