欢迎访问移动开发之家(rcyd.net),关注移动开发教程。移动开发之家  移动开发问答|  每日更新
页面位置 : > > > 内容正文

android模拟语音录入的麦克风功能,android麦克风,这样,如果是声音,可以先

来源: 开发者 投稿于  被查看 22395 次 评论:263

android模拟语音录入的麦克风功能,android麦克风,这样,如果是声音,可以先


Screenshot_2015-04-06-22-37-50.png

可以输入百分比来控制麦克风中黄色进度条的长度。这样,如果是声音,可以先将分贝转为百分比。

调用方法 setVolumePercent(double volumePercent)来设置百分比。

如下代码:


package com.lenovo.logistics.view.iflytek;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View;
import android.view.View.MeasureSpec;

public class SpeechingWidget extends View{
	private int selfWidth;
    private int selfHeight;
    
    private int border = 4;
    private Paint paint = new Paint();
    private int lineColor = 0xFFFFFFFF;
    private int margin01 = 10;//tuo与外圈的间距
    private int margin02 = 10;//内圈与外圈的间距
    private double volumePercent = 0;//音量大小的百分率
    
	
	public SpeechingWidget(Context context) {
		super(context);
	}
	public SpeechingWidget(Context context, AttributeSet attrs) {
		super(context, attrs);
	}
	public SpeechingWidget(Context context, AttributeSet attrs, int defStyleAttr) {
		super(context, attrs, defStyleAttr);
	}
	
	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		super.onMeasure(widthMeasureSpec, heightMeasureSpec);
		this.selfWidth = MeasureSpec.getSize(widthMeasureSpec);
		this.selfHeight = MeasureSpec.getSize(heightMeasureSpec); 
		
	}
	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);
		int startBottom = this.selfHeight;
		startBottom = drawDizuo(canvas, startBottom);
		startBottom = drawDizhu(canvas, startBottom);
		startBottom = drawTuo(canvas, startBottom);
		startBottom = drawWaiquan(canvas, startBottom);
		drawNeiquan(canvas, startBottom);
	}
    /**
     * 画底座
     */
	private int drawDizuo(Canvas canvas, int startBottom){
		paint.setStyle(Paint.Style.FILL);
		paint.setColor(lineColor);
		int width = this.selfWidth/5*3;
		int top = startBottom - border;
		int left = this.selfWidth /2 - width/2;
		int right = left + width;
		RectF rectF = new RectF(left, top, right , startBottom);
		canvas.drawRect(rectF, paint);	
		return top;
	}
	/**
	 * 画底柱
	 */
	private int drawDizhu(Canvas canvas, int startBottom){
		paint.setStyle(Paint.Style.FILL);
		paint.setColor(lineColor);
		int height = this.selfHeight /10;
		int top = startBottom - height;
		int left = this.selfWidth/2 - border/2;
		RectF rectF = new RectF(left, top, left+border , startBottom);
		canvas.drawRect(rectF, paint);
		return top;
	}
	/**
	 * 画麦克风的托
	 */
	private int drawTuo(Canvas canvas, int startBottom){
		paint.setStyle(Paint.Style.STROKE);
		paint.setStrokeWidth((float) border);
		paint.setAntiAlias(true);
		paint.setColor(lineColor);
		int left = 0;
		int top = startBottom - this.selfWidth;
		int right = this.selfWidth;
		int bottom = startBottom;
		RectF oval=new RectF();
		oval.left = left + border/2;
		oval.top = top + border/2;
		oval.right = right - border/2; 
		oval.bottom = bottom - border/2;		
		canvas.drawArc(oval, 0, 180, false, paint);
		return startBottom-border-margin01;
	}
	/**
	 * 画外圈
	 */
	private int drawWaiquan(Canvas canvas, int startBottom){
		paint.setStyle(Paint.Style.STROKE);
		paint.setStrokeWidth((float) border);
		paint.setAntiAlias(true);
		paint.setColor(lineColor);
		int width = this.selfWidth - border*2 - margin01*2;		
		//画下半部分的圆角
		int left = this.selfWidth/2 - width/2;
		int top = startBottom - width;
		int rectBottom = startBottom - width/2;
		int right = left + width;
		int bottom = startBottom;
		RectF oval=new RectF();
		oval.left = left + border/2;
		oval.top = top + border/2;
		oval.right = right - border/2; 
		oval.bottom = bottom - border/2;		
		canvas.drawArc(oval, 0, 180, false, paint);
		//画上半部分圆角
		top = 0;
		bottom = top + width;
		oval = new RectF();
		oval.left = left + border/2;
		oval.top = top + border/2;
		oval.right = right - border/2; 
		oval.bottom = bottom - border/2;		
		canvas.drawArc(oval, 180, 180, false, paint);
		//画矩形
		paint.setStyle(Paint.Style.FILL);
		top = width/2;
		bottom = rectBottom;
		RectF rectF = new RectF(left, top, left+border , bottom);
		canvas.drawRect(rectF, paint);
		rectF = new RectF(right-border, top, right , bottom);
		canvas.drawRect(rectF, paint);
		return startBottom - border - margin02;
	}
	/**
	 * 画内圈
	 */
	private void drawNeiquan(Canvas canvas, int startBottom){
		paint.setStyle(Paint.Style.FILL);
		paint.setAntiAlias(true);
		paint.setColor(0xFFFFA500);
		paint.setStrokeWidth((float) border);
		int width = this.selfWidth - border*2 - margin01*2 - margin02*2;
		int radius = width/2;
		int height = startBottom - border - margin02;
		//没有音量,直接返回
		if(this.volumePercent == 0)
			return ;
		double percent =radius*1.0/height * 100;
		if(percent == 0)
			return ;
		if(this.volumePercent<=percent){
			//画下半部分的圆角
			int left = this.selfWidth/2 - width/2;
			int top = startBottom - width;
			int topTemp = top + width/2;
			int right = left + width;
			int bottom = startBottom;
			RectF oval=new RectF();
			oval.left = left;
			oval.top = top;
			oval.right = right; 
			oval.bottom = bottom;		
			int per = (int)(90*1.0/percent);
			int angle = (int)(this.volumePercent * per);
			angle = 90-angle;
			canvas.drawArc(oval, angle, 180-angle*2, false, paint);	
			return ;
		}
		double rectPercent =(height - width)*1.0/height * 100;	
		if(this.volumePercent<=percent+rectPercent){
			//画下半部分的圆角
			int left = this.selfWidth/2 - width/2;
			int top = startBottom - width;
			int topTemp = startBottom - width/2;
			int right = left + width;
			int bottom = startBottom;
			RectF oval=new RectF();
			oval.left = left;
			oval.top = top;
			oval.right = right; 
			oval.bottom = bottom;
			canvas.drawArc(oval, 0, 180, false, paint);	
			//画矩形
			bottom = topTemp;
			int addHeight = (int)(((this.volumePercent-percent)*1.0/rectPercent)*(height-width));
			RectF rectF = new RectF(left, bottom-addHeight, right , bottom);
			canvas.drawRect(rectF, paint);
			return ;
		}
		if(this.volumePercent>percent+rectPercent){
			//画下半部分的圆角
			int left = this.selfWidth/2 - width/2;
			int top = startBottom - width;
			int right = left + width;
			int bottom = startBottom;
			RectF oval=new RectF();
			oval.left = left;
			oval.top = top;
			oval.right = right; 
			oval.bottom = bottom;
			canvas.drawArc(oval, 0, 180, false, paint);	
			int rectBottom = bottom - width/2;
			//画上半部分圆角
			top = border+margin02;
			bottom = top + width;				
			oval = new RectF();
			oval.left = left;
			oval.top = top;
			oval.right = right; 
			oval.bottom = bottom;
			//canvas.drawArc(oval, -90, 180, false, paint);
			double per = 90*1.0/percent;
			int angle = (int)((this.volumePercent-percent-rectPercent) * per);
			canvas.drawArc(oval, 0-angle, 180+angle*2, false, paint);	
			int rectTop = top + width/2;
			//画矩形
			paint.setColor(0xFFFFA500);
			RectF rectF = new RectF(left, rectTop, right , rectBottom);
			canvas.drawRect(rectF, paint);
			return ;
		}
	}
	public void setVolumePercent(double volumePercent) {
		this.volumePercent = volumePercent;
		this.invalidate();
	}
}


用户评论