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

首頁 > 系統 > Android > 正文

Android語音聲波控件 Android條形波控件

2019-10-22 18:27:34
字體:
來源:轉載
供稿:網友

許久不來 , 冒個泡 , 發一個剛做的聲音波動的View吧 :

代碼不多 , 沒什么技術含量 , 權當給您省時間了 , 直接復制粘貼就能用 , 直接上代碼:

SoundWavesView

/** * 語音通話的聲波控件 * Created by Mr.LongFace on 2017/9/16. */public class SoundWavesView extends View {  private int mMini; // 最短值  private int mMax; // 最大值  private int mLineWidth; // 每條聲波的寬度  private int mSoundNum = 5; // 聲波的數量  private int mSpac; // 每條聲波的中點  private int mWidth , mHeight; // 控件寬高  private boolean isRun = false;  private Paint mPaint;  private RectF mRectF;  private List<SoundLine> mSoundList = new ArrayList<>();  private Handler mHandler = new Handler();  private Runnable mInvalidateRun = new Runnable() {    @Override    public void run() {      postInvalidate();    }  };  public SoundWavesView(Context context, @Nullable AttributeSet attrs) {    super(context, attrs);    mPaint = new Paint();    mPaint.setAntiAlias(true);    mPaint.setColor(getResources().getColor(R.color.color_red));    mPaint.setStyle(Paint.Style.FILL);    mRectF = new RectF();  }  @Override  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {    super.onMeasure(widthMeasureSpec, heightMeasureSpec);    if (widthMeasureSpec > 0 && heightMeasureSpec > 0) {      initParam();    }  }  private void initParam() {    mWidth = getWidth();    mHeight = getHeight();    mMini = (int) (mHeight * 0.3f);    mMax = mHeight;    initLines();  }  @Override  protected void onDraw(Canvas canvas) {    super.onDraw(canvas);    for (int i = 0; i < mSoundNum; i++) {      SoundLine sound = mSoundList.get(i);      mRectF.left = sound.left;      mRectF.right = sound.right;      mRectF.top = sound.top;      mRectF.bottom = sound.bottom;      canvas.drawRoundRect(mRectF , mLineWidth / 2 , mLineWidth / 2 , mPaint);    }    if (isRun) {      mHandler.postDelayed(mInvalidateRun, 10);    }  }  @Override  protected void onVisibilityChanged(@NonNull View changedView, int visibility) {    super.onVisibilityChanged(changedView, visibility);    if (isRun) {      if (visibility == VISIBLE) {        if (mWidth == 0) {          initParam();        }        if (mSoundList != null && mSoundList.size() > 0) {          for (SoundLine soundLine : mSoundList) {            soundLine.start();          }        }      }else{        if (mSoundList != null && mSoundList.size() > 0) {          for (SoundLine soundLine : mSoundList) {            soundLine.stop();          }        }      }    }  }  public void start() {    if (!isRun) {      isRun = true;      for (SoundLine sound : mSoundList) {        sound.start();      }      postInvalidate();    }  }  public void stop(){    if (isRun) {      isRun = false;      for (SoundLine sound : mSoundList) {        sound.stop();      }    }  }  private void initLines() {    mLineWidth = (int) (mWidth / mSoundNum * 0.7f);    mSpac = mWidth / (mSoundNum - 1);    mSoundList.clear();    chaos();  }  /**   * 生成凌亂的   */  private void chaos() {    for (int i = 0; i < mSoundNum; i++) {      int left = i * mSpac - mLineWidth / 2;      int right = i * mSpac + mLineWidth / 2;      SoundLine s = new SoundLine(left , right , 0 , mHeight);      s.setMode(SoundLine.SPEED_RAN);      s.setBorder(mMini , mMax);      mSoundList.add(s);    }  }  /**   * 生成波浪的   */  private void wave(){    // TODO 防止UI抽風  }  /**   * 生成有序的   */  private void order(){    // TODO 防止UI抽風  }}

SoundLine

/** * 語音音頻波紋的單個音波屬性 * Created by Mr.LongFace on 2017/9/16. */public class SoundLine implements ValueAnimator.AnimatorUpdateListener{  // 低 中 高 隨機 4擋  public static final int SPEED_LOW = 500;  public static final int SPEED_MID = 200;  public static final int SPEED_HEI = 0;  public static final int SPEED_RAN = 0;  private Random mRandom;  private ValueAnimator mAnim;  public int left , right , top , bottom;  private int min , max;  public SoundLine(int left , int right , int top , int bottom){    this.left = left;    this.right = right;    this.top = top;    this.bottom = bottom;    mRandom = new Random();    initAnim();  }  private void initAnim() {    mAnim = ValueAnimator.ofFloat(0.0f , 1.0f);    setMode(SPEED_MID);    mAnim.setRepeatCount(-1);    mAnim.setRepeatMode(ValueAnimator.REVERSE);    mAnim.addUpdateListener(this);  }  public void setMode(int mode){    if (mode == SPEED_RAN) {      mode = mRandom.nextInt(400);    }    mAnim.setDuration(300 + mode);  }  public void start(){    if (mAnim.isRunning()){      mAnim.end();    }    mAnim.start();  }  @Override  public void onAnimationUpdate(ValueAnimator valueAnimator) {    float f = (float) valueAnimator.getAnimatedValue();    top = (int) (f * (max - min) / 2);    bottom = max - top;  }  public void setBorder(int min, int max) {    this.min = min;    this.max = max;  }  public void stop() {    mAnim.end();    mAnim.cancel();  }}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 安乡县| 河源市| 乐山市| 钟祥市| 平顺县| 杨浦区| 石林| 卓尼县| 青铜峡市| 崇仁县| 青海省| 丰顺县| 民县| 静乐县| 东至县| 琼结县| 北票市| 炉霍县| 敦化市| 清苑县| 昆山市| 通渭县| 金湖县| 冕宁县| 顺平县| 巴彦淖尔市| 河间市| 柳林县| 盐津县| 高平市| 项城市| 安康市| 霍山县| 通化市| 蕲春县| 洱源县| 永城市| 宁阳县| 镇赉县| 乐亭县| 新安县|