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

来源:互联网 发布:炫彩软件 编辑:程序博客网 时间:2024/06/05 10:49

很多有发送语音功能的即时通讯软件中,在录音时都有音量变化的效果,如果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();}@Overrideprotected 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);}@Overrideprotected 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;@Overrideprotected 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() {@Overridepublic 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


原创粉丝点击