From 04ea52e7f92d3fd3f8503c1725bdd74bece8bcc4 Mon Sep 17 00:00:00 2001 From: xiaowusky Date: Fri, 15 Dec 2023 15:03:13 +0800 Subject: [PATCH] =?UTF-8?q?desc:=E8=A7=86=E9=A2=91=E6=92=AD=E6=94=BE?= =?UTF-8?q?=E7=95=8C=E9=9D=A2=E5=A2=9E=E5=8A=A0=E9=9F=B3=E9=87=8F=E6=8E=A7?= =?UTF-8?q?=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../watcher/base/BaseActivity.kt | 23 ++- .../watcher/player/ProVideoActivity.java | 195 +++++++++++------- .../watcher/player/VideoControllerView.java | 87 ++++---- app/src/main/res/layout/activity_base.xml | 2 + app/src/main/res/layout/activity_main_pro.xml | 1 + app/src/main/res/layout/media_controller.xml | 22 +- 6 files changed, 202 insertions(+), 128 deletions(-) diff --git a/app/src/main/java/com/yinuo/safetywatcher/watcher/base/BaseActivity.kt b/app/src/main/java/com/yinuo/safetywatcher/watcher/base/BaseActivity.kt index f160f34..78b2053 100644 --- a/app/src/main/java/com/yinuo/safetywatcher/watcher/base/BaseActivity.kt +++ b/app/src/main/java/com/yinuo/safetywatcher/watcher/base/BaseActivity.kt @@ -9,12 +9,14 @@ import android.view.LayoutInflater.Factory2 import android.view.View import android.view.ViewGroup import android.widget.EditText +import android.widget.ImageButton import android.widget.LinearLayout import android.widget.RelativeLayout import android.widget.SeekBar import android.widget.TextView import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.widget.AppCompatRadioButton +import androidx.core.view.postDelayed import androidx.lifecycle.lifecycleScope import com.common.commonlib.utils.LogUtils import com.loper7.date_time_picker.number_picker.NumberPicker @@ -174,6 +176,7 @@ abstract class BaseActivity : AppCompatActivity() { "androidx.appcompat.widget.AppCompatRadioButton" -> AppCompatRadioButton(context, attrs) "SeekBar" -> SeekBar(context, attrs) "EditText" -> EditText(context, attrs) + "ImageButton" -> ImageButton(context, attrs) else -> { null } @@ -184,6 +187,10 @@ abstract class BaseActivity : AppCompatActivity() { baseBinding.topBar.tryFocusBackArea() } + fun isBackFocused(): Boolean { + return currentFocus == baseBinding.topBar.getBackArea() + } + override fun onResume() { super.onResume() if (!isHome) { @@ -213,10 +220,12 @@ abstract class BaseActivity : AppCompatActivity() { val repeatCount = event.repeatCount val keyCode = event.keyCode if (KeyEvent.KEYCODE_DPAD_LEFT == keyCode || KeyEvent.KEYCODE_DPAD_RIGHT == keyCode) { - if (isLeftRightLongPress) { - lastFocusView?.requestFocus() - baseBinding.areaSound.visibility = View.GONE - volumeUtil.mediaVolume = baseBinding.sbSound.progress + if (isLeftRightLongPress && baseBinding.areaSound.visibility == View.VISIBLE) { + baseBinding.areaSound.postDelayed(300) { + lastFocusView?.requestFocus() + baseBinding.areaSound.visibility = View.GONE + volumeUtil.mediaVolume = baseBinding.sbSound.progress + } return true } } else if (keyCode == KeyEvent.KEYCODE_ENTER) { @@ -237,9 +246,9 @@ abstract class BaseActivity : AppCompatActivity() { private fun dealActionDown(event: KeyEvent): Boolean { val repeatCount = event.repeatCount val keyCode = event.keyCode - if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT || keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) { - isLeftRightLongPress = repeatCount != 0 - if (repeatCount > 10) { + if (KeyEvent.KEYCODE_DPAD_LEFT == keyCode || KeyEvent.KEYCODE_DPAD_RIGHT == keyCode) { + isLeftRightLongPress = repeatCount > 10 + if (isLeftRightLongPress && currentFocus !is SeekBar) { val visibility = baseBinding.areaSound.visibility if (View.GONE == visibility) { lastFocusView = currentFocus diff --git a/app/src/main/java/com/yinuo/safetywatcher/watcher/player/ProVideoActivity.java b/app/src/main/java/com/yinuo/safetywatcher/watcher/player/ProVideoActivity.java index b932e15..958d152 100644 --- a/app/src/main/java/com/yinuo/safetywatcher/watcher/player/ProVideoActivity.java +++ b/app/src/main/java/com/yinuo/safetywatcher/watcher/player/ProVideoActivity.java @@ -36,16 +36,18 @@ import android.view.ViewConfiguration; import android.view.WindowManager; import android.widget.LinearLayout; +import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.core.view.ViewCompat; import androidx.core.view.ViewConfigurationCompat; import com.bumptech.glide.Glide; import com.yinuo.safetywatcher.databinding.ActivityMainProBinding; +import com.yinuo.safetywatcher.watcher.base.NoOptionsActivity; import tv.danmaku.ijk.media.player.IMediaPlayer; -public class ProVideoActivity extends AppCompatActivity { +public class ProVideoActivity extends NoOptionsActivity { private static final String TAG = "ProVideoActivity"; public static final int REQUEST_WRITE_STORAGE = 111; @@ -63,17 +65,112 @@ public class ProVideoActivity extends AppCompatActivity { @SuppressLint("ClickableViewAccessibility") @Override protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { View decorView = getWindow().getDecorView(); decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE); getWindow().setStatusBarColor(Color.TRANSPARENT); } - 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 mVideoPath = getIntent().getStringExtra("videoPath"); @@ -214,79 +311,21 @@ public class ProVideoActivity extends AppCompatActivity { // detector.onTouchEvent(event); // return true; // }); - } - - @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 - 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; + View backArea = getBaseBinding().topBar.getBackArea(); + int backAreaId = backArea.getId(); + backArea.setNextFocusRightId(backAreaId); + backArea.setNextFocusLeftId(backAreaId); + backArea.setOnKeyListener(new View.OnKeyListener() { + @Override + public boolean onKey(View v, int keyCode, KeyEvent event) { + if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN) { + if (event.getAction() == KeyEvent.ACTION_DOWN) { + mediaController.tryFocusSelf(); + return true; + } + } + return false; } - - // 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); + }); } } diff --git a/app/src/main/java/com/yinuo/safetywatcher/watcher/player/VideoControllerView.java b/app/src/main/java/com/yinuo/safetywatcher/watcher/player/VideoControllerView.java index 96d5f9f..e3b4932 100644 --- a/app/src/main/java/com/yinuo/safetywatcher/watcher/player/VideoControllerView.java +++ b/app/src/main/java/com/yinuo/safetywatcher/watcher/player/VideoControllerView.java @@ -61,7 +61,7 @@ public class VideoControllerView extends FrameLayout implements IMediaController private TextView mCurrentTime; // 当前播放时间点 private TextView mEndTime; // 总时长 - private View mControlView; + // private View mControlView; private ImageButton mPauseButton; // 暂停or开始 private ImageButton mFastButton; // 快进 private ImageButton mRewindButton; // 快退 @@ -233,8 +233,11 @@ public class VideoControllerView extends FrameLayout implements IMediaController doPauseResume(); show(sDefaultTimeout); - if (mControlView != null) { - mControlView.requestFocus(); +// if (mControlView != null) { +// mControlView.requestFocus(); +// } + if (mProgress != null) { + mProgress.requestFocus(); } } @@ -349,15 +352,19 @@ public class VideoControllerView extends FrameLayout implements IMediaController if (!mShowing && mAnchor != null) { setProgress(); - if (mControlView != null) { - mControlView.requestFocus(); +// if (mControlView != null) { +// mControlView.requestFocus(); +// } + + if (mProgress != null) { + mProgress.requestFocus(); } disableUnsupportedButtons(); LayoutParams tlp = new LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, - ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.WRAP_CONTENT, Gravity.BOTTOM); if (mAnchor instanceof ViewGroup) { @@ -440,39 +447,39 @@ public class VideoControllerView extends FrameLayout implements IMediaController v.findViewById(R.id.seek_bar_container).setVisibility(VISIBLE); } - View backArea = v.findViewById(R.id.back_area); - backArea.setOnClickListener(v1 -> { - if (mContext instanceof Activity) { - ((Activity) mContext).finish(); - } - }); - - setCommonBg(backArea); - mControlView = v.findViewById(R.id.control_area); - mControlView.setOnKeyListener((v12, keyCode, event) -> { - if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER || keyCode == KeyEvent.KEYCODE_ENTER) { - if (event.getAction() == KeyEvent.ACTION_DOWN) { - mPauseButton.performClick(); - } - return true; - } - return false; - }); - setCommonBg(mControlView); - mControlView.requestFocus(); +// View backArea = v.findViewById(R.id.back_area); +// backArea.setOnClickListener(v1 -> { +// if (mContext instanceof Activity) { +// ((Activity) mContext).finish(); +// } +// }); + +// setCommonBg(backArea); +// mControlView = v.findViewById(R.id.control_area); +// mControlView.setOnKeyListener((v12, keyCode, event) -> { +// if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER || keyCode == KeyEvent.KEYCODE_ENTER) { +// if (event.getAction() == KeyEvent.ACTION_DOWN) { +// mPauseButton.performClick(); +// } +// return true; +// } +// return false; +// }); +// setCommonBg(mControlView); +// mControlView.requestFocus(); } - private void setCommonBg(View v) { - StateListDrawable bg = new StateListDrawable(); - Drawable currentBackground = v.getBackground(); - Drawable drawable = AppCompatResources.getDrawable( - mContext, - com.yinuo.safetywatcher.R.drawable.focus_bg - ); - bg.addState(new int[]{android.R.attr.state_focused}, drawable); - bg.addState(new int[]{}, currentBackground); - v.setBackground(bg); - } +// private void setCommonBg(View v) { +// StateListDrawable bg = new StateListDrawable(); +// Drawable currentBackground = v.getBackground(); +// Drawable drawable = AppCompatResources.getDrawable( +// mContext, +// com.yinuo.safetywatcher.R.drawable.focus_bg +// ); +// bg.addState(new int[]{android.R.attr.state_focused}, drawable); +// bg.addState(new int[]{}, currentBackground); +// v.setBackground(bg); +// } /** * Отключить паузу или 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 { void toggleFullScreen(); } diff --git a/app/src/main/res/layout/activity_base.xml b/app/src/main/res/layout/activity_base.xml index ec5633e..e68b3e3 100644 --- a/app/src/main/res/layout/activity_base.xml +++ b/app/src/main/res/layout/activity_base.xml @@ -37,6 +37,8 @@ android:layout_below="@+id/tv" android:layout_marginTop="@dimen/_20dp" android:focusable="true" + android:nextFocusRight="@id/sb_sound" + android:nextFocusLeft="@id/sb_sound" android:min="0" android:padding="0dp" /> diff --git a/app/src/main/res/layout/activity_main_pro.xml b/app/src/main/res/layout/activity_main_pro.xml index c386406..303a54c 100644 --- a/app/src/main/res/layout/activity_main_pro.xml +++ b/app/src/main/res/layout/activity_main_pro.xml @@ -9,6 +9,7 @@ android:id="@+id/render_container" android:layout_width="match_parent" android:layout_height="match_parent" + android:focusable="false" android:layout_gravity="center" android:background="#000000"> diff --git a/app/src/main/res/layout/media_controller.xml b/app/src/main/res/layout/media_controller.xml index 01f63e3..a376bec 100644 --- a/app/src/main/res/layout/media_controller.xml +++ b/app/src/main/res/layout/media_controller.xml @@ -1,4 +1,4 @@ - + - - \ No newline at end of file +