欧美大屁股bbbbxxxx,狼人大香伊蕉国产www亚洲,男ji大巴进入女人的视频小说,男人把ji大巴放进女人免费视频,免费情侣作爱视频

歡迎來(lái)到入門(mén)教程網(wǎng)!

Android

當(dāng)前位置:主頁(yè) > 軟件編程 > Android >

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

來(lái)源:本站原創(chuàng)|時(shí)間:2020-01-10|欄目:Android|點(diǎn)擊: 次

前言

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

代碼

代碼并不復(fù)雜,配合注釋?xiě)?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īng)顟B(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 = "按住 說(shuō)話";
    pressedRes = R.drawable.red_btn_bk;
    pressedText = "松開(kāi) 結(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 {

    //開(kāi)始錄音
    void onStartRecord();

    //停止錄音
    void onStopRecord();

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

  /**
   * 在指定矩形中間drawText
   *
   * @param canvas   畫(huà)布
   * @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)畫(huà)
   */
  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í)有所幫助,也希望大家多多支持我們。

上一篇:Android實(shí)現(xiàn)懸浮窗全系統(tǒng)版本

欄    目:Android

下一篇:Android仿微信錄音功能(錄音后的raw文件轉(zhuǎn)mp3文件)

本文標(biāo)題:Android自定義View實(shí)現(xiàn)微信語(yǔ)音界面

本文地址:http://mengdiqiu.com.cn/a1/Android/9083.html

網(wǎng)頁(yè)制作CMS教程網(wǎng)絡(luò)編程軟件編程腳本語(yǔ)言數(shù)據(jù)庫(kù)服務(wù)器

如果侵犯了您的權(quán)利,請(qǐng)與我們聯(lián)系,我們將在24小時(shí)內(nèi)進(jìn)行處理、任何非本站因素導(dǎo)致的法律后果,本站均不負(fù)任何責(zé)任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網(wǎng) 版權(quán)所有