最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android繪制音樂播放器示波器

 更新時間:2016年07月12日 14:37:28   作者:qq_25193681  
這篇文章主要為大家詳細介紹了Android繪制音樂播放器示波器的相關資料,感興趣的小伙伴們可以參考一下

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

這里是一個自定義的柱狀圖,然后有一個按鈕,點擊按鈕的時候,這里柱子會不停的運動,類似于音樂播放器里示波器的跳動。

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

 /**畫筆*/
 private Paint mPaint;
 /**控件的寬度*/
 private float mWidth;
 /**單個柱子的寬度*/
 private float mRectWidth;
 /**單個柱子的高度*/
 private float mRectHeight;
 /**柱子的總個數(shù)*/
 private float mRectCount = 10;
 /**柱子之間的間隔*/
 private int offsets = 2;
 /**Android中的線性漸變*/
 private LinearGradient mLinearGradient;
 /**隨機的柱子的高度*/
 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);
  }

 }

這個時候,一個音樂播放器的示波器已經(jīng)完成了,但是,這個是靜態(tài)的,接下來,向外面暴露一個方法,用于刷新View,實現(xiàn)動態(tài)的效果。

    public void onStart() {
        postInvalidateDelayed(300);
    }

每間隔300ms對View進行重繪,就可以有一個比較好的視覺效果了。

好了,最后我貼上全部的代碼:

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);
 }

}

至此,全部完成了。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • iOS UIButton 點擊無響應的解決辦法

    iOS UIButton 點擊無響應的解決辦法

    在開發(fā)中按鈕我們經(jīng)常會遇到,但是有時候會碰到一些難以處理的問題,就是按鈕點擊無響應,其實解決方法也不難。下面小編之家小編抽空給大家介紹iOS UIButton 點擊無響應的解決辦法,需要的朋友參考下吧
    2017-12-12
  • Android實現(xiàn)左右擺動的球體動畫效果

    Android實現(xiàn)左右擺動的球體動畫效果

    這篇文章主要介紹了Android實現(xiàn)左右擺動的球體動畫效果,本文介紹的非常詳細,具有參考借鑒價值,需要的朋友可以參考下
    2016-09-09
  • FragmentTabHost使用方法詳解

    FragmentTabHost使用方法詳解

    這篇文章主要為大家詳細介紹了Android中FragmentTabHost的使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • Flutter應用框架運行微信小程序方法

    Flutter應用框架運行微信小程序方法

    這篇文章主要介紹了在Flutter?App內(nèi)運行微信小程序的過程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2023-02-02
  • 淺談Android Dialog窗口機制

    淺談Android Dialog窗口機制

    本文主要介紹了Android Dialog窗口機制,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • Android學習筆記之AndroidManifest.xml文件解析(詳解)

    Android學習筆記之AndroidManifest.xml文件解析(詳解)

    這篇文章主要介紹了Android學習筆記之AndroidManifest.xml文件解析,需要的朋友可以參考下
    2015-10-10
  • Android?OpenCV基礎API清晰度亮度識別檢測

    Android?OpenCV基礎API清晰度亮度識別檢測

    這篇文章主要為大家介紹了Android?OpenCV基礎API清晰度亮度識別檢測,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • 詳解如何使用VisualStudio高效開發(fā)調試AndroidNDK

    詳解如何使用VisualStudio高效開發(fā)調試AndroidNDK

    這篇文章主要介紹了詳解如何使用VisualStudio高效開發(fā)調試AndroidNDK,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12
  • Android編程實現(xiàn)GPS位置獲取的方法

    Android編程實現(xiàn)GPS位置獲取的方法

    這篇文章主要介紹了Android編程實現(xiàn)GPS位置獲取的方法,結合具體實例形式分析了Android針對GPS定位的常見操作技巧,需要的朋友可以參考下
    2017-07-07
  • Flutter?list?數(shù)組排序示例解析

    Flutter?list?數(shù)組排序示例解析

    這篇文章主要為大家介紹了Flutter?list?數(shù)組排序實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05

最新評論

太湖县| 梅州市| 赞皇县| 香河县| 淅川县| 岱山县| 嘉兴市| 延安市| 星座| 玉屏| 天全县| 金乡县| 成都市| 阿尔山市| 若尔盖县| 宣化县| 兴隆县| 都兰县| 廊坊市| 东丰县| 普洱| 马鞍山市| 安阳县| 嘉黎县| 时尚| 宁蒗| 美姑县| 米泉市| 开平市| 英山县| 剑河县| 象州县| 民丰县| 凤城市| 安陆市| 崇左市| 宁蒗| 宽甸| 林州市| 淮北市| 沿河|