现在的位置: 首页 > 综合 > 正文

android 自定义View用三张图片实现七个音量等级的录音效果

2018年04月05日 ⁄ 综合 ⁄ 共 3432字 ⁄ 字号 评论关闭

很多有发送语音功能的即时通讯软件中,在录音时都有音量变化的效果,如果QQ,微信,最近的易信。。。等等,若有7个音量的效果就需要7张图片,为了减少图片资源的容量,现在我们用三张图片来实现7个音量等级的效果。


实现重点:Region.Op.DIFFERENCE


看代码:

package com.open.widget;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.Region;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.View;

import com.open.widget.mic.R;

/**
 * 麦克风的录音效果
 * @author yanglonghui
 *
 */
public class AudioRecordMicView extends View{

	private Drawable micBgDrawable;
	private Drawable mic_1Drawable;
	private Drawable mic_2Drawable;
	private Rect micBgDrawableRect=new Rect();
	private Rect mic_1DrawableRect=new Rect();
	private Rect mic_2DrawableRect=new Rect();
	private Rect spaceRect=new Rect();
	private int maxLevel=7;
	
	public AudioRecordMicView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		init();
	}

	public AudioRecordMicView(Context context, AttributeSet attrs) {
		super(context, attrs);
		init();
	}

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

	private void init()
	{
		micBgDrawable=getResources().getDrawable(R.drawable.tooltip_mic_bg);
		mic_1Drawable=getResources().getDrawable(R.drawable.tooltip_mic_1);
		mic_2Drawable=getResources().getDrawable(R.drawable.tooltip_mic_2);
	}
	
	/**
	 * 设置录音的级数,从1-7
	 * @param level
	 */
	public void setLevel(int level)
	{
		int progress=level*mic_2DrawableRect.height()/maxLevel;
		setProgress(progress);
	}
	
	public void setMaxLevel(int maxLevel)
	{
		this.maxLevel=maxLevel;
	}
	
	public int getMaxLevel()
	{
		return maxLevel;
	}
	 
	private void setProgress(int progress)
	{
		int bottom=0;
		if(progress>mic_2DrawableRect.height())
		{
			bottom=0;
		}
		else
		{
			bottom=mic_2DrawableRect.height()-progress;
		}
		spaceRect.set(mic_2DrawableRect.left, mic_2DrawableRect.top, mic_2DrawableRect.right, mic_2DrawableRect.top+bottom);
		invalidate();
	}
	
	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		setMeasuredDimension(micBgDrawable.getIntrinsicWidth(), micBgDrawable.getIntrinsicHeight()); 
		
		micBgDrawableRect.set(0, 0, micBgDrawable.getIntrinsicWidth(), micBgDrawable.getIntrinsicHeight());
		micBgDrawable.setBounds(micBgDrawableRect);
		
		int left=(getMeasuredWidth()-mic_1Drawable.getIntrinsicWidth())/2;
		int top=(getMeasuredHeight()-mic_1Drawable.getIntrinsicHeight())/2;
		
		mic_1DrawableRect.set(left, top, left+mic_1Drawable.getIntrinsicWidth(), top+mic_1Drawable.getIntrinsicHeight());
		mic_1Drawable.setBounds(mic_1DrawableRect);
		
		mic_2DrawableRect.set(mic_1DrawableRect);
		mic_2Drawable.setBounds(mic_2DrawableRect);
		
		spaceRect.set(mic_1DrawableRect);
	}

	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);
		
		micBgDrawable.draw(canvas);
		mic_1Drawable.draw(canvas);
		
        canvas.save();
        canvas.clipRect(mic_2DrawableRect);
        canvas.clipRect(spaceRect,Region.Op.DIFFERENCE);
        mic_2Drawable.draw(canvas);
        canvas.restore();
	}
}

效果图如下:

测试代码如下:

package com.open.test;

import com.open.widget.AudioRecordMicView;
import com.open.widget.mic.R;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;

public class MainActivity extends Activity {

	private Handler mHandler=new Handler();
	private AudioRecordMicView mic;
	private int level=0;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		init();
	}

	
	private void init()
	{
		mic=(AudioRecordMicView)findViewById(R.id.mic);
		mHandler.post(new Runnable() {
			
			@Override
			public void run() {
				if(level>mic.getMaxLevel())
				{
					level=0;
				}
				
				mic.setLevel(level);
				level++;
				
				mHandler.postDelayed(this,500);
			}
		});
	}

}

有些网友说没有效果,麻烦删除36行level=4; 这句代码试试。

Demo地址:http://download.csdn.net/detail/zz7zz7zz/6920015

抱歉!评论已关闭.