논리적 설명
비디오 A가 재생 중일 때 비디오 A를 클릭하여 비디오 A의 나머지 콘텐츠를 건너뛰고 비디오 B를 로드합니다.
버그 설명
비디오를 전환할 때 다음 그림과 같이 짧은 검은색 화면이 표시됩니다.
솔루션
이 버그가 나타나는 것을 보았을 때 첫 번째 반응은 두 번째 비디오가 비디오를 초기화할 때 특정 지연이 있어 검은 화면이 나타나므로 이 지연을 채울 방법을 찾아야 한다는 것입니다.
특정 솔루션
먼저 비디오의 첫 번째 프레임을 가져옵니다. B.
FrameLayout을 상위 레이아웃으로 사용하고 최상위 레이어(즉, VideoView 상단)의 프레임 이미지를 덮습니다.
<FrameLayout 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:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent">
<xyz.doikki.videoplayer.player.VideoView
android:id="@+id/player"
android:layout_width="match_parent"
android:layout_height="match_parent">
</xyz.doikki.videoplayer.player.VideoView>
<ImageView
android:id="@+id/img_sleep"
android:visibility="gone"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@mipmap/sleep"
/>
</FrameLayout>
그런 다음 videoview의 클릭 이벤트를 수신하고 클릭 시 B 비디오를 로드하고 imageview의 가시성을 visible로 변경합니다.
player.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//A视频点击,加载B视频
currentStatus = 1;
AssetFileDescriptor fd = getResources().openRawResourceFd(R.raw.home);
player.setLooping(false);
player.setAssetFileDescriptor(fd);
player.replay(false);
img_sleep.setVisibility(VISIBLE);
}
});
그런 다음 videoView의 재생 상태 모니터링 메서드에서 호출합니다.
player.setOnStateChangeListener(new BaseVideoView.OnStateChangeListener() {
@Override
public void onPlayerStateChanged(int playerState) {
Log.e("SleepActivity", "onPlayerStateChanged: " + playerState);
}
@Override
public void onPlayStateChanged(int playState) {
Log.e("SleepActivity", "onPlayStateChanged: " + playState);
if (currentStatus == 1 && playState == 3) {
handler.postDelayed(new Runnable() {
// 开启的runnable也会在这个handler所依附线程中运行,即主线程
@Override
public void run() {
// 可更新UI或做其他事情
// 注意这里还在当前线程,没有开启新的线程
// new Runnable(){},只是把Runnable对象以Message形式post到UI线程里的Looper中执行,并没有新开线程。
img_sleep.setVisibility(View.GONE);
}
}, 80); // 延时80MS执行run内代码
}
}
});
위의 코드에 주의하세요. B 비디오가 재생되기 시작하면 프레임 이미지가 조기에 사라질 수 없습니다. 그렇지 않으면 검은 화면 효과가 있을 수 있으므로 여기에 80MS의 지연을 추가했습니다(하드웨어에 따라 적절한 값으로 변경). )
최종 효과
육안으로 보이는 검은 화면이 없는 것을 확연히 알 수 있다.
자, 이 무작위 공유는 여기서 끝납니다. 다음 호에서는 Android 및 JAVA에 대한 주요 제조업체의 인터뷰 요약 및 지식 맵을 공유 할 예정이며 관심있는 친구들은 저에게 주목해야합니다!
*** 모든 학생들의 관심을 환영합니다.다음으로 Java, 작은 프로그램, Android, 큰 프런트 엔드 및 풀 스택에 대한 지식이나 소스 코드를 자주 업데이트하고 공유하고 공유하고 함께 발전하도록 주장합니다.