desc:视频播放界面增加音量控制

main
xiaowusky 1 year ago
parent 4ac9e9dc96
commit 04ea52e7f9

@ -9,12 +9,14 @@ import android.view.LayoutInflater.Factory2
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.EditText import android.widget.EditText
import android.widget.ImageButton
import android.widget.LinearLayout import android.widget.LinearLayout
import android.widget.RelativeLayout import android.widget.RelativeLayout
import android.widget.SeekBar import android.widget.SeekBar
import android.widget.TextView import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.AppCompatRadioButton import androidx.appcompat.widget.AppCompatRadioButton
import androidx.core.view.postDelayed
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.common.commonlib.utils.LogUtils import com.common.commonlib.utils.LogUtils
import com.loper7.date_time_picker.number_picker.NumberPicker import com.loper7.date_time_picker.number_picker.NumberPicker
@ -174,6 +176,7 @@ abstract class BaseActivity : AppCompatActivity() {
"androidx.appcompat.widget.AppCompatRadioButton" -> AppCompatRadioButton(context, attrs) "androidx.appcompat.widget.AppCompatRadioButton" -> AppCompatRadioButton(context, attrs)
"SeekBar" -> SeekBar(context, attrs) "SeekBar" -> SeekBar(context, attrs)
"EditText" -> EditText(context, attrs) "EditText" -> EditText(context, attrs)
"ImageButton" -> ImageButton(context, attrs)
else -> { else -> {
null null
} }
@ -184,6 +187,10 @@ abstract class BaseActivity : AppCompatActivity() {
baseBinding.topBar.tryFocusBackArea() baseBinding.topBar.tryFocusBackArea()
} }
fun isBackFocused(): Boolean {
return currentFocus == baseBinding.topBar.getBackArea()
}
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
if (!isHome) { if (!isHome) {
@ -213,10 +220,12 @@ abstract class BaseActivity : AppCompatActivity() {
val repeatCount = event.repeatCount val repeatCount = event.repeatCount
val keyCode = event.keyCode val keyCode = event.keyCode
if (KeyEvent.KEYCODE_DPAD_LEFT == keyCode || KeyEvent.KEYCODE_DPAD_RIGHT == keyCode) { if (KeyEvent.KEYCODE_DPAD_LEFT == keyCode || KeyEvent.KEYCODE_DPAD_RIGHT == keyCode) {
if (isLeftRightLongPress) { if (isLeftRightLongPress && baseBinding.areaSound.visibility == View.VISIBLE) {
baseBinding.areaSound.postDelayed(300) {
lastFocusView?.requestFocus() lastFocusView?.requestFocus()
baseBinding.areaSound.visibility = View.GONE baseBinding.areaSound.visibility = View.GONE
volumeUtil.mediaVolume = baseBinding.sbSound.progress volumeUtil.mediaVolume = baseBinding.sbSound.progress
}
return true return true
} }
} else if (keyCode == KeyEvent.KEYCODE_ENTER) { } else if (keyCode == KeyEvent.KEYCODE_ENTER) {
@ -237,9 +246,9 @@ abstract class BaseActivity : AppCompatActivity() {
private fun dealActionDown(event: KeyEvent): Boolean { private fun dealActionDown(event: KeyEvent): Boolean {
val repeatCount = event.repeatCount val repeatCount = event.repeatCount
val keyCode = event.keyCode val keyCode = event.keyCode
if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT || keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) { if (KeyEvent.KEYCODE_DPAD_LEFT == keyCode || KeyEvent.KEYCODE_DPAD_RIGHT == keyCode) {
isLeftRightLongPress = repeatCount != 0 isLeftRightLongPress = repeatCount > 10
if (repeatCount > 10) { if (isLeftRightLongPress && currentFocus !is SeekBar) {
val visibility = baseBinding.areaSound.visibility val visibility = baseBinding.areaSound.visibility
if (View.GONE == visibility) { if (View.GONE == visibility) {
lastFocusView = currentFocus lastFocusView = currentFocus

@ -36,16 +36,18 @@ import android.view.ViewConfiguration;
import android.view.WindowManager; import android.view.WindowManager;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
import androidx.core.view.ViewCompat; import androidx.core.view.ViewCompat;
import androidx.core.view.ViewConfigurationCompat; import androidx.core.view.ViewConfigurationCompat;
import com.bumptech.glide.Glide; import com.bumptech.glide.Glide;
import com.yinuo.safetywatcher.databinding.ActivityMainProBinding; import com.yinuo.safetywatcher.databinding.ActivityMainProBinding;
import com.yinuo.safetywatcher.watcher.base.NoOptionsActivity;
import tv.danmaku.ijk.media.player.IMediaPlayer; import tv.danmaku.ijk.media.player.IMediaPlayer;
public class ProVideoActivity extends AppCompatActivity { public class ProVideoActivity extends NoOptionsActivity {
private static final String TAG = "ProVideoActivity"; private static final String TAG = "ProVideoActivity";
public static final int REQUEST_WRITE_STORAGE = 111; public static final int REQUEST_WRITE_STORAGE = 111;
@ -63,17 +65,112 @@ public class ProVideoActivity extends AppCompatActivity {
@SuppressLint("ClickableViewAccessibility") @SuppressLint("ClickableViewAccessibility")
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
View decorView = getWindow().getDecorView(); View decorView = getWindow().getDecorView();
decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE); decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
getWindow().setStatusBarColor(Color.TRANSPARENT); getWindow().setStatusBarColor(Color.TRANSPARENT);
} }
mBinding = ActivityMainProBinding.inflate(getLayoutInflater()); mBinding = ActivityMainProBinding.inflate(getLayoutInflater());
setContentView(mBinding.getRoot()); super.onCreate(savedInstanceState);
}
// @Override
// public boolean onKeyDown(int keyCode, KeyEvent event) {
// if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
// mVideoView.toggleMediaControlsVisiblity();
// return true;
// } else if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) {
// mediaController.rewindVideo();
// return true;
// } else if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) {
// mediaController.fastVideo();
// return true;
// } else {
// return super.onKeyDown(keyCode, event);
// }
// }
@Override
public boolean dispatchKeyEvent(@NonNull KeyEvent event) {
if (!mediaController.isShowing() && !isBackFocused()) {
mVideoView.toggleMediaControlsVisiblity();
return true;
}
return super.dispatchKeyEvent(event);
}
@Override
protected void onStop() {
super.onStop();
mVideoView.stopPlayback();
}
@Override
protected void onDestroy() {
super.onDestroy();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
LinearLayout container = mBinding.playerContainer;
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
setNavVisibility(false);
// 横屏情况 播放窗口横着排开
container.setOrientation(LinearLayout.HORIZONTAL);
} else {
// 竖屏,取消全屏状态
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
setNavVisibility(true);
// 竖屏情况 播放窗口竖着排开
container.setOrientation(LinearLayout.VERTICAL);
}
}
public boolean isLandscape() {
int orientation = getResources().getConfiguration().orientation;
return orientation == ORIENTATION_LANDSCAPE;
}
public void setNavVisibility(boolean visible) {
if (!ViewConfigurationCompat.hasPermanentMenuKey(ViewConfiguration.get(this))) {
int newVis = View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
if (!visible) {
newVis |= View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE;
}
// If we are now visible, schedule a timer for us to go invisible. Set the new desired visibility.
getWindow().getDecorView().setSystemUiVisibility(newVis);
}
}
public void onChangeOrientation(View view) {
setRequestedOrientation(isLandscape() ? ActivityInfo.SCREEN_ORIENTATION_PORTRAIT : ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
public void onChangePlayMode(View view) {
mMode = mVideoView.toggleAspectRatio();
Log.i(TAG, "画面模式:" + mMode);
}
@NonNull
@Override
public View generateContentView() {
if (mBinding != null) {
return mBinding.getRoot();
}
return null;
}
@Override
public void initView() {
// mBinding = ActivityMainProBinding.inflate(getLayoutInflater());
// setContentView(mBinding.getRoot());
// handle arguments // handle arguments
mVideoPath = getIntent().getStringExtra("videoPath"); mVideoPath = getIntent().getStringExtra("videoPath");
@ -214,79 +311,21 @@ public class ProVideoActivity extends AppCompatActivity {
// detector.onTouchEvent(event); // detector.onTouchEvent(event);
// return true; // return true;
// }); // });
} View backArea = getBaseBinding().topBar.getBackArea();
int backAreaId = backArea.getId();
backArea.setNextFocusRightId(backAreaId);
backArea.setNextFocusLeftId(backAreaId);
backArea.setOnKeyListener(new View.OnKeyListener() {
@Override @Override
public boolean onKeyDown(int keyCode, KeyEvent event) { public boolean onKey(View v, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) { if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN) {
mVideoView.toggleMediaControlsVisiblity(); if (event.getAction() == KeyEvent.ACTION_DOWN) {
return true; mediaController.tryFocusSelf();
} else if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) {
mediaController.rewindVideo();
return true; return true;
} else if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) {
mediaController.fastVideo();
return true;
} else {
return super.onKeyDown(keyCode, event);
} }
} }
return false;
@Override
protected void onStop() {
super.onStop();
mVideoView.stopPlayback();
}
@Override
protected void onDestroy() {
super.onDestroy();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
LinearLayout container = mBinding.playerContainer;
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
setNavVisibility(false);
// 横屏情况 播放窗口横着排开
container.setOrientation(LinearLayout.HORIZONTAL);
} else {
// 竖屏,取消全屏状态
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
setNavVisibility(true);
// 竖屏情况 播放窗口竖着排开
container.setOrientation(LinearLayout.VERTICAL);
}
}
public boolean isLandscape() {
int orientation = getResources().getConfiguration().orientation;
return orientation == ORIENTATION_LANDSCAPE;
}
public void setNavVisibility(boolean visible) {
if (!ViewConfigurationCompat.hasPermanentMenuKey(ViewConfiguration.get(this))) {
int newVis = View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
if (!visible) {
newVis |= View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE;
}
// If we are now visible, schedule a timer for us to go invisible. Set the new desired visibility.
getWindow().getDecorView().setSystemUiVisibility(newVis);
}
}
public void onChangeOrientation(View view) {
setRequestedOrientation(isLandscape() ? ActivityInfo.SCREEN_ORIENTATION_PORTRAIT : ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
} }
});
public void onChangePlayMode(View view) {
mMode = mVideoView.toggleAspectRatio();
Log.i(TAG, "画面模式:" + mMode);
} }
} }

@ -61,7 +61,7 @@ public class VideoControllerView extends FrameLayout implements IMediaController
private TextView mCurrentTime; // 当前播放时间点 private TextView mCurrentTime; // 当前播放时间点
private TextView mEndTime; // 总时长 private TextView mEndTime; // 总时长
private View mControlView; // private View mControlView;
private ImageButton mPauseButton; // 暂停or开始 private ImageButton mPauseButton; // 暂停or开始
private ImageButton mFastButton; // 快进 private ImageButton mFastButton; // 快进
private ImageButton mRewindButton; // 快退 private ImageButton mRewindButton; // 快退
@ -233,8 +233,11 @@ public class VideoControllerView extends FrameLayout implements IMediaController
doPauseResume(); doPauseResume();
show(sDefaultTimeout); show(sDefaultTimeout);
if (mControlView != null) { // if (mControlView != null) {
mControlView.requestFocus(); // mControlView.requestFocus();
// }
if (mProgress != null) {
mProgress.requestFocus();
} }
} }
@ -349,15 +352,19 @@ public class VideoControllerView extends FrameLayout implements IMediaController
if (!mShowing && mAnchor != null) { if (!mShowing && mAnchor != null) {
setProgress(); setProgress();
if (mControlView != null) { // if (mControlView != null) {
mControlView.requestFocus(); // mControlView.requestFocus();
// }
if (mProgress != null) {
mProgress.requestFocus();
} }
disableUnsupportedButtons(); disableUnsupportedButtons();
LayoutParams tlp = new LayoutParams( LayoutParams tlp = new LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT,
Gravity.BOTTOM); Gravity.BOTTOM);
if (mAnchor instanceof ViewGroup) { if (mAnchor instanceof ViewGroup) {
@ -440,39 +447,39 @@ public class VideoControllerView extends FrameLayout implements IMediaController
v.findViewById(R.id.seek_bar_container).setVisibility(VISIBLE); v.findViewById(R.id.seek_bar_container).setVisibility(VISIBLE);
} }
View backArea = v.findViewById(R.id.back_area); // View backArea = v.findViewById(R.id.back_area);
backArea.setOnClickListener(v1 -> { // backArea.setOnClickListener(v1 -> {
if (mContext instanceof Activity) { // if (mContext instanceof Activity) {
((Activity) mContext).finish(); // ((Activity) mContext).finish();
} // }
}); // });
setCommonBg(backArea); // setCommonBg(backArea);
mControlView = v.findViewById(R.id.control_area); // mControlView = v.findViewById(R.id.control_area);
mControlView.setOnKeyListener((v12, keyCode, event) -> { // mControlView.setOnKeyListener((v12, keyCode, event) -> {
if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER || keyCode == KeyEvent.KEYCODE_ENTER) { // if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER || keyCode == KeyEvent.KEYCODE_ENTER) {
if (event.getAction() == KeyEvent.ACTION_DOWN) { // if (event.getAction() == KeyEvent.ACTION_DOWN) {
mPauseButton.performClick(); // mPauseButton.performClick();
} // }
return true; // return true;
} // }
return false; // return false;
}); // });
setCommonBg(mControlView); // setCommonBg(mControlView);
mControlView.requestFocus(); // mControlView.requestFocus();
} }
private void setCommonBg(View v) { // private void setCommonBg(View v) {
StateListDrawable bg = new StateListDrawable(); // StateListDrawable bg = new StateListDrawable();
Drawable currentBackground = v.getBackground(); // Drawable currentBackground = v.getBackground();
Drawable drawable = AppCompatResources.getDrawable( // Drawable drawable = AppCompatResources.getDrawable(
mContext, // mContext,
com.yinuo.safetywatcher.R.drawable.focus_bg // com.yinuo.safetywatcher.R.drawable.focus_bg
); // );
bg.addState(new int[]{android.R.attr.state_focused}, drawable); // bg.addState(new int[]{android.R.attr.state_focused}, drawable);
bg.addState(new int[]{}, currentBackground); // bg.addState(new int[]{}, currentBackground);
v.setBackground(bg); // v.setBackground(bg);
} // }
/** /**
* Отключить паузу или seek button, если поток не может быть приостановлена * Отключить паузу или seek button, если поток не может быть приостановлена
@ -608,6 +615,12 @@ public class VideoControllerView extends FrameLayout implements IMediaController
} }
} }
public void tryFocusSelf() {
if (mProgress != null) {
mProgress.requestFocus();
}
}
public interface FullScreenAbleMediaPlayerControl extends MediaController.MediaPlayerControl { public interface FullScreenAbleMediaPlayerControl extends MediaController.MediaPlayerControl {
void toggleFullScreen(); void toggleFullScreen();
} }

@ -37,6 +37,8 @@
android:layout_below="@+id/tv" android:layout_below="@+id/tv"
android:layout_marginTop="@dimen/_20dp" android:layout_marginTop="@dimen/_20dp"
android:focusable="true" android:focusable="true"
android:nextFocusRight="@id/sb_sound"
android:nextFocusLeft="@id/sb_sound"
android:min="0" android:min="0"
android:padding="0dp" /> android:padding="0dp" />

@ -9,6 +9,7 @@
android:id="@+id/render_container" android:id="@+id/render_container"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:focusable="false"
android:layout_gravity="center" android:layout_gravity="center"
android:background="#000000"> android:background="#000000">

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?> <!--<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/media_controller_ll" android:id="@+id/media_controller_ll"
android:layout_width="match_parent" android:layout_width="match_parent"
@ -10,7 +10,8 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="@dimen/_87dp" android:layout_height="@dimen/_87dp"
android:background="#6000" android:background="#6000"
android:focusable="true" android:focusable="false"
android:visibility="invisible"
android:gravity="center_vertical"> android:gravity="center_vertical">
<ImageView <ImageView
@ -23,14 +24,14 @@
<Space <Space
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="0dp" android:layout_height="0dp"
android:layout_weight="1" /> android:focusable="false"
android:layout_weight="1" />-->
<LinearLayout <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/control_area" android:id="@+id/control_area"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="#6000" android:background="#6000"
android:focusable="true"
android:orientation="vertical"> android:orientation="vertical">
<LinearLayout <LinearLayout
@ -58,6 +59,9 @@
android:layout_width="0dip" android:layout_width="0dip"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="1" android:layout_weight="1"
android:nextFocusLeft="@id/media_controller_progress"
android:nextFocusRight="@id/media_controller_progress"
android:focusable="true"
android:progress="0" /> android:progress="0" />
<TextView <TextView
@ -84,20 +88,26 @@
android:id="@+id/rewind" android:id="@+id/rewind"
style="@android:style/MediaButton.Rew" style="@android:style/MediaButton.Rew"
android:layout_weight="1" android:layout_weight="1"
android:focusable="true"
android:nextFocusLeft="@id/rewind"
android:src="@drawable/new_moveback_btn" /> android:src="@drawable/new_moveback_btn" />
<ImageButton <ImageButton
android:id="@+id/pause" android:id="@+id/pause"
style="@android:style/MediaButton.Play" style="@android:style/MediaButton.Play"
android:layout_weight="1" android:layout_weight="1"
android:focusable="true"
android:src="@drawable/new_stop_white" /> android:src="@drawable/new_stop_white" />
<ImageButton <ImageButton
android:id="@+id/fast_forward" android:id="@+id/fast_forward"
style="@android:style/MediaButton.Ffwd" style="@android:style/MediaButton.Ffwd"
android:layout_weight="1" android:layout_weight="1"
android:focusable="true"
android:nextFocusRight="@id/fast_forward"
android:src="@drawable/new_forward_btn" /> android:src="@drawable/new_forward_btn" />
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>
</LinearLayout> <!--
</LinearLayout>-->

Loading…
Cancel
Save