欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2021年04月09日 11:03:26   作者:Hanking65203  
這篇文章主要介紹了android實現音樂跳動效果的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

效果圖

實現

整體的流程圖如下

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

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

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

/**
         * 先計算當前寬度能夠放下多少個音頻塊
         */
        val widthNum = (getAvailableWith() / (danceGap + danceWidth)).toInt()

  /**
     * 獲取可以用的寬度
     */
    private fun getAvailableWith() = mCanvasWidth - paddingLeft - paddingRight

2、計算每一列中音頻塊的個數

在算出橫向能放置多少音頻塊后,遍歷橫,然后繪制列中的音頻塊,列中的音頻塊的個數跟音頻的高低相關,這里實現方式是通過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,數組的區(qū)間范圍[-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() / 255f
                var 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() / 255f
var heightNum =(b * num).toInt()

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

3、繪制每一個音頻塊

    private fun drawItem(
        heightNum: Int,
        lastDanceRight: Float,
        lastHeight: Float,
        canvas: Canvas?
    ): Float {
        var lastHeight1 = lastHeight
        for (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:id="@+id/danceView"
              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 音樂跳動內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家! 

您可能感興趣的文章:

相關文章

  • Android Webview重定向問題解決方法

    Android Webview重定向問題解決方法

    在Android開發(fā)過程中,使用過WebView的童鞋可能難免會遇到URL重定向問題。這篇文章主要介紹了Android Webview重定向問題解決方法,非常具有實用價值,需要的朋友可以參考下
    2018-05-05
  • Android 程序應用的生命周期

    Android 程序應用的生命周期

    本篇文章小編為大家介紹,Android 程序應用的生命周期。需要的朋友參考下
    2013-04-04
  • Android中使用二級緩存、異步加載批量加載圖片完整案例

    Android中使用二級緩存、異步加載批量加載圖片完整案例

    這篇文章主要介紹了Android中使用二級緩存、異步加載批量加載圖片完整案例,本文講解了實現的過程以及核心代碼展示,并給出了完整項目源碼,需要的朋友可以參考下
    2015-06-06
  • android編程實現懸浮窗體的方法

    android編程實現懸浮窗體的方法

    這篇文章主要介紹了android編程實現懸浮窗體的方法,以實例形式較為詳細的分析了Android懸浮窗體的權限控制、布局及功能實現技巧,非常具有實用價值,需要的朋友可以參考下
    2015-11-11
  • Android App中實現圖片異步加載的實例分享

    Android App中實現圖片異步加載的實例分享

    這篇文章主要介紹了Android App中實現圖片異步加載的實例分享,這樣GridView在加載大量圖片時便可以延時分布顯示,需要的朋友可以參考下
    2016-04-04
  • Android編程實現手繪及保存為圖片的方法(附demo源碼下載)

    Android編程實現手繪及保存為圖片的方法(附demo源碼下載)

    這篇文章主要介紹了Android編程實現手繪及保存為圖片的方法,涉及Android畫布的使用及圖片的操作技巧,并附帶了demo源碼供讀者下載,需要的朋友可以參考下
    2015-12-12
  • Android OkHttp 結合php 多圖片上傳實例

    Android OkHttp 結合php 多圖片上傳實例

    本篇文章主要介紹了Android OkHttp 結合php 多圖片上傳實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • Android源碼導入AndroidStudio或IntelliJ?IDEA的方法

    Android源碼導入AndroidStudio或IntelliJ?IDEA的方法

    這篇文章主要介紹了Android源碼導入AndroidStudio或IntelliJ?IDEA的方法,用idegen來生成針對AndroidStudio或IntelliJ?IDEA的Android系統源代碼工程配置文件,需要的朋友可以參考下
    2022-08-08
  • Android Studio編寫微信頁面提交功能

    Android Studio編寫微信頁面提交功能

    這篇文章主要介紹了基于Android Studio編寫微信頁面提交功能,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • Android如何實現URL轉換成二維碼

    Android如何實現URL轉換成二維碼

    這篇文章主要為大家詳細介紹了Android實現URL轉換成二維碼的方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-04-04

最新評論