尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
PhotoView 搬上 Android TV:遥控器导航与焦点框改造
PhotoView 搬上 Android TV:遥控器导航与焦点框改造【免费下载链接】PhotoViewImplementation of ImageView for Android that supports zooming, by various touch gestures.项目地址: https://gitcode.com/gh_mirrors/ph/PhotoView客厅里,你坐在沙发上,手里只有一台遥控器,却想放大这张家里的合影看细节。手机上两根手指一搓就完成的事,在电视大屏上得靠方向键一步步做。PhotoView 是 Android 上现成的图片缩放组件;要把它搬上 Android TV,补的就是按键导航和焦点反馈。电视和手机的“距离”:两米视距差在哪同样是一张图,手机和电视对它的要求差得不少:维度手机Android TV输入方式手指直接触摸,双指缩放遥控器方向键、OK 键、± 键观看视距30-50 厘米2-5 米焦点模型没有焦点,点哪看哪焦点必须停在屏幕上某个可见位置可点击区域指尖大小就够要放大到两米外一眼能定位手机上靠手完成的缩放、平移、定位,到电视上全要换成键和焦点来表达。所以要改三类东西:程序声明、按键交互、焦点反馈,下面动手做。 动手改:从特性声明到焦点适配五步走完,遥控器就能接管 PhotoView 的平移和缩放。在 Manifest 里声明电视特性电视没有触摸屏,不声明 touchscreen 可选,应用可能从电视列表里被过滤掉;leanback 特性则表明这是 TV 应用,写法可对照 sample 的 Manifest。uses-feature android:nameandroid.hardware.touchscreen android:requiredfalse / uses-feature android:nameandroid.software.leanback android:requiredtrue /装到真机,电视主页的应用列表里会出现这个应用,手机上运行则不受影响。把 PhotoView 依赖引进来PhotoView 是第三方库,系统里没有,按坐标引入即可,版本沿用 2.3.0。dependencies { implementation com.github.chrisbanes:photoview:2.3.0 }想跑官方示例,执行git clone https://gitcode.com/gh_mirrors/ph/PhotoView后打开 sample 模块;同步完成后,项目里可以直接引用 PhotoView 这个类。给布局加上焦点属性方向键移动的是焦点而不是手指,不可聚焦的视图收不到按键事件,焦点属性必须显式打开。com.github.chrisbanes.photoview.PhotoView android:idid/photo_view android:layout_widthmatch_parent android:layout_heightmatch_parent android:scaleTypecenterInside android:focusabletrue android:focusableInTouchModetrue/真机上按方向键,焦点会停在图片上,系统默认高亮一闪而过,两米外根本看不出来——下一步自己画。让方向键和 ± 键驱动平移与缩放PhotoView 的手势体系只监听触摸事件,遥控器不产生触摸,按键就得手动翻译成矩阵操作:方向键做平移,± 键做缩放。private static final float ZOOM_STEP 1.2f; // 每按一次放大的倍数 private static final float PAN_STEP 120f; // 每按一次平移的像素 photoView.setOnKeyListener((v, keyCode, event) - { if (event.getAction() ! KeyEvent.ACTION_DOWN) { return false; } Matrix m new Matrix(); photoView.getSuppMatrix(m); float dx 0, dy 0; switch (keyCode) { case KeyEvent.KEYCODE_DPAD_UP: dy -PAN_STEP; break; case KeyEvent.KEYCODE_DPAD_DOWN: dy PAN_STEP; break; case KeyEvent.KEYCODE_DPAD_LEFT: dx PAN_STEP; break; case KeyEvent.KEYCODE_DPAD_RIGHT: dx -PAN_STEP; break; case KeyEvent.KEYCODE_PLUS: photoView.setScale(photoView.getScale() * ZOOM_STEP, true); return true; case KeyEvent.KEYCODE_MINUS: photoView.setScale(photoView.getScale() / ZOOM_STEP, true); return true; default: return false; } m.postTranslate(dx, dy); return photoView.setDisplayMatrix(m); });真机连按方向键,图片跟着走;按 和 − 平滑缩放,到边界会被自动夹住,不会把图拉出屏幕。把焦点框画出来两米外看不见系统默认的浅淡高亮,焦点边框要自己画粗。selector xmlns:androidhttp://schemas.android.com/apk/res/android item android:state_focusedtrue shape android:shaperectangle stroke android:width4dp android:colorcolor/focused_color / corners android:radius8dp / /shape /item item shape android:shaperectangle stroke android:width0dp android:colorcolor/transparent / /shape /item /selector文件放进 res/drawable/,再给 PhotoView 加一行android:focusBackground指向它;焦点进来时 4dp 边框亮起,移开后边框消失。️ 让大图在 4K 屏上不卡大屏图片浏览里,分辨率一高,加载和翻页就是第一个瓶颈。现象:多图页启动时把所有远程图一次性拉下来,首帧要等很久。处理:等页面真要显示才发起网络请求,参考 Coil 示例页 中 Activity 创建时才load并开crossfade的做法。收益:首帧更快,后续翻页直接吃缓存。现象:浏览时间一长,内存越涨越高。处理:在 PagerAdapter 里用instantiateItem按需创建、destroyItem移除离屏视图,ViewPager 示例页 就是翻页时逐页移除 PhotoView 的。收益:连续翻页时内存保持平稳。现象:4K 屏上缩放动画掉帧。处理:开启硬件加速,给图片加载库设合理的内存缓存大小,大图先降采样到显示尺寸再解码。收益:缩放与平移动画保持流畅。❓ 遥控器按不动时,先查这五处焦点框不显示:确认focusable设了、focusBackground的 selector 在state_focused分支里画了东西;父容器若是自定义 ViewGroup,查它是否拦截了焦点。遥控器无响应:按键事件被父布局消费,或焦点根本不在 PhotoView 上。先把焦点挪到图片上,再检查监听里有没有return true。Back 键行为:默认 Back 直接退出。建议放大时按 Back 先复位——当前缩放不等于getMinimumScale()时调setScale(getMinimumScale(), true),已复位再按才退出。大图加载慢:网络图走加载库并降采样,加载中用占位图顶着,别让用户对着黑屏等。多机型翻车:至少找一台 1080p 和一台 4K 的电视(或用 TV 模拟器改分辨率),把下面的验收动作完整走一遍。照着打勾的验收动作运行 sample 模块的 LauncherActivity,按遥控器 OK 键,示例列表应能选中并进入。电视主页应用列表里能找到该应用,说明 leanback 特性声明生效。进入 Simple Sample 页面,按上下左右方向键,图片应跟着平移。放大状态下按 和 −,图片应平滑缩放且不出屏。焦点移到 PhotoView 上,边框应亮起;焦点移开,边框消失。放大后按 Back,应先复位到适配大小,再按一次才退出页面。连续翻页六张,观察内存曲线应基本平稳,翻页不掉帧。在 1080p 与 4K 各一台设备上重复以上动作,焦点大小和图片清晰度应正常。家庭相册应用要的是放大看细节,商业展示屏要的是翻页稳、焦点看得清。清单里这些动作走一遍,PhotoView 在电视上就真正能用起来。【免费下载链接】PhotoViewImplementation of ImageView for Android that supports zooming, by various touch gestures.项目地址: https://gitcode.com/gh_mirrors/ph/PhotoView创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

博客目录~

博客目录~

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/10/31 10:43:03
MySQL的SQL语句快速入门

MySQL的SQL语句快速入门

MySQL通用语法SQL语句可以单行或多行书写,以分号结尾SQL语句可以使用空格/缩进来增强语句的可读性MySQL数据库的SQL语句不区分大小写,关键字建议使用大写注释:单行注释:-- 注释内容 或 # 注释内容 多行注释:/* …

📅 2026/10/31 10:43:03
【GATT】规范精讲[14]: 服务表的指纹——Database Hash 是怎么算出来的

【GATT】规范精讲[14]: 服务表的指纹——Database Hash 是怎么算出来的

前面讲过 GATT Service 里有一个叫 Database Hash 的特征,值是 16 字节,客户端拿它当服务表的指纹。一旦指纹变了,就说明服务器的服务定义改了,客户端得重新发现。但这个指纹具体怎么算?哪些属性参与、哪些不参与?字节怎么拼?规范 用一个完整的示例把这件事讲透了。 目录…

📅 2026/10/31 10:43:03
MORE NEWS

更多资讯

📰

DB2性能排查实战:从ACTIVE SESSION异常到LATCH与STACK根因定位

简介:这份文档面向DB2数据库运维DBA与性能调优学习者,取材于某银行DB2系统的一次真实故障:业务响应变慢、活动会话数异常攀升,常规排查CPU、内存、I/O与锁等待均无异常,最终锁定系统临时表空间TEMPSPACE1膨胀至10GB这一…

📰

NAS搭配RTX 4060 LP半高刀卡实现AI加速实战

1. 项目概述:当NAS遇上AI加速卡 去年帮朋友组装家庭NAS时遇到个头疼问题——他想在NAS上跑些AI模型处理照片,但标准尺寸显卡塞不进紧凑的机箱。直到最近发现技嘉推出的RTX 4060 LP半高刀卡,这个困扰迎刃而解。这张长度仅182mm、高度仅69mm的显…

📰

NAS升级AI计算卡实战:RTX 4060 LP加速大模型推理

1. 为什么要在NAS里装AI计算卡?这个想法最初源于我在搭建家庭媒体中心时的实际需求。作为一台7x24小时运行的设备,NAS本就是个天然的计算平台,但大多数商用NAS的CPU性能有限,跑个转码都吃力,更别说处理AI任务了。直到我…

📰

基于YOLOv10的工业安全帽实时检测系统实践

1. 项目概述:基于深度学习的安全帽检测系统 在工业安全生产领域,安全帽佩戴检测一直是个刚需场景。传统人工巡检方式存在效率低、漏检率高的问题,而基于计算机视觉的自动化检测方案正逐渐成为主流选择。这个毕设项目采用当前最前沿的YOLOv10算…

📰

字典序排序算法与Swift高效实现

1. 字典序排序问题背景 字典序排序是一种特殊的字符串比较方式,它按照字母表顺序逐字符比较。当我们将数字视为字符串时,这种排序方式会产生与数值大小完全不同的排列结果。比如数字1-20的字典序排列会是:1,10,11,12,13,14,15,16,17,18,19,2,…

📰

VC++6.0下Lex/Yacc实现的可运行SQL解析器原型

简介:本资源是西安电子科技大学《编译原理》课程配套上机实践报告,面向计算机专业本科生及编译技术初学者,聚焦词法与语法分析器设计及其在数据库管理系统(DBMS)中的落地应用。报告完整呈现了基于Lex/Yacc(…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬