TV端开发遇坑随记
1.TV端上,如果你不设置某个控件的下一个方向的焦点,系统会默认帮你分配,自动寻找下一个方向上可以获取焦点的控件去获取焦点,这时有可能这个控件并不是我们想要的,甚至会出现焦点乱跑的情况,这时产品一般要么要求我们指定下一个焦点控件,要么在这个控件上不能再继续向某个方向移动,指定焦点很容易,可通过这几个方法:setNextFocusUpId();setNextFocusRightId();se...
1.TV 端上,如果你不设置某个控件的下一个方向的焦点,系统会默认帮你分配,自动寻找下一个方向上可以获取焦点的控件去获取焦点,这时有可能这个控件并不是我们想要的,甚至会出现焦点乱跑的情况,这时产品一般要么要求我们指定下一个焦点控件,要么在这个控件上不能再继续向某个方向移动,指定焦点很容易,可通过这几个方法:
setNextFocusUpId();
setNextFocusRightId();
setNextFocusDownId();
setNextFocusLeftId();
setNextFocusForwardId();
前四个方法分别是设置向上、下、左、右方向移动焦点时,下一个获取焦点的 View 的 id,第五个方法是设置下一个获取焦点的View 的 id;
例如在3按键上,如果不指定向上的下一个获取焦点的控件的id,那么在遥控器上按上键时,有可能图中的A获取焦点,有可能B获取焦点,这时如果想指定向上的下一个焦点固定是B,那么就可以通过:
3按键.setNextFocusUpId(B.id);
来指定,如果产品要求在3按键上不能继续向上了,可以把通过自身设置成向上方向的下一个获取的View来实现:
3按键.setNextFocusUpId(3按键.id);
2.如果你开发一款 TV 端的视频聊天软件,而且你用的是 SurfaceView 来展示已方 Camera 输出的画面,你会发现,自己的画面是反的,就是你的手往右边移动,电视上看着却是在往左边移动,但是在手机上不会这样(TV端基本都是外接摄像头,不知道是不是和手机端的内部处理方式不一样),这时产品都会要求要让已方画面保持镜像显示,就是要像照镜子一样,自己的手往右边移动,电视上也要显示是往右边移动;这时通过旋转什么的是正不过来的,必须水平翻转,如果只是拍照倒是可以通过矩阵将图片水平翻转一下,但是如果是时时视频流,还是不方便处理的,如果软件要求兼容到 4.0 版本以上,可以用 TextureView 来代替SurfaceView,镜像问题就解决了。
3.在 TV 端使用 RecyclerView 时,如果只设置 onItemLongClickListener,而不设置 onItemClickListener,那么单击 item 也会触发长按效果。
4.如果你的 Activity 设置了下面这条属性,作用是让这个 Activity 的背景透明,那么当这个 Activity 覆盖了别的 Activity时,被覆盖的Activity 不会走 onStop 生命周期,当被覆盖的 Activity 是别人的 apk 里的,就有很大可能会出现问题,例如 launcher的视频播放页面很可能是在 onStop 里暂停视频播放,如果你的 Activity 被设置成透明启动了,这时 launcher 的视频仍然在播放;
<item name="android:windowIsTranslucent">true</item>
5.在使用 RecyclerView 时,如果只刷新局部可能会出现闪屏现象,这是由 RecyclerView 默认动画导致的,
可以通过关闭默认动画来解决:
((SimpleItemAnimator)recyclerView.getItemAnimator()).setSupportsChangeAnimations(false);
还有一种说法是把执行动画的时间设置为0来解决,不过测试无效:
recyclerView.getItemAnimator().setChangeDuration(0);
图中箭头指向部分就是右上角刷新时在下面闪出来的。
6.RecyclerView 在xml 布局里设置 focusable 不生效
<android.support.v7.widget.RecyclerView
...
android:focusable="false"
...
/>
在代码里设置才生效
recyclerview.setFocusable(false);
7.在播放页面,也就是页面上有一个SurfaceView时,xml文件里别的View设置INVISIBLE会出bug,只能用GONE,不然在代码里设置VISIBLE无效。
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_live_play"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.wasu.hotellauncher.ui.home.VodPlayerActivity">
<SurfaceView
android:id="@+id/avp_suface"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<ImageView
android:id="@+id/avp_iv_status"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="invisible"
android:layout_gravity="center"
android:background="@mipmap/ic_play_forward_speed_04"/>
</FrameLayout>
8.focusable 、 focusableInTouchMode 和 clickable:
focusable 就是设置这个 View 能否获取焦点,focusableInTouchMode 就是设置这个 View 能否通过触摸让它获取焦点;
如果设置了 focusable = false,那么focusableInTouchMoe一定等于 false;
如果设置了 focusalbeInTouch = true,那么focusable一定等于true;
如果只设置focusable = true,focusableInTouchMode 默认为 false,你可以通过类似电视遥控器或是什么别的能操控上下左右键的设备让该 View 获取到焦点,但是通过触摸点击不能让其获取焦点,点击时直接触发 click 事件;
如果设置了focusableInTouchMode = true,除了可以通过遥控器让View获取焦点,还可以触摸点击使该View获取焦点,不过触摸点击的第一次会先让这个 View获取焦点,不会触发 click 事件,在 View 聚焦状态下再次点击才能触发 click 事件。
更多推荐
所有评论(0)