自定义 View 可以播放一段视频
请实现一个自定义 View 的核心代码,核心要求可以响应如下事件:
// - 要求自定义 View 可以播放一段视频
/ - 在 view 左侧区域上下滑动,可以提高减少音量 /
/ - 在 view 右侧区域上下滑动可以提高减少屏幕亮度
// - 在 view 左右滑动可以快进/快退播放 // - 在 view 区域点击屏幕可以暂停/继续播放
使用 VideoView
实现自定义 View
public class CustomVideoView extends FrameLayout {private VideoView videoView;private GestureDetector gestureDetector;private float initialTouchX, initialTouchY;private int screenWidth, screenHeight;private AudioManager audioManager;private WindowManager.LayoutParams layoutParams;private float maxVolume;public CustomVideoView(Context context) {super(context);init(context);}public CustomVideoView(Context context, AttributeSet attrs) {super(context, attrs);init(context);}public CustomVideoView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);init(context);}private void init(Context context) {// 初始化 VideoViewvideoView = new VideoView(context);addView(videoView, new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));// 获取屏幕宽高WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);Display display = wm.getDefaultDisplay();Point size = new Point();display.getSize(size);screenWidth = size.x;screenHeight = size.y;// 初始化音频管理器audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);// 获取当前窗口参数以调整亮度layoutParams = ((Activity) context).getWindow().getAttributes();// 初始化手势检测器gestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {@Overridepublic boolean onSingleTapConfirmed(MotionEvent e) {if (videoView.isPlaying()) {videoView.pause();} else {videoView.start();}return true;}@Overridepublic boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {float deltaX = e2.getX() - initialTouchX;float deltaY = e2.getY() - initialTouchY;if (Math.abs(deltaX) > Math.abs(deltaY)) {// 左右滑动快进/快退if (deltaX > 0) {// 快进videoView.seekTo(videoView.getCurrentPosition() + 10000);} else {// 快退videoView.seekTo(videoView.getCurrentPosition() - 10000);}} else {if (initialTouchX < screenWidth / 2) {// 左侧区域,上下滑动调整音量if (deltaY > 0) {// 降低音量audioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_LOWER, 0);} else {// 提高音量audioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_RAISE, 0);}} else {// 右侧区域,上下滑动调整亮度if (deltaY > 0) {// 降低亮度layoutParams.screenBrightness = Math.max(layoutParams.screenBrightness - 0.1f, 0.1f);} else {// 提高亮度layoutParams.screenBrightness = Math.min(layoutParams.screenBrightness + 0.1f, 1.0f);}((Activity) getContext()).getWindow().setAttributes(layoutParams);}}return true;}});}@Overridepublic boolean onTouchEvent(MotionEvent event) {initialTouchX = event.getX();initialTouchY = event.getY();return gestureDetector.onTouchEvent(event);}public void setVideoPath(String path) {videoView.setVideoPath(path);}public void start() {videoView.start();}public void pause() {videoView.pause();}public boolean isPlaying() {return videoView.isPlaying();}public void seekTo(int millis) {videoView.seekTo(millis);}
}
GestureDetector.SimpleOnGestureListener
是 GestureDetector
的一个内部类,提供了各种手势检测回调方法。你可以通过继承 SimpleOnGestureListener
并重写它的方法来定制手势处理逻辑。下面是 SimpleOnGestureListener
内常用方法的详细说明及示例代码。
常用方法及说明
-
onSingleTapUp(MotionEvent e)
- 当用户轻轻点击屏幕后松开时调用。
- 返回
true
表示该事件被处理。 - 示例用途:处理单击事件。
-
onLongPress(MotionEvent e)
- 当用户长按屏幕时调用。
- 示例用途:处理长按事件,如显示上下文菜单。
-
onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY)
- 当用户在屏幕上滑动时调用。
- 参数
e1
表示滑动的起点,e2
表示滑动的终点,distanceX
和distanceY
分别表示滑动的距离。 - 示例用途:处理滚动事件,如滚动列表。
-
onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY)
- 当用户快速滑动并松开时调用。
- 参数
e1
和e2
表示滑动的起点和终点,velocityX
和velocityY
分别表示滑动的速度。 - 示例用途:处理快速滑动事件,如切换页面。
-
onShowPress(MotionEvent e)
- 当用户按下屏幕但还未松开或拖动时调用。
- 示例用途:处理按压显示效果。
-
onDown(MotionEvent e)
- 当用户按下屏幕时调用。
- 返回
true
表示该事件被处理。 - 示例用途:通常用来初始化一些状态。
-
onDoubleTap(MotionEvent e)
- 当用户双击屏幕时调用。
- 示例用途:处理双击事件,如放大图片。
-
onDoubleTapEvent(MotionEvent e)
- 当双击手势发生的过程中,按下、移动和抬起事件的任何一次调用。
- 示例用途:处理双击过程中的事件。
-
onSingleTapConfirmed(MotionEvent e)
- 当单击事件被确认时调用。
- 示例用途:与
onSingleTapUp
区分,onSingleTapConfirmed
在确定不是双击时调用。
相关文章:
自定义 View 可以播放一段视频
请实现一个自定义 View 的核心代码,核心要求可以响应如下事件: // - 要求自定义 View 可以播放一段视频 / - 在 view 左侧区域上下滑动,可以提高减少音量 / / - 在 view 右侧区域上下滑动可以提高减少屏幕亮度 // - 在 view 左右滑动可以…...

LVS负载均衡集群部署之—NAT模式的介绍及搭建步骤
一、环境准备 1.准备三台rhel9服务器 服务器名称 主机名 ip地址备注LVS调度服务器lvs.timinglee.org eth0:172.25.254.100(外网) eth1:192.168.0.100(内网) 关闭selinux和防火墙webserver2网站服务器webserver1.timinglee.orgeth0:192.168.…...
【算法】浅析哈希算法【附代码示例】
哈希算法:数据存储与检索的基石 1. 引言 在计算机科学中,哈希算法是一种用于将数据(如文件、网络地址或数据库记录)转换为固定长度的哈希值的过程。哈希值通常是一个较短的数字或字符串,用于快速检索原始数据或验证数…...

2024.8.12
2024.8.12 【梦最让我费解的地方在于,明明你看不清梦里人们的脸,却清晰地知道他们是谁。】 Monday 七月初九 序理论 最小链覆盖&最长反链长度 我们设定一个二元关系符R和一个集合A 我们设定<A,R>这样一个类群,那么对于任意 a i…...
使用Python解析pdf、docx等格式文件。
针对不同类型的文件,需要采取特定的访问与解析策略来有效获取其中蕴含的知识。下面我们将介绍对于不同数据源数据的获取方式。 1 解析Docx文档 1.1 获取Docx文档中文本 from docx import Document # pip install python-docx # python-docx 0.8.11 filename xx…...
Linux网络通信基础API
这篇文章只有Linux网络通信基础API大参数信息,和返回值,这篇文章并没有这些基础API的参数类型介绍。accept的第二个参数可以查看客户端信息。 创建socket #include <sys/types.h> /* See NOTES */#include <sys/socket.h>int sock…...

Python爬虫:下载4K壁纸
🎁🎁创作不易,关注作者不迷路🎀🎀 目录 🌸完整代码 🌸分析 🎁基本思路 🎁需要的库 🎁提取图片的链接和标题 👓寻找Cookie和User-Agent &…...

2024年【北京市安全员-B证】新版试题及北京市安全员-B证免费试题
题库来源:安全生产模拟考试一点通公众号小程序 2024年【北京市安全员-B证】新版试题及北京市安全员-B证免费试题,包含北京市安全员-B证新版试题答案和解析及北京市安全员-B证免费试题练习。安全生产模拟考试一点通结合国家北京市安全员-B证考试最新大纲…...

python爬取B站视频实验
实验17:爬虫2 文章目录 实验17:爬虫21.实验目标及要求2. 实验主要内容3.实验小结 1.实验目标及要求 (1)掌握有关爬虫的包 (2)掌握爬虫方法 (3)爬取B站卡塔尔世界杯若干视频 2. 实验…...

10步搞定Python爬虫从零到精通!
学习Python网络爬虫可以分为以下几个步骤,每一步都包括必要的细节和示例代码,以帮助你从零开始掌握这一技能。 第一步:理解网络爬虫基础 什么是网络爬虫? 网络爬虫是一种自动化程序,用来从互联网上收集数据.它通过发送 HTTP 请求…...

SpringMVC学习笔记---带你快速入门和复习
一、初识SpringMVC 1.1、什么是SpringMVC 1.1.1、什么是MVC MVC是一种软件架构模式(是一种软件架构设计思想,不止Java开发中用到,其它语言也需要用到),它将应用分为三块: M:Model࿰…...

Linux系统编程 day09 线程同步
Linux系统编程 day09 线程同步 1.互斥锁2.死锁3.读写锁4.条件变量(生产者消费者模型)5.信号量 1.互斥锁 互斥锁是一种同步机制,用于控制多个线程对共享资源的访问,确保在同一时间只有一个线程可以访问特定的资源或执行特定的操作…...

Vue快速入门(四)——Vue3及组合式API(一)
文章目录 一、认识Vue31. Vue2 选项式 API vs Vue3 组合式API2. Vue3的优势二、使用create-vue搭建Vue3项目1、认识create-vue2. 使用create-vue创建项目三、组合式API - setup选项1. setup选项的写法和执行时机2. setup中写代码的特点3. `<script setup>`语法糖4.小结四…...

vue项目名修改、webstorm和idea创建的项目重命名、重构项目、修改项目名称
一、需求 就是创建了一个项目,后期需要重命名,怎么办?----> 直接修改?肯定不行,因为里面有些配置也需要修改,假如你只改文件夹名称的话,里面配置都没修改,后期可能会出问题。 二…...

【MySQL】数据库约束和多表查询
目录 1.前言 2.数据库约束 2.1约束类型 2.2 NULL约束 2.3 NUIQUE:唯一约束 2.4 DEFAULT:默认值约束 2.5 PRIMARY KEY:主键约束 2.6 FOREIGN KEY:外键约束 1.7 CHECK约束 3.表的设计 3.1一对一 3.2一对多 3.3多对多 …...

抖店飞鸽客服自动回复软件开发教程与下载体验(.NET版)
转载请注明出处! 原文链接:https://blog.csdn.net/zgyulongfei/article/details/140960430 本文适合的读者为: 抖店(抖音小店)个体商家;抖店店群商家(店群商家:指的是开了几十个抖…...
如何关闭redis的自动清理缓存,声明式事务(含有redis)如何解决,redis setnx锁的使用。
20240809 一、解决redis数据被删除的方案1、发现问题2、解决注意!! 二、声明式事务(当有redis的时候)1. 先看代码2. Transactional(rollbackFor Exception.class)3. 如何解决redis在事务里面,如何保证原子性和一致性3…...
C#中抽象类的使用
前言 我们在C#中使用抽象类可以发挥C#多态的功能,把具有共性的方法定义在抽象类中,然后在不同的类中去实现,可增强代码的可读性、扩展性。 1、不使用抽象类 我们定义了下面两个类XiaoWang、XiaoMing,他们有一个Country方法&…...
揭秘网络攻击:深入理解JavaScript中的跨站点请求伪造(CSRF)
标题:揭秘网络攻击:深入理解JavaScript中的跨站点请求伪造(CSRF) 在当今数字化时代,网络安全已成为每个开发者和用户必须关注的重点。其中,跨站点请求伪造(CSRF)是一种常见的网络攻…...

【项目实战】C++视频共享点播系统
目录 一、项目介绍 1.1 对视频共享点播系统的认识 1.2服务端程序负责功能 1.3 服务端功能模块划分 1.4 项目界面演示 1.5预备知识 二.环境搭建 2.1 安装 Jsoncpp 库 2.1.1 使用jsoncpp 2.2 引入httplib库 2.2.1 安装Git(如果你的系统尚未安装Git…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...

Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...

Golang——7、包与接口详解
包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...
python爬虫——气象数据爬取
一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用: 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests:发送 …...