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

Android自定義View實(shí)現(xiàn)微信語(yǔ)音界面

 更新時(shí)間:2019年11月16日 10:30:53   作者:Black_Hao  
這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)微信語(yǔ)音界面,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

前言

因?yàn)樽罱捻?xiàng)目需要使用錄音功能,開始的想法是Button+OnTouchListener+Dialog實(shí)現(xiàn),在大部分手機(jī)中都沒問題,只有MI8會(huì)偶爾無(wú)法觸發(fā)MotionEvent.ACTION_UP,導(dǎo)致程序異常。所以就自己寫了個(gè)自定義View來實(shí)現(xiàn),主要也是通過監(jiān)聽
OnTouchListener+Dialog來實(shí)現(xiàn)。這里只實(shí)現(xiàn)了自定義View,并不涉及錄音和播放。效果圖如下:

代碼

代碼并不復(fù)雜,配合注釋應(yīng)該很容易理解。

/**
 * Author : BlackHao
 * Time : 2019/4/18 14:03
 * Description : 自定義錄音按鈕布局界面
 */
public class PressedView extends View implements View.OnTouchListener {

  private int normalRes;
  private String normalText = "";
  private int pressedRes;
  private String pressedText = "";
  //
  private Paint paint;
  private Rect rect;
  //當(dāng)前是否是按下狀態(tài)
  private boolean isPressed = false;
  //
  private PressCallback callback;
  //按下的位置y坐標(biāo)
  private int pressedY = 0;
  //當(dāng)前是否是outSize
  private boolean isOutSize = false;
  //字體dp大小
  private static int TEXT_SIZE = 20;
  //對(duì)話框相關(guān)
  private Dialog soundVolumeDialog = null;
  //音量圖片
  private ImageView soundVolumeImg = null;
  //對(duì)話框背景
  private RelativeLayout soundVolumeLayout = null;

  public PressedView(Context context) {
    super(context);
    init();
  }

  public PressedView(Context context, @Nullable AttributeSet attrs) {
    super(context, attrs);
    init();
  }

  public PressedView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    init();
  }

  private void init() {
    //
    paint = new Paint();
    paint.setAntiAlias(true);
    paint.setTextSize(DensityUtil.dip2px(getContext(), TEXT_SIZE));
    paint.setColor(Color.WHITE);
    rect = new Rect();
    //
    normalRes = R.drawable.blue_btn_bk;
    normalText = "按住 說話";
    pressedRes = R.drawable.red_btn_bk;
    pressedText = "松開 結(jié)束";
    //
    setOnTouchListener(this);
    //
    initSoundVolumeDlg();
  }

  @Override
  protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    rect.set(0, 0, getWidth(), getHeight());
    if (!isPressed) {
      setBackgroundResource(normalRes);
      drawTextOnRect(canvas, rect, normalText);
    } else {
      setBackgroundResource(pressedRes);
      drawTextOnRect(canvas, rect, pressedText);
    }
  }

  @Override
  public boolean onTouch(View v, MotionEvent event) {
    switch (event.getAction()) {
      case MotionEvent.ACTION_DOWN:
        pressedY = (int) event.getRawY();
        isOutSize = false;
        if (!isPressed) {
          isPressed = true;
          postInvalidate();
          if (callback != null) {
            //回調(diào)
            callback.onStartRecord();
            //按下,彈出對(duì)話框
            soundVolumeImg.setImageResource(R.mipmap.sound_volume_01);
            soundVolumeImg.setVisibility(View.VISIBLE);
            soundVolumeLayout.setBackgroundResource(R.mipmap.sound_volume_default_bk);
            soundVolumeDialog.show();
          }
        }
        break;
      case MotionEvent.ACTION_UP:
        if (isPressed) {
          isPressed = false;
          postInvalidate();
          if (callback != null) {
            int upY = (int) event.getRawY();
            if (pressedY - upY < getHeight()) {
              //錄音結(jié)束
              if (soundVolumeDialog.isShowing()) {
                soundVolumeDialog.dismiss();
              }
              callback.onStopRecord();
            } else {
              //錄音取消
              if (soundVolumeDialog.isShowing()) {
                soundVolumeDialog.dismiss();
              }
              callback.onCancelRecord();
            }
          }
        }
        break;
      case MotionEvent.ACTION_MOVE:
        if (isPressed && callback != null) {
          int upY = (int) event.getRawY();
          if (pressedY - upY < getHeight()) {
            if (isOutSize) {
              isOutSize = false;
              soundVolumeLayout.setBackgroundResource(R.mipmap.sound_volume_default_bk);
            }
          } else {
            if (!isOutSize) {
              isOutSize = true;
              soundVolumeLayout.setBackgroundResource(R.mipmap.sound_volume_cancel_bk);
            }
          }
        }
        break;
    }
    return true;
  }

  public void setCallback(PressCallback callback) {
    this.callback = callback;
  }

  public interface PressCallback {

    //開始錄音
    void onStartRecord();

    //停止錄音
    void onStopRecord();

    //取消錄音
    void onCancelRecord();
  }

  /**
   * 在指定矩形中間drawText
   *
   * @param canvas   畫布
   * @param targetRect 指定矩形
   * @param text    需要繪制的Text
   */
  private void drawTextOnRect(Canvas canvas, Rect targetRect, String text) {
    Paint.FontMetricsInt fontMetrics = paint.getFontMetricsInt();
    // 獲取baseLine
    int baseline = targetRect.top + (targetRect.bottom - targetRect.top - fontMetrics.bottom + fontMetrics.top) / 2 - fontMetrics.top;
    // 下面這行是實(shí)現(xiàn)水平居中,drawText對(duì)應(yīng)改為傳入targetRect.centerX()
    paint.setTextAlign(Paint.Align.CENTER);
    canvas.drawText(text, targetRect.centerX(), baseline, paint);
  }

  /**
   * 初始化音量信息對(duì)話框
   */
  private void initSoundVolumeDlg() {
    soundVolumeDialog = new Dialog(getContext(), R.style.SoundVolumeStyle);
    soundVolumeDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    soundVolumeDialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
        WindowManager.LayoutParams.FLAG_FULLSCREEN);
    soundVolumeDialog.setContentView(R.layout.tt_sound_volume_dialog);
    soundVolumeDialog.setCanceledOnTouchOutside(true);
    soundVolumeImg = (ImageView) soundVolumeDialog.findViewById(R.id.sound_volume_img);
    soundVolumeLayout = (RelativeLayout) soundVolumeDialog.findViewById(R.id.sound_volume_bk);
  }

  /**
   * 根據(jù)分貝值設(shè)置錄音時(shí)的音量動(dòng)畫
   */
  public void setVolume(int voiceValue) {
    if (voiceValue < 200.0) {
      soundVolumeImg.setImageResource(R.mipmap.sound_volume_01);
    } else if (voiceValue > 200.0 && voiceValue < 600) {
      soundVolumeImg.setImageResource(R.mipmap.sound_volume_02);
    } else if (voiceValue > 600.0 && voiceValue < 1200) {
      soundVolumeImg.setImageResource(R.mipmap.sound_volume_03);
    } else if (voiceValue > 1200.0 && voiceValue < 2400) {
      soundVolumeImg.setImageResource(R.mipmap.sound_volume_04);
    } else if (voiceValue > 2400.0 && voiceValue < 10000) {
      soundVolumeImg.setImageResource(R.mipmap.sound_volume_05);
    } else if (voiceValue > 10000.0 && voiceValue < 28000.0) {
      soundVolumeImg.setImageResource(R.mipmap.sound_volume_06);
    } else if (voiceValue > 28000.0) {
      soundVolumeImg.setImageResource(R.mipmap.sound_volume_07);
    }
  }

}

結(jié)語(yǔ)

源碼github地址:仿微信語(yǔ)音界面

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論

勃利县| 晴隆县| 安塞县| 响水县| 望奎县| 盘锦市| 天津市| 石楼县| 铅山县| 华阴市| 淳化县| 阳原县| 南涧| 潢川县| 延边| 伊金霍洛旗| 徐水县| 玉树县| 连州市| 高州市| 吉木乃县| 定西市| 孟连| 临澧县| 高淳县| 保康县| 西宁市| 樟树市| 自治县| 华坪县| 陵川县| 富阳市| 东阿县| 东平县| 宝丰县| 湛江市| 浦县| 大足县| 蒲江县| 常宁市| 山西省|