
在一般情况下,小程序可能相对而言更容易入门,因为它通常是基于前端技术开发的,如HTML、CSS、JavaScript等,这些技术比较广泛和易于学习。此外,小程序通常只需要涉及基本的数据 *** 作,如读取API数据并展示出来,其实现难度相对较小,且在小程序开发工具中也提供了一定的可视化界面支持。
相比之下,数据可视化分析系统需要掌握更多的技术和知识,包括但不限于数据采集、数据处理、分析算法、图表设计等,同时需要具备较强的数学能力和数据分析能力。这需要一定程度的专业技能和培训,相对而言入门难度更高。
总之,在选择何种技术工具上,需要根据自己的需要以及技能背景进行综合考虑。
一、知晓云
知晓云是爱范儿旗下继知晓程序(minapp.com,媒体和小程序商店)后又一个基于微信生态的核心产品。
是国内第一个专注于微信小程序开发的BaaS(Backend as a Service)产品,它可以让开发者更快、更轻松地做出优美、稳定的小程序,且不失灵活性。
二、微信官方小程序开发工具
作为官方小程序开发工具,它只是个工具,而不是一个IDE。官方工具中的代码编辑功能,就是将vscode的代码编辑功能嵌入到工具中,不足以支撑开发。因为是官方工具所以微信官方小程序开发工具有着其他第三方平台不可比拟的天然优势。
三、Coolsite360
CoolSite360推出的小程序编辑器,可以帮助设计师无需编写wxml以及wxss代码,通过小程序可视化编辑器就可快速设计小程序交互UI。使用小程序编辑器设计的页面,可以方便地在微信及浏览器上预览,便于前期的原型展示分享。设计好的页面,可以一键导出符合小程序标准的代码,可直接进行功能开发。
四、即速应用
严格来说,即速应用不是为专业程序员准备的开发工具,但它绝对是一款功能非常强大的微信小程序制作工具。不懂技术不懂编程的小白,一定会爱上即速应用这款工具的。
import java.io.ByteArrayInputStreamimport java.io.ByteArrayOutputStream
import java.io.File
import java.io.InputStream
import org.eclipse.swt.SWT
import org.eclipse.swt.widgets.*
import org.eclipse.swt.events.*
import javax.sound.sampled.AudioFileFormat
import javax.sound.sampled.AudioFormat
import javax.sound.sampled.AudioInputStream
import javax.sound.sampled.AudioSystem
import javax.sound.sampled.DataLine
import javax.sound.sampled.SourceDataLine
import javax.sound.sampled.TargetDataLine
public class RecordPlay {
boolean stopCapture = false// 控制录音标志
AudioFormat audioFormat// 录音格式
// 读取数据:从TargetDataLine写入ByteArrayOutputStream录音
ByteArrayOutputStream byteArrayOutputStream
int totaldatasize = 0
TargetDataLine targetDataLine
// 播放数据:从AudioInputStream写入SourceDataLine播放
AudioInputStream audioInputStream
SourceDataLine sourceDataLine
private Button captureBtn
private Button stopBtn
private Button playBtn
private Button saveBtn
private Label myLabel
private Shell shell
private Display display
public RecordPlay() {
super()
display = new Display()
shell = new Shell(display)
shell.setSize(350, 150)
shell.setText("录音机程序")
//
myLabel = new Label(shell, SWT.NONE)
myLabel.setBounds(38, 21, 100, 18)
myLabel.setText("录音机")
// 创建按钮
captureBtn = new Button(shell, SWT.NONE)
captureBtn.setBounds(30, 61, 60, 18)
captureBtn.setText("录音")
captureBtn.setEnabled(true)
stopBtn = new Button(shell, SWT.NONE)
stopBtn.setBounds(100, 61, 60, 18)
stopBtn.setText("停止")
stopBtn.setEnabled(false)
playBtn = new Button(shell, SWT.NONE)
playBtn.setBounds(170, 61, 60, 18)
playBtn.setText("播放")
playBtn.setEnabled(false)
saveBtn = new Button(shell, SWT.NONE)
saveBtn.setBounds(240, 61, 60, 18)
saveBtn.setText("保存")
saveBtn.setEnabled(false)
// 注册录音事件
captureBtn.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent event) {
captureBtn.setEnabled(false)
stopBtn.setEnabled(true)
playBtn.setEnabled(false)
saveBtn.setEnabled(false)
// 开始录音
capture()
}
public void widgetDefaultSelected(SelectionEvent event) {
// text.setText("No worries!")
}
})
// 注册停止事件
stopBtn.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent event) {
captureBtn.setEnabled(true)
stopBtn.setEnabled(false)
playBtn.setEnabled(true)
saveBtn.setEnabled(true)
// 停止录音
stop()
}
public void widgetDefaultSelected(SelectionEvent event) {
// text.setText("No worries!")
}
})
// 注册播放事件
playBtn.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent event) {
// 播放录音
play()
}
public void widgetDefaultSelected(SelectionEvent event) {
// text.setText("No worries!")
}
})
// 注册保存事件
saveBtn.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent event) {
// 保存录音
save()
}
public void widgetDefaultSelected(SelectionEvent event) {
// text.setText("No worries!")
}
})
}
public void start() {
shell.open()
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep()
}
}
}
public static void main(String[] args) {
RecordPlay label = new RecordPlay()
label.start()
}
// (1)录音事件,保存到ByteArrayOutputStream中
private void capture() {
try {
// 打开录音
audioFormat = getAudioFormat()
DataLine.Info dataLineInfo = new DataLine.Info(
TargetDataLine.class, audioFormat)
targetDataLine = (TargetDataLine) AudioSystem.getLine(dataLineInfo)
targetDataLine.open(audioFormat)
targetDataLine.start()
// 创建独立线程进行录音
Thread captureThread = new Thread(new CaptureThread())
captureThread.start()
} catch (Exception e) {
e.printStackTrace()
System.exit(0)
}
}
// (2)播放ByteArrayOutputStream中的数据
private void play() {
try {
// 取得录音数据
byte audioData[] = byteArrayOutputStream.toByteArray()
// 转换成输入流
InputStream byteArrayInputStream = new ByteArrayInputStream(
audioData)
AudioFormat audioFormat = getAudioFormat()
audioInputStream = new AudioInputStream(byteArrayInputStream,
audioFormat, audioData.length / audioFormat.getFrameSize())
DataLine.Info dataLineInfo = new DataLine.Info(
SourceDataLine.class, audioFormat)
sourceDataLine = (SourceDataLine) AudioSystem.getLine(dataLineInfo)
sourceDataLine.open(audioFormat)
sourceDataLine.start()
// 创建独立线程进行播放
Thread playThread = new Thread(new PlayThread())
playThread.start()
} catch (Exception e) {
e.printStackTrace()
System.exit(0)
}
}
// (3)停止录音
public void stop() {
stopCapture = true
}
// (4)保存文件
public void save() {
// 取得录音输入流
AudioFormat audioFormat = getAudioFormat()
byte audioData[] = byteArrayOutputStream.toByteArray()
InputStream byteArrayInputStream = new ByteArrayInputStream(audioData)
audioInputStream = new AudioInputStream(byteArrayInputStream,
audioFormat, audioData.length / audioFormat.getFrameSize())
// 写入文件
try {
File file = new File("d:/myjava/test.wav")
AudioSystem
.write(audioInputStream, AudioFileFormat.Type.WAVE, file)
} catch (Exception e) {
e.printStackTrace()
}
}
// 取得AudioFormat
private AudioFormat getAudioFormat() {
float sampleRate = 16000.0F
// 8000,11025,16000,22050,44100
int sampleSizeInBits = 16
// 8,16
int channels = 1
// 1,2
boolean signed = true
// true,false
boolean bigEndian = false
// true,false
return new AudioFormat(sampleRate, sampleSizeInBits, channels, signed,
bigEndian)
}
class PlayThread extends Thread {
byte tempBuffer[] = new byte[10000]
public void run() {
try {
int cnt
// 读取数据到缓存数据
while ((cnt = audioInputStream.read(tempBuffer, 0,
tempBuffer.length)) != -1) {
if (cnt >0) {
// 写入缓存数据
sourceDataLine.write(tempBuffer, 0, cnt)
}
}
// Block等待临时数据被输出为空
sourceDataLine.drain()
sourceDataLine.close()
} catch (Exception e) {
e.printStackTrace()
System.exit(0)
}
}
}
class CaptureThread extends Thread {
// 临时数组
byte tempBuffer[] = new byte[10000]
public void run() {
byteArrayOutputStream = new ByteArrayOutputStream()
totaldatasize = 0
stopCapture = false
try {// 循环执行,直到按下停止录音按钮
while (!stopCapture) {
// 读取10000个数据
int cnt = targetDataLine.read(tempBuffer, 0,
tempBuffer.length)
if (cnt >0) {
// 保存该数据
byteArrayOutputStream.write(tempBuffer, 0, cnt)
totaldatasize += cnt
}
}
byteArrayOutputStream.close()
} catch (Exception e) {
e.printStackTrace()
System.exit(0)
}
}
}
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)