代码
使用控件Chronometer即可实现,很简单
xml布局
先看xml布局,有两个button,一个Chronometer控件和一个提示录制状态的TextView空间
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:orientation="vertical"
android:background="@drawable/pic4"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="300dp"
android:orientation="vertical"
android:gravity="center">
<TextView
android:id="@+id/text1"
android:layout_width="match_parent"
android:layout_height="100dp"
android:gravity="center"
android:text="正在录音"
android:textSize="35dp"
android:textColor="#000000"
android:visibility="invisible"
/>
<Chronometer
android:layout_width="match_parent"
android:layout_height="200dp"
android:format="00:00:00"
android:gravity="center"
android:textSize="70dp"
android:id="@+id/timer"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:layout_gravity="center">
<Button
android:id="@+id/start"
android:layout_width="120dp"
android:layout_height="60dp"
android:layout_gravity="center"
android:text="开始"
android:textStyle="bold"
android:layout_marginTop="10dp"
android:background="@drawable/bt_shape"
android:textColor="#000000"
android:onClick="start"
>
</Button>
<Button
android:id="@+id/stop"
android:layout_width="120dp"
android:layout_height="60dp"
android:layout_gravity="center"
android:text="停止"
android:layout_marginTop="10dp"
android:background="@drawable/bt_shape"
android:textColor="#000000"
android:textStyle="bold"
android:onClick="stop"
android:visibility="invisible"
>
</Button>
</LinearLayout>
</LinearLayout>
java控制代码
package com.example.myaudiorecorder;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.Button;
import android.widget.Chronometer;
import android.view.View;
import android.os.SystemClock;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private Chronometer timer;
private int state;//是否已经开始录音,0-停止,1-开始,2-暂停
private Button startButtom;
private Button stopButton;
private TextView note;
private static long elaspedTime = 0;//继续暂停时间,方便暂停后继续计时
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
timer = (Chronometer) findViewById(R.id.timer);
startButtom= (Button)findViewById(R.id.start);
stopButton=(Button)findViewById(R.id.stop) ;
note =(TextView)findViewById(R.id.text1);
state=0;
}
public void start(View view){
//stopButton.setEnabled(true);
stopButton.setVisibility(View.VISIBLE);//设置停止按钮可见
if(state==0){//开始录音
state=1;
startButtom.setText("暂停");
timer.setBase(SystemClock.elapsedRealtime());//计时器清零
int hour = (int) ((SystemClock.elapsedRealtime() - timer.getBase()) / 1000 / 3600);
timer.setFormat("0"+String.valueOf(hour)+":%s");
//Log.d("start:",String.valueOf(SystemClock.elapsedRealtime() - timer.getBase()));
timer.start();
note.setVisibility(View.VISIBLE);
}
else if(state==1){//点击了暂停
timer.stop();
//Log.d("pause:",String.valueOf(SystemClock.elapsedRealtime() - timer.getBase()));
//保存暂停时间,方便后续继续开始,时间不会错
elaspedTime = SystemClock.elapsedRealtime()-timer.getBase();
state=2;
startButtom.setText("开始");
note.setText("已暂停");//提示栏
}
else {//暂停后重新开始
//重新设置基准
timer.setBase(SystemClock.elapsedRealtime()-elaspedTime);
int hour = (int) ((SystemClock.elapsedRealtime() - timer.getBase()) / 1000 / 3600);
timer.setFormat("0"+String.valueOf(hour)+":%s");
//Log.d("restart:",String.valueOf(SystemClock.elapsedRealtime() - timer.getBase()));
timer.start();
state=1;
startButtom.setText("暂停");
note.setText("正在录音");//提示栏
}
}
public void stop(View view){
elaspedTime=0;
state=0;
startButtom.setText("开始");
stopButton.setVisibility(View.INVISIBLE);//同时设置停止按钮不可见
note.setVisibility(View.INVISIBLE);
timer.setBase(SystemClock.elapsedRealtime());//计时器清零
timer.setFormat("00:%s");
timer.stop();
}
}
效果图
开始计时前只有一个开始按钮
开始计时后,弹出“停止”按钮可停止计时,同时“开始”按钮变为“暂停”按钮