Android——实现微信语音音量变化说话

来源:互联网 发布:emergency mode ubuntu 编辑:程序博客网 时间:2024/04/29 13:40

先上图:

这里写图片描述

这里写图片描述

这里将绑定下面的Button和Dialog,当然使用的是自定义View。

完了会附代码。

用代码说话:自定义Button

public class AudioButton extends Button {    private static final int DISTANCE_Y_CANCEL = 50;    private static final int STATE_NORMAL = 1;    private static final int STATE_RECODING = 2;    private static final int STATE_WANT_TO_CANCEL = 3;    private static final int STATE_TOO_SHORT = 4;    private int curState = STATE_NORMAL;    private boolean isRecoding;    private DialogManager dialogmanager;//用来管理dialog    public void setRecoding(boolean isRecoding) {        this.isRecoding = isRecoding;    }    public boolean isRecoding() {        return isRecoding;    }    public DialogManager getDialogmanager() {        return dialogmanager;    }    public void setDialogmanager(DialogManager dialogmanager) {        this.dialogmanager = dialogmanager;    }    public AudioButton(Context context) {        this(context, null);        // TODO Auto-generated constructor stub    }    public AudioButton(Context context, AttributeSet attrs) {        super(context, attrs);        // TODO Auto-generated constructor stub        dialogmanager = new DialogManager(getContext());        setOnLongClickListener(new OnLongClickListener() {            @Override            public boolean onLongClick(View v) {                // TODO Auto-generated method stub                // dialogmanager.showRecodingDialog();                // isRecoding=true;                return false;            }        });    }    @Override    public boolean onTouchEvent(MotionEvent event) {        // TODO Auto-generated method stub        int action = event.getAction();        int x = (int) event.getX();        int y = (int) event.getY();        switch (action) {        case MotionEvent.ACTION_DOWN:            isRecoding = true;            changeState(STATE_RECODING);            break;        case MotionEvent.ACTION_MOVE:            if (isRecoding) {                // 根据x,y的坐标是否取消                if (wantToCancel(x, y)) {                    changeState(STATE_WANT_TO_CANCEL);                } else {                    changeState(STATE_RECODING);                }            }            break;        case MotionEvent.ACTION_UP:            if (curState == STATE_RECODING) {            } else if (curState == STATE_WANT_TO_CANCEL) {                // cancel            }            dialogmanager.dimissRecodingDialog();            reset();            break;        default:            break;        }        return super.onTouchEvent(event);    }    /**     * 恢复标志位,状态     */    private void reset() {        // TODO Auto-generated method stub        isRecoding = false;        changeState(STATE_NORMAL);    }    private boolean wantToCancel(int x, int y) {        // TODO Auto-generated method stub        if (x < 0 || x > getWidth()) {            return true;        }        if (y < -DISTANCE_Y_CANCEL || y > getHeight() + DISTANCE_Y_CANCEL) {            return true;        }        return false;    }    private void changeState(int state) {        // TODO Auto-generated method stub        if (curState != state) {            curState = state;            switch (state) {            case STATE_NORMAL:                setText("按住 说话");                break;            case STATE_RECODING:                setText("松开 结束");                if (isRecoding) {                    // dialog recording                    dialogmanager.recoding();                }                break;            case STATE_WANT_TO_CANCEL:                setText("松开手指,取消发送");                // dialog cancel                dialogmanager.wanToCancel();                break;            case STATE_TOO_SHORT:                setText("录音时间过短!");                dialogmanager.tooShort();                break;            default:                break;            }        }    }}

DialogManager管理Dialog:

public class DialogManager {    private Dialog dialog;    private ImageView icon,voice;    private Context context;    private TextView lable;    public DialogManager (Context context)    {        this.context=context;    }    public void showRecodingDialog()    {        dialog=new Dialog(context, R.style.Theme_AudioDialog);        dialog.setContentView(R.layout.dialog_manager);        icon=(ImageView) dialog.findViewById(R.id.dialog_maik);        voice=(ImageView) dialog.findViewById(R.id.dialog_voice);        lable=(TextView) dialog.findViewById(R.id.dialog_lable);        dialog.show();    }    public void recoding()    {        if(dialog!=null&&dialog.isShowing())        {            icon.setVisibility(View.VISIBLE);            voice.setVisibility(View.VISIBLE);            lable.setVisibility(View.VISIBLE);            icon.setImageResource(R.drawable.recorder);            lable.setText("手指上滑,取消发送");        }    }    public void dimissRecodingDialog()    {        if(dialog!=null&&dialog.isShowing())        {            dialog.dismiss();            dialog=null;        }    }    public void wanToCancel()    {        if(dialog!=null&&dialog.isShowing())        {            icon.setVisibility(View.VISIBLE);            voice.setVisibility(View.GONE);            lable.setVisibility(View.VISIBLE);            icon.setImageResource(R.drawable.cancel);            lable.setText("松开手指,取消发送");        }    }    public void tooShort()    {        if(dialog!=null&&dialog.isShowing())        {            icon.setVisibility(View.VISIBLE);            voice.setVisibility(View.GONE);            lable.setVisibility(View.VISIBLE);            icon.setImageResource(R.drawable.voice_to_short);            lable.setText("录音时间过短!");        }    }    /**     * 通过level来显示声音图片的更新     * @param level     */    public void updateVoice(int level)    {        if(dialog!=null&&dialog.isShowing())        {            icon.setVisibility(View.VISIBLE);            voice.setVisibility(View.VISIBLE);            lable.setVisibility(View.VISIBLE);            int resId=context.getResources().getIdentifier("v"+level, "drawable", context.getPackageName());            voice.setImageResource(resId);        }    }}

这里为了方便 音量图片命名有规则更好一点v1-v7:

这里写图片描述

style:

<style name="Theme_AudioDialog" parent="@android:style/Theme.Dialog">        <item name="android:windowBackground">@android:color/transparent</item>        <item name="android:windowFrame">@null</item>        <item name="android:windowIsFloating">true</item>        <item name="android:windowIsTranslucent">true</item>        <item name="android:backgroundDimEnabled">false</item>    </style>

附一下资源文件:

res文件

在主界面可以用audiobutton.getDialogmanager()来获取dialog对象调用里面的方法。

原创粉丝点击