韩奇峰高级讲师
多年实战工作经验曾参与制作宝马Usage Training项目、DMS项目,奥迪全
息投影项目,奔驰等多家汽车门户行业大型项目,负责UI设计、界面设计、3D模型制作、前端开发等职务。
从事设计行业多年,精通PhotoShop、UI设计、AfterEffects、Flash、
Actionscript、HTML、CSS、JavaScript、jQuery、资深动画设计师,设计作品曾获得全国动画设计三等奖。
课程讲解注重实战应用,对讲述知识点穿插案例制作,使课程内容更加接近
工作中实际的项目。授课风格注重实战经验分析,深受学生喜欢。
Java工程师就业前景
Java工程师就业前景
2015年,在美国、加拿大、澳大利亚、新加坡等发达国家和中等发达国家,
JAVA软件工程师年薪均在4—15万美金,而在国内,JAVA软件工程师也有极好的工作机会和很高的薪水。
在未来5年内,合格软件人才的需求将远大于供给。JAVA软件工程师是目前
国际高端计算机领域就业薪资非常高的一类软件工程师。
一般情况下的JAVA软件工程师是分四个等级,从软件技术员到助理软件工程
师,再到软件工程师,**后成为高级软件工程师。
根据IDC的统计数字,在所有软件开发类人才的需求中,对JAVA工程师的需
求达到全部需求量的60%—70%。同时,JAVA软件工程师的工资待遇相对较高。
通常来说,具有3—5年开发经验的工程师,拥有年薪15万元是很正常的一个
薪酬水平。80%的学生毕业后年薪都超过了8万元。
根据专业数据分析,由于我国经济发展不均衡因素,JAVA软件工程师工资待
遇在城市之间的差异也较大,一级城市(如北京、上海等),初级软件工程师的待遇大概在4000-6000之间,中级软件工程师的待遇在6000—8000之间,
而高级软件工程师的待遇基本破万。
全新升级企业需求的Java课程
历经16年累计10余万Java学员。打造专业的课程体系,值得你的信赖
Java基础
深入解析Java基础,直击面试常见问题。——184课时
数据库
及Web前端技术
包含主流Oracle和MySQL数据库,先进的Web前端技术,热门的JS语言 ——160课时
Java Web
开发及服务端框架
定制开发企业级框架,教授Spring技术核心,企业开发部署环境,规范代码
开发流程及文档——176课时
综合项目实战
飞扬小鸟、飞机大战、俄罗斯方块、T-DMS数据采集项目、T-netctoss项目
、云笔记系统——136小时2W代码量
搭建自己网站
16小时课程实战演练
——企业扶持
android示波器,音频频谱绘制
>
很久没写过博客作技术总结了,主要是做着这行不比做业务或者其他的,会越做越没激情,慢慢的让自己丧失斗志,其他的话就不多说了,在工作中就能慢慢体会到了,今天将对音频播放方面的视图绘制作一次总结和分享,如果有这方面经验或者有更好idea的同学欢迎出来指正和分享。
下面就说说这个当播放音乐时,我们将对音频数据进行捕获,然后进行一个界面的绘制,这里我只是做了几种类型的绘制,这里只说其中一种类型,其他2个都很简单的算法就不论述了;
就来说说这个柱形绘制吧,先上代码,这里只有一个界面,点击可切换显示模式,先看看Activity的代码:
package com.asir.Flashview;
import android.annotation.SupPRessLint;
import android.app.Activity;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.audiofx.Visualizer;
import android.os.Bundle;
import android.view.ViewGroup;
import android.widget.LinearLayout;
@SuppressLint("NewApi")
public class FlashActivity extends Activity {
// 定义播放声音的MediaPlayer
private MediaPlayer mPlayer;
// 定义系统的示波器
private Visualizer mVisualizer;
private LinearLayout layout;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 设置控制音乐声音
setVolumeControlStream(AudioManager.STREAM_MUSIC);
layout = new LinearLayout(this);
layout.setOrientation(LinearLayout.VERTICAL);
setContentView(layout);
// 创建MediaPlayer对象
mPlayer = MediaPlayer.create(this, R.raw.test);
// 初始化示波器
setupVisualizer();
// 开发播放音乐
mPlayer.start();
}
private void setupVisualizer() {
// 创建PlayFlashView组件,用于显示波形图
final PlayFlashView mVisualizerView = new PlayFlashView(this);
mVisualizerView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
// 将MyVisualizerView组件添加到layout容器中
layout.addView(mVisualizerView);
// 以MediaPlayer的AudiosessionId创建Visualizer
// 相当于设置Visualizer负责显示该MediaPlayer的音频数据
mVisualizer = new Visualizer(mPlayer.getAudioSessionId());
mVisualizer.setCaptureSize(Visualizer.getCaptureSizeRange()[1]);
// 为mVisualizer设置监听器
mVisualizer.setDataCaptureListener(new Visualizer.OnDataCaptureListener() {
@Override
public void onFftDataCapture(Visualizer visualizer, byte[] fft, int samplingRate) {
// 用waveform波形数据更新mVisualizerView组件
mVisualizerView.updateVisualizer(fft);
}
@Override
public void onWaveFormDataCapture(Visualizer visualizer, byte[] waveform, int samplingRate) {
// 用waveform波形数据更新mVisualizerView组件
mVisualizerView.updateVisualizer(waveform);
}
}, Visualizer.getMaxCaptureRate() / 2, true, false);
mVisualizer.setEnabled(true);
}
@Override
protected void onPause() {
super.onPause();
if (isFinishing() && mPlayer != null) {
// 释放所有对象
mVisualizer.release();
mPlayer.release();
mPlayer = null;
}
}
}
然后再自定义一个view根据音频数据来绘制视图就好
package com.asir.flashview;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.audiofx.Visualizer;
import android.os.Bundle;
import android.view.ViewGroup;
import android.widget.LinearLayout;
@SuppressLint("NewApi")
public class FlashActivity extends Activity {
// 定义播放声音的MediaPlayer
private MediaPlayer mPlayer;
// 定义系统的示波器
private Visualizer mVisualizer;
private LinearLayout layout;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 设置控制音乐声音
setVolumeControlStream(AudioManager.STREAM_MUSIC);
layout = new LinearLayout(this);
layout.setOrientation(LinearLayout.VERTICAL);
setContentView(layout);
// 创建MediaPlayer对象
mPlayer = MediaPlayer.create(this, R.raw.beautiful);
// 初始化示波器
setupVisualizer();
// 开发播放音乐
mPlayer.start();
}
private void setupVisualizer() {
// 创建PlayFlashView组件,用于显示波形图
final PlayFlashView mVisualizerView = new PlayFlashView(this);
mVisualizerView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
// 将MyVisualizerView组件添加到layout容器中
layout.addView(mVisualizerView);
// 以MediaPlayer的AudioSessionId创建Visualizer
// 相当于设置Visualizer负责显示该MediaPlayer的音频数据
mVisualizer = new Visualizer(mPlayer.getAudioSessionId());
mVisualizer.setCaptureSize(Visualizer.getCaptureSizeRange()[1]);
// 为mVisualizer设置监听器
mVisualizer.setDataCaptureListener(new Visualizer.OnDataCaptureListener() {
@Override
public void onFftDataCapture(Visualizer visualizer, byte[] fft, int samplingRate) {
// 用waveform波形数据更新mVisualizerView组件
mVisualizerView.updateVisualizer(fft);
}
@Override
public void onWaveFormDataCapture(Visualizer visualizer, byte[] waveform, int samplingRate) {
// 用waveform波形数据更新mVisualizerView组件
mVisualizerView.updateVisualizer(waveform);
}
}, Visualizer.getMaxCaptureRate() / 2, true, false);
mVisualizer.setEnabled(true);
}
@Override
protected void onPause() {
super.onPause();
if (isFinishing() && mPlayer != null) {
// 释放所有对象
mVisualizer.release();
mPlayer.release();
mPlayer = null;
}
}
}
没用gif录制,就简单上个效果图好了:
大概就是这么一个显示方式。
首先先对代码思路做个解析,也方便以后自己回来使用时快速理清这个使用方法。先定义16个柱子即是16个音频数据,从回调方法中返回回来的数据长度是1024个字节,这边就利用**开始的16个字节来绘制就好了,定义两组音频bytes,一组是当前获取到的**新的字节数组,另外一组是上一次获取到的字节数组,这些个获取到的字节数中的每一个字节会根据音乐播放时频率的变化而变化,这边用**新的数据来绘制柱形图,然后用2组bytes数据来交替绘制柱子上方的横线,逻辑就这么一点,具体在代码中也注释的很清楚。主要是一个位置的问题,柱子和线的左右都可以**屏幕宽度固定好,高度跳动效果就用这个bytes就可以了,然后加一个开关,当音乐停止播放时就停止当前的绘制,就这么点东西,至于定义画笔,初始化数据什么的,我觉得也还真是没什么好说的了,到此柱形显示方式就算是实现了吧,
大家发挥自己的逻辑思维和使用数学不同算法去想象绘制更多炫丽的效果吧,到时记得也分享给我就好了
**后还有一个是音频播放时的权限:
源码点击**
后续有激情的话,将会对我学习到的android framework层这方面的知识作个总结和分享给大家.这方面的知识我也是不太懂欢迎来一起交流心得。
相关推荐:
苏州JAVA培训 苏州JAVA培训班 苏州JAVA培训机构