前言:

最近做工具类项目,手机上小工具各种,有一个测量环境噪音分贝值的,个人对机车码表式显示忠爱(有点机车情节),网上和Android APP market 转了一圈尽没发现让人心动了。所以只能自己动手,做图,做定义控件去实现。

具体实现如下:

素材准备:

自定义控件 xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="center"
    android:orientation="vertical"><ImageView
        android:id="@+id/panel"
        android:layout_width="300dp"
        android:layout_height="300dp"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:scaleType="fitCenter"
        android:src="@drawable/panel__green" /><ImageView
        android:id="@+id/pointer"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerInParent="true"
        android:layout_gravity="center_horizontal"
        android:alpha="0.8"
        android:scaleType="centerInside"
        android:src="@drawable/pointer" /><LinearLayout
        android:layout_centerHorizontal="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingTop="50dp"
        android:layout_centerVertical="true"><TextView
            android:id="@+id/value"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:text="welcome to use Nosy test !" /><TextView
            android:id="@+id/maxvalue"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:paddingLeft="20dp"
            android:text="MAX:" /></LinearLayout></RelativeLayout>

自定义控件类:核心思路其实就是对ImageView 图片的旋转

public class PlateView extends RelativeLayout {public void setmMaxValue(double mMaxValue) {this.mMaxValue = mMaxValue;}private double mMaxValue =0;private ImageView mPanel;private ImageView mPointer;private TextView textView;private TextView maxTextView;private Matrix matrix = new Matrix();private Context mContext;private double mLastValue = 50;public double getValue() {return value;}public void setValue(double value) {mLastValue = this.value;this.value = value;if(Math.abs(mMaxValue)<Math.abs(this.value)){mMaxValue = this.value;}show();}private double value = 50;public PlateView(Context context) {super(context);}public PlateView(Context context, AttributeSet attrs) {super(context, attrs);mContext = context;LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);layoutInflater.inflate(R.layout.plate, this);mPanel = (ImageView) findViewById(R.id.panel);mPointer = (ImageView) findViewById(R.id.pointer);textView=(TextView) findViewById(R.id.value);maxTextView=(TextView) findViewById(R.id.maxvalue);show();}public void show() {float rotate = (float) (getValue() - this.mLastValue);if (Math.abs(rotate) > 0.1) {mPointer.setScaleType(ImageView.ScaleType.MATRIX); //required
            matrix.postRotate(rotate*8/5, mPointer.getWidth() / 2, mPointer.getHeight() / 2);mPointer.setImageMatrix(matrix);textView.setText(getValueText(getValue()));maxTextView.setText("MAX:"+getValueText(this.mMaxValue));invalidate();requestLayout();}}private String getValueText(double value){value+=0.0000001;String sRes =value+"";if(sRes.contains(".")){sRes = sRes.substring(0,sRes.indexOf(".")+3);}return sRes;}public int dip2px(Context context, float dpValue) {final float scale = context.getResources().getDisplayMetrics().density;return (int) (dpValue * scale + 0.5f);}public static int px2dip(Context context, float pxValue) {final float scale = context.getResources().getDisplayMetrics().density;return (int) (pxValue / scale + 0.5f);}}

分贝测量类:
public class AudioRecordDemo {private static final String TAG = "AudioRecord";static final int SAMPLE_RATE_IN_HZ = 8000;static final int BUFFER_SIZE = AudioRecord.getMinBufferSize(SAMPLE_RATE_IN_HZ,AudioFormat.CHANNEL_IN_DEFAULT, AudioFormat.ENCODING_PCM_16BIT);AudioRecord mAudioRecord;boolean isGetVoiceRun;Object mLock;private WeakReference<MainActivity> mActivity;public AudioRecordDemo(MainActivity activity) {mLock = new Object();mActivity = new WeakReference<>(activity);}public void sotp() {this.isGetVoiceRun = false;}public void getNoiseLevel() {if (isGetVoiceRun) {return;}mAudioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,SAMPLE_RATE_IN_HZ, AudioFormat.CHANNEL_IN_DEFAULT,AudioFormat.ENCODING_PCM_16BIT, BUFFER_SIZE);if (mAudioRecord == null) {}isGetVoiceRun = true;new Thread(new Runnable() {@Override
            public void run() {mAudioRecord.startRecording();short[] buffer = new short[BUFFER_SIZE];final MainActivity activity = mActivity.get();while (isGetVoiceRun) {int r = mAudioRecord.read(buffer, 0, BUFFER_SIZE);long v = 0;for (int i = 0; i < buffer.length; i++) {v += buffer[i] * buffer[i];}double mean = v / (double) r;final double volume = 10 * Math.log10(mean);Log.d(TAG, "db value:" + volume);if (null != activity) {activity.runOnUiThread(new Runnable() {@Override
                            public void run() {activity.plateView.setValue(volume);}});}// 大概一秒十次
                    synchronized (mLock) {try {mLock.wait(100);} catch (InterruptedException e) {e.printStackTrace();}}}mAudioRecord.stop();mAudioRecord.release();mAudioRecord = null;if (null != activity) {activity.runOnUiThread(new Runnable() {@Override
                        public void run() {activity.plateView.setmMaxValue(0);activity.plateView.setValue(1);}});}}}).start();}
}
记得加入Manifest 权限
<uses-permission android:name="android.permission.RECORD_AUDIO" />
Layout使用控件
<com.asus.function.antitouch.sound.PlateView
    android:id="@+id/soundplate"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/start"/>
Activity中代码:
audioRecordDemo = new AudioRecordDemo(this);plateView = (PlateView) findViewById(R.id.soundplate);start.setOnClickListener(new View.OnClickListener() {@Override
        public void onClick(View v) {if (start.getText().toString().equalsIgnoreCase(STOP)) {audioRecordDemo.sotp();start.setText(START);} else {audioRecordDemo.getNoiseLevel();start.setText(STOP);}}});
}

APP 效果图:

结语

图片素材质量差了些,但效果算达到预期,由于声音分贝值本身变化是线性的,所以即使这里我没有加入动画效果,指针的转动线性也是令人可以接受的。另外可惜没做好gif 图档上传。

Android 测试环境噪音分贝相关推荐

  1. android测试环境与条件,测试环境与实际运行环境之间可能存在的差异有哪些

    测试环境与实际运行环境之间可能存在的差异有哪些以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 测试环境与实际运行环境之间 ...

  2. Android测试环境配置

    测试是软件开发中非常重要的一部分,Android中是使用junit测试框架,本文使用的是junit4和Android Studio.Android测试主要分两类本地测试和Instrumented测试, ...

  3. android测试环境搭建

    瘦蛟舞 · 2014/07/24 14:22 0x01 测试机选择:真机or模拟器 1.1 三大主流模拟器对比 Android Emulator Android-x86 GenyMotion 价格 f ...

  4. c语言用麦克风检测环境噪音分贝,C# – 麦克风噪音检测

    我正在使用nAudio Library来捕获麦克风输入.但我遇到了一个问题. 我正在使用nAudio示例应用程序中的代码(我稍微修改过). 代码生成基于麦克风输入的WAV文件并将其呈现为波形.这是代码 ...

  5. 如何搭建基于C#和 Appium 的 Android自动测试环境

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 如果想做手机端的自动化测试,Appium是首选的测试框架,因为网上使用的人多,资料丰富,支持语言多 Jave ...

  6. Android测试入门学习

    一,Android测试新人练习--安装及文件传输 [课前准备] Android测试环境搭建 1.下载并安装JDK: http://www.oracle.com/technetwork/java/jav ...

  7. android+噪音测试,关于噪音测试App的选择与使用

    关于噪音测试App的选择与使用 2015-11-26 20:06:53 119点赞 224收藏 63评论 很多值友在写使用评测时都会对噪音大小进行测评,噪音污染在生活中无处不在,人们对噪声污染问题也越 ...

  8. android判断音频是否是噪音,声音检测器sound detector(噪音分贝检测)

    声音检测器sound detector(噪音分贝检测)是一款非常好用的手机噪音分贝检测软件,声音检测器sound detector(噪音分贝检测)软件使用起来非常的简单方便,可以让你清楚的了解到噪音的 ...

  9. 高房楼噪音测试软件,高层住宅噪音测试:11层分贝数高于其他楼层

    高层住宅噪音测试:11层分贝数高于其他楼层 中国广播网 2012-11-30 08:55 [摘要] 居住在喧嚣的城市里,回到家最希望能安安静静地休息一会.睡个安稳觉,然而这对很多临街居住的人来说却成了 ...

  10. Android官方开发文档Training系列课程中文版:Activity测试之测试环境配置

    原文地址:http://android.xsoftlab.net/training/activity-testing/index.html 引言 开发者应当将测试作为应用开发周期的一部分.良好的测试用 ...

最新文章

  1. 每日一篇——lodash—array——differenceBy
  2. hicoder - 1068 【RMQ or 线段树】
  3. Hibernate5-唯一查询和聚合查询
  4. left join 与left outer join的区别
  5. 晓庄学院计算机科学分数,2016南京晓庄学院艺术类专业录取分数线
  6. 撒花!PyTorch 官方教程中文版正式上线,激动人心的大好事!
  7. opengl 球纹理旋转源代码
  8. JAVA的静态方法的运算_java. util.Math类是数学相关的工具类,里面提供了大量的静态方法,完成与数学运算相关的操作。...
  9. 条件变量、pthread_cond_init
  10. C Primer Plus (第6版) 读书笔记_Chapter 1
  11. python 给类添加属性_python – 如何动态添加属性到类中?
  12. Oracle随机函数的取法
  13. python没基础能自学吗-50K大牛告诉你,没有任何编程基础,到底应该怎么自学Python...
  14. 新时代、新挑战、新机遇
  15. stl:sort(stl快速排序)
  16. 全国2013年最新电子地图矢量数据超图格SGD MAPINFO GST SMW SHP格式等
  17. 去除图片上的文字出现马赛克?
  18. 使用Git上传项目到Gitgub
  19. WebSocket实战之一
  20. Android平台挖矿木马研究报告

热门文章

  1. 2017年上半年软件设计师考试真题及答案(上午+下午)免费
  2. win10计算机安全策略设置,win10系统重置本地安全策略所有设置的操作方法
  3. petalinux install
  4. java软件工程师简历格式模板,重要概念一网打尽!
  5. ERP的总体结构(ERP的工作原理1)-------(转)
  6. eNSP配置VLAN间路由
  7. C# 之 TcpClient和Socket
  8. AcrelEMS-EV汽车制造能效管理系统解决方案
  9. 自考多媒体计算机技术,自考多媒体计算机技术.doc
  10. 实对称矩阵 二次型 合同 相似对角化