国产探花免费观看_亚洲丰满少妇自慰呻吟_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開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 菏泽市| 启东市| 平谷区| 舒城县| 蓬莱市| 兴安盟| 叶城县| 江孜县| 南川市| 涟水县| 正定县| 红河县| 昌乐县| 大竹县| 白朗县| 甘洛县| 宜兰市| 石嘴山市| 美姑县| 桦川县| 宁南县| 吴忠市| 齐河县| 福安市| 靖江市| 柯坪县| 张家川| 兴城市| 彩票| 玉环县| 昭平县| 玉田县| 汾西县| 齐齐哈尔市| 兴国县| 耿马| 日喀则市| 拉孜县| 扬中市| 哈尔滨市| 三穗县|