• 自定义 View 可以播放一段视频


    请实现一个自定义 View 的核心代码,核心要求可以响应如下事件:

    // - 要求自定义 View 可以播放一段视频

    / - 在 view 左侧区域上下滑动,可以提高减少音量 /

    / - 在 view 右侧区域上下滑动可以提高减少屏幕亮度

    // - 在 view 左右滑动可以快进/快退播放 // - 在 view 区域点击屏幕可以暂停/继续播放

     使用 VideoView 实现自定义 View

    1. public class CustomVideoView extends FrameLayout {
    2. private VideoView videoView;
    3. private GestureDetector gestureDetector;
    4. private float initialTouchX, initialTouchY;
    5. private int screenWidth, screenHeight;
    6. private AudioManager audioManager;
    7. private WindowManager.LayoutParams layoutParams;
    8. private float maxVolume;
    9. public CustomVideoView(Context context) {
    10. super(context);
    11. init(context);
    12. }
    13. public CustomVideoView(Context context, AttributeSet attrs) {
    14. super(context, attrs);
    15. init(context);
    16. }
    17. public CustomVideoView(Context context, AttributeSet attrs, int defStyleAttr) {
    18. super(context, attrs, defStyleAttr);
    19. init(context);
    20. }
    21. private void init(Context context) {
    22. // 初始化 VideoView
    23. videoView = new VideoView(context);
    24. addView(videoView, new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
    25. // 获取屏幕宽高
    26. WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
    27. Display display = wm.getDefaultDisplay();
    28. Point size = new Point();
    29. display.getSize(size);
    30. screenWidth = size.x;
    31. screenHeight = size.y;
    32. // 初始化音频管理器
    33. audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
    34. maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
    35. // 获取当前窗口参数以调整亮度
    36. layoutParams = ((Activity) context).getWindow().getAttributes();
    37. // 初始化手势检测器
    38. gestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
    39. @Override
    40. public boolean onSingleTapConfirmed(MotionEvent e) {
    41. if (videoView.isPlaying()) {
    42. videoView.pause();
    43. } else {
    44. videoView.start();
    45. }
    46. return true;
    47. }
    48. @Override
    49. public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
    50. float deltaX = e2.getX() - initialTouchX;
    51. float deltaY = e2.getY() - initialTouchY;
    52. if (Math.abs(deltaX) > Math.abs(deltaY)) {
    53. // 左右滑动快进/快退
    54. if (deltaX > 0) {
    55. // 快进
    56. videoView.seekTo(videoView.getCurrentPosition() + 10000);
    57. } else {
    58. // 快退
    59. videoView.seekTo(videoView.getCurrentPosition() - 10000);
    60. }
    61. } else {
    62. if (initialTouchX < screenWidth / 2) {
    63. // 左侧区域,上下滑动调整音量
    64. if (deltaY > 0) {
    65. // 降低音量
    66. audioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_LOWER, 0);
    67. } else {
    68. // 提高音量
    69. audioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_RAISE, 0);
    70. }
    71. } else {
    72. // 右侧区域,上下滑动调整亮度
    73. if (deltaY > 0) {
    74. // 降低亮度
    75. layoutParams.screenBrightness = Math.max(layoutParams.screenBrightness - 0.1f, 0.1f);
    76. } else {
    77. // 提高亮度
    78. layoutParams.screenBrightness = Math.min(layoutParams.screenBrightness + 0.1f, 1.0f);
    79. }
    80. ((Activity) getContext()).getWindow().setAttributes(layoutParams);
    81. }
    82. }
    83. return true;
    84. }
    85. });
    86. }
    87. @Override
    88. public boolean onTouchEvent(MotionEvent event) {
    89. initialTouchX = event.getX();
    90. initialTouchY = event.getY();
    91. return gestureDetector.onTouchEvent(event);
    92. }
    93. public void setVideoPath(String path) {
    94. videoView.setVideoPath(path);
    95. }
    96. public void start() {
    97. videoView.start();
    98. }
    99. public void pause() {
    100. videoView.pause();
    101. }
    102. public boolean isPlaying() {
    103. return videoView.isPlaying();
    104. }
    105. public void seekTo(int millis) {
    106. videoView.seekTo(millis);
    107. }
    108. }

    GestureDetector.SimpleOnGestureListener 是 GestureDetector 的一个内部类,提供了各种手势检测回调方法。你可以通过继承 SimpleOnGestureListener 并重写它的方法来定制手势处理逻辑。下面是 SimpleOnGestureListener 内常用方法的详细说明及示例代码。

    常用方法及说明

    1. onSingleTapUp(MotionEvent e)

      • 当用户轻轻点击屏幕后松开时调用。
      • 返回 true 表示该事件被处理。
      • 示例用途:处理单击事件。
    2. onLongPress(MotionEvent e)

      • 当用户长按屏幕时调用。
      • 示例用途:处理长按事件,如显示上下文菜单。
    3. onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY)

      • 当用户在屏幕上滑动时调用。
      • 参数 e1 表示滑动的起点,e2 表示滑动的终点,distanceX 和 distanceY 分别表示滑动的距离。
      • 示例用途:处理滚动事件,如滚动列表。
    4. onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY)

      • 当用户快速滑动并松开时调用。
      • 参数 e1 和 e2 表示滑动的起点和终点,velocityX 和 velocityY 分别表示滑动的速度。
      • 示例用途:处理快速滑动事件,如切换页面。
    5. onShowPress(MotionEvent e)

      • 当用户按下屏幕但还未松开或拖动时调用。
      • 示例用途:处理按压显示效果。
    6. onDown(MotionEvent e)

      • 当用户按下屏幕时调用。
      • 返回 true 表示该事件被处理。
      • 示例用途:通常用来初始化一些状态。
    7. onDoubleTap(MotionEvent e)

      • 当用户双击屏幕时调用。
      • 示例用途:处理双击事件,如放大图片。
    8. onDoubleTapEvent(MotionEvent e)

      • 当双击手势发生的过程中,按下、移动和抬起事件的任何一次调用。
      • 示例用途:处理双击过程中的事件。
    9. onSingleTapConfirmed(MotionEvent e)

      • 当单击事件被确认时调用。
      • 示例用途:与 onSingleTapUp 区分,onSingleTapConfirmed 在确定不是双击时调用。
  • 相关阅读:
    hexo使用指南
    123. 买卖股票的最佳时机 III
    H7-TOOL的CANFD/CAN接口脱机烧写操作说明, 已经更新(2022-07-12)
    事务并发引发的问题
    chatgpt赋能python:Python文件复制到指定文件夹——实现简单又高效的文件操作
    【QEMU中文文档】1.3 弃用功能
    oracle19c升级时区版本 32-->42,解决数据泵导数据TSTZ报错
    isa-l 中硬件优化函数的调用路径
    vue通过vant列表实现下拉到底部加载更多列表数据
    谷歌180nm 工艺芯片开源
  • 原文地址:https://blog.csdn.net/qq_28909387/article/details/141019245