activity_main:
在LinearLayout中加入播放/暂停、停止、循环的按钮
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/btnPlayPause"
android:src="@android:drawable/ic_media_play"/>
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/btnStop"
android:src="@android:drawable/ic_menu_close_clear_cancel"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/btnloop"
android:text="Repeat"/>
</LinearLayout>
MainActivity:
实作MediaPlayer,并搭配生命周期完成三个按钮的功能
public class MainActivity extends AppCompatActivity implements MediaPlayer.OnPreparedListener, MediaPlayer.OnErrorListener, MediaPlayer.OnCompletionListener {
private ImageButton btnPlayPause,btnStop;
private MediaPlayer mediaPlayer = null;
private boolean isInit = true;
private Button repeat;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViews();
}
private void findViews(){
btnPlayPause = findViewById(R.id.btnPlayPause);
btnStop = findViewById(R.id.btnStop);
repeat = findViewById(R.id.btnloop);
btnPlayPause.setOnClickListener(PlayPauseListener);
btnStop.setOnClickListener(StopListener);
repeat.setOnClickListener(v->{
mediaPlayer.setLooping(true); //Repeat,False取消
});
}
protected void onResume(){
super.onResume();
mediaPlayer = new MediaPlayer();
Uri uri = Uri.parse("android.resource://"+ getPackageName() + "/" + R.raw.chain);
try{
mediaPlayer.setDataSource(this,uri);
}catch(Exception e){
Toast.makeText(getApplicationContext(),"档案读取错误",Toast.LENGTH_SHORT).show();
}
mediaPlayer.setOnPreparedListener(this);
mediaPlayer.setOnErrorListener(this);
mediaPlayer.setOnCompletionListener(this);
}
protected void onStop(){
super.onStop();
mediaPlayer.release();
mediaPlayer = null;
}
private View.OnClickListener PlayPauseListener = v -> {
if (mediaPlayer.isPlaying()) {
btnPlayPause.setImageResource(android.R.drawable.ic_media_play);
mediaPlayer.pause();
} else {
btnPlayPause.setImageResource(android.R.drawable.ic_media_pause);
if (isInit) {
mediaPlayer.prepareAsync();
isInit = false;
} else {
mediaPlayer.start();
}
}
};
private View.OnClickListener StopListener = v->{
mediaPlayer.stop();
isInit = true;
btnPlayPause.setImageResource(android.R.drawable.ic_media_play);
};
@Override
public void onCompletion(MediaPlayer mp) {
btnPlayPause.setImageResource(android.R.drawable.ic_media_play);
}
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
mp.release();
mp = null;
Toast.makeText(getApplicationContext(),"Error!!",Toast.LENGTH_SHORT).show();
return true;
}
@Override
public void onPrepared(MediaPlayer mp) {
mp.seekTo(0);
mp.start();
}
}
谢谢大家愿意花时间阅读,小弟弟我在此鞠躬
>>: Day 9:1046. Last Stone Weight
哈罗大家好~ 昨天介绍了 Microsoft Power Virtual Agents 智慧虚拟助理...
前面有提过,注入 Provider 的方式只需要在 constructor 设计参数并附上对应的型别...
今天我们来把前面做的五张工作表合成一张仪表板吧! 首先新增一张仪表板,名称为「107年6月_台湾各姓...
历行性的邮件报告,主旨和内容,一样的都要再打一次,要找之前那封,不好找.很花时间. 想到一个方法 历...
Point wise feed forward network 在两层全连阶层中加入一个relu的激...