日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

android實現音樂跳動效果的示例代碼

瀏覽:22日期:2022-09-19 17:14:11
效果圖

android實現音樂跳動效果的示例代碼

實現

整體的流程圖如下

android實現音樂跳動效果的示例代碼

上面主要步驟分為3個1、計算寬度能放下多少列的音頻塊。2、計算每一列中音頻塊的個數3、繪制音頻塊

1、計算寬度能放下多少列的音頻塊。

設置音頻塊的寬度為danceWidth,音頻塊橫向之間的間距為danceGap,那么可以算出能放的列數:

/** * 先計算當前寬度能夠放下多少個音頻塊 */val widthNum = (getAvailableWith() / (danceGap + danceWidth)).toInt() /** * 獲取可以用的寬度 */ private fun getAvailableWith() = mCanvasWidth - paddingLeft - paddingRight2、計算每一列中音頻塊的個數

在算出橫向能放置多少音頻塊后,遍歷橫,然后繪制列中的音頻塊,列中的音頻塊的個數跟音頻的高低相關,這里實現方式是通過Visualizer這個類然后獲取到mRawAudioBytes數組,

mVisualizer.setDataCaptureListener(new Visualizer.OnDataCaptureListener() { @Override public void onWaveFormDataCapture(Visualizer visualizer, byte[] bytes, int samplingRate) {BaseVisualizer.this.mRawAudioBytes = bytes;invalidate(); } @Override public void onFftDataCapture(Visualizer visualizer, byte[] bytes, int samplingRate) { }}, Visualizer.getMaxCaptureRate() / 2, true, false);

這里設置的獲取的mRawAudioBytes數組的大小是128,數組的區間范圍[-128,127],計算列的時候這里做了兩個比較重要的操作,第一個是怎么把mRawAudioBytes數組的值與音頻的個數做映射,第二個是怎么取mRawAudioBytes數組的值。

/** * 先計算當前寬度能夠放下多少個音頻塊 */val widthNum = (getAvailableWith() / (danceGap + danceWidth)).toInt()Log.d( TAG, 'widthNum $widthNum')/** * 算出橫向能放多少后,進行繪制 *//** * 繪制的時候用于標記開始繪制的位置 */var lastDanceRight = paddingLeft.toFloat()if (widthNum > 0 && mRawAudioBytes != null && mRawAudioBytes.isNotEmpty()) for (i in 0 until widthNum) {//先算出當前高度,然后再算這個高度能放下多少個音頻塊val num = (getAvailableHeight() / (danceHeight + danceGap)).toInt()val index = (mRawAudioBytes.size) * (i.toFloat() / widthNum)val b = (mRawAudioBytes[index.toInt()] + 128).toFloat() / 255fvar heightNum = (b * num).toInt()if (heightNum < miniNum) { heightNum = miniNum}if (heightNum > maxNum) { heightNum = maxNum}//拿到最頂部的高度var lastHeight = mCanvasHeight - paddingStart.toFloat()Log.d( TAG, 'heightNum $heightNum lastHeight $lastHeight lastDanceRight $lastDanceRight ${mRawAudioBytes[i]} $num $b $index')lastHeight = drawItem(heightNum, lastDanceRight, lastHeight, canvas)lastDanceRight += danceWidth + danceGap }

上面做了兩個映射,首先可能有0~n橫,但是mRawAudioBytes大小是128,遍歷橫的時候對下標進行一個映射,保證獲得的值是均勻的,

/**通過這個映射得到index*/val index = (mRawAudioBytes.size) * (i.toFloat() / widthNum)

第二個映射,是得到了代表音頻大小的mRawAudioBytes數組,現在要把這里面的值跟列的高度做一個映射,值越大高度越高,音頻塊就越多。

val num = (getAvailableHeight() / (danceHeight + danceGap)).toInt()val b = (mRawAudioBytes[index.toInt()] + 128).toFloat() / 255fvar heightNum =(b * num).toInt()

上面是先得到列最多能展示多少音頻塊,再根據mRawAudioBytes的值來算出當前列展示多少個音頻塊。這一步也叫歸一化,區間映射。

3、繪制每一個音頻塊

private fun drawItem(heightNum: Int,lastDanceRight: Float,lastHeight: Float,canvas: Canvas? ): Float {var lastHeight1 = lastHeightfor (j in 0 until heightNum) { mDanceRect.set(lastDanceRight,lastHeight1 - danceHeight,lastDanceRight + danceWidth,lastHeight1 ) mPaint.shader = null if (j >= heightNum - shaderNum) {val backGradient = LinearGradient( lastDanceRight, lastHeight1 - danceHeight, lastDanceRight + danceWidth, lastHeight1, intArrayOf(colorStart, colorCenter, colorEnd), null, Shader.TileMode.CLAMP)mPaint.shader = backGradient } canvas?.drawRoundRect(mDanceRect, 8f, 8f, mPaint) lastHeight1 -= (danceHeight + danceGap)}return lastHeight1 }

就是根據高度來繪制rectangle,算出一列能繪制多少個音頻塊,每一個音頻塊是一個rectangle,然后繪制rectangle,為了效果更好,判斷上面的音頻塊加上漸變。

github地址

使用方法

<com.masoudss.lib.DanceView android: android:layout_width='320dp' android:layout_height='300dp' android:layout_gravity='center' app:color_center='@color/red' app:color_end='@color/white' app:color_start='@color/yellow' app:dance_color='@color/yellow' app:dance_corner_radius='2dp' app:dance_gap='2dp' app:max_dance_num='30' app:min_dance_num='2' app:shader_num='3' /> shader_num 頂部加漸變的個數 color_end 漸變尾部顏色 color_start 漸變開頭顏色 color_center 漸變中間顏色 min_dance_num 每一列中最少顯示的個數 max_dance_num 每一列中最大顯示的個數 dance_gap 每一個音頻格之間的間距

到此這篇關于android實現音樂跳動效果的示例代碼的文章就介紹到這了,更多相關android 音樂跳動內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Android
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
男女男精品视频网| 免费不卡中文字幕在线| 丝袜脚交一区二区| 亚洲欧洲一区二区天堂久久| 青青青免费在线视频| 精品国产欧美| 97精品国产福利一区二区三区| 精品国产aⅴ| 福利一区在线| www.com.cn成人| 久久免费国产| 伊人久久亚洲热| 午夜久久99| 热久久国产精品| 日韩精品电影一区亚洲| 奇米亚洲欧美| 精品国产一区二| 日韩不卡在线| 欧美日韩精品一区二区视频| 日本精品不卡| 欧美日本久久| 精品国产一级| 91精品一区国产高清在线gif| 自拍日韩欧美| 蜜臀国产一区二区三区在线播放| 丝袜美腿一区二区三区| 免费观看日韩电影| 日韩高清一级| 欧美1区2区3| 天堂中文av在线资源库| 成人久久久久| 国产毛片一区| 欧美亚洲tv| 国产高潮在线| 999久久久91| 日韩在线网址| 精品国产午夜肉伦伦影院| 欧美久久天堂| 国产色综合网| 日本精品国产| 91亚洲自偷观看高清| 精品免费av在线| 久久亚洲图片| 国产精品资源| 日韩精品免费一区二区在线观看| 宅男在线一区| 日本午夜精品一区二区三区电影| 成人国产综合| 韩国久久久久久| 久久久久国产精品一区三寸 | 精品国产三区在线| 丝袜亚洲另类欧美| 欧美精品aa| 欧洲一级精品| 日本伊人久久| 91日韩欧美| 亚洲va久久久噜噜噜久久| 麻豆国产91在线播放| 久久久久久久久99精品大| 亚洲无线观看| 91亚洲人成网污www| 一区久久精品| 国产福利资源一区| 亚洲精品一区二区妖精| 国产日韩欧美在线播放不卡| 青青久久av| 国产精品久久久免费| 欧美日韩第一| 国产激情一区| 视频一区视频二区在线观看| 精品久久免费| 日韩精品a在线观看91| 久久激情婷婷| 国产精品嫩草影院在线看| 九九综合九九| 精品国产午夜肉伦伦影院| 亚洲一区久久| 91精品xxx在线观看| 欧美亚洲三级| 美日韩精品视频| 色婷婷精品视频| 国产精品久久久一区二区| 久久不射中文字幕| 蜜桃传媒麻豆第一区在线观看 | 红桃视频国产一区| 国产一区二区三区网| 蜜臀a∨国产成人精品| 日韩毛片视频| 国产精品久久久久毛片大屁完整版| 亚洲精品88| 国产精品麻豆成人av电影艾秋| 亚洲一区二区成人| 久久精品中文| 久久影视三级福利片| 综合激情五月婷婷| 久久亚洲成人| 国产精品国产一区| 国产人成精品一区二区三| 亚洲一区二区动漫| 久久久久久久久久久妇女| 久久麻豆视频| 欧美综合精品| 羞羞答答国产精品www一本 | 久久久夜精品| 日韩1区2区| 美女国产一区二区三区| 日韩在线黄色| 免费一级片91| 国产精品三上| 黄色欧美日韩| 91精品久久久久久久久久不卡| 精品日产乱码久久久久久仙踪林| 欧美色综合网| 视频一区日韩精品| 久久亚洲二区| 麻豆精品网站| 免费成人性网站| 欧美日韩国产高清电影| 欧美亚洲国产激情| 日韩精品水蜜桃| 久久精品亚洲人成影院| 九色porny丨国产首页在线| 不卡专区在线| 国产va在线视频| 国产一区二区久久久久| 免费在线观看一区| 欧美黑人巨大videos精品| 国产日韩视频| 国产精品亚洲欧美日韩一区在线| 日韩国产欧美视频| 日韩欧美高清一区二区三区| 爽好久久久欧美精品| 久久精品国产大片免费观看| 91精品韩国| 亚洲午夜久久久久久尤物| 高清av一区二区三区| 激情久久久久久| 狠狠爱成人网| 亚洲一区二区三区久久久| 蜜臀久久99精品久久久画质超高清 | 午夜精品影院| 夜久久久久久| 亚洲免费影视| 亚洲综合另类| 中文字幕一区二区三区在线视频| 亚洲一区二区成人| 亚洲一区有码| 日韩国产欧美一区二区三区| 99久久精品费精品国产| 日韩不卡在线| 中文在线一区| 日韩二区在线观看| 国产精品流白浆在线观看| 精品三级av| 免费视频亚洲| 一级成人国产| 欧美日一区二区在线观看| 麻豆精品久久| 日韩av免费大片| 久久久久.com| 免费美女久久99| 国产精品久久久久久av公交车| 国产一区国产二区国产三区 | 久久久国产精品网站| 人人草在线视频| 999在线观看精品免费不卡网站| 一区二区三区四区日韩| 国产乱人伦丫前精品视频| 福利精品在线| 国产一级久久| 欧美精品国产一区| 老牛影视精品| 91精品精品| 亚洲免费毛片| 麻豆久久久久久| 欧美中文一区二区| 日韩和欧美一区二区三区| 国内在线观看一区二区三区 | 不卡一二三区| 蜜桃一区二区三区在线观看| 国产精品视频首页| 91精品国产福利在线观看麻豆| 亚洲区第一页| 在线天堂中文资源最新版| 中文日韩欧美| 欧美一区二区三区久久精品| 一区二区精品伦理...| 午夜在线观看免费一区| 欧美日韩午夜| 欧美va天堂在线| 国产精品欧美一区二区三区不卡| 日韩欧美不卡| 亚州av日韩av| 日本综合字幕| **爰片久久毛片| 亚洲精品99| 精品三区视频| 亚洲精品成a人ⅴ香蕉片| 国产videos久久| 影音先锋久久精品|