TV端开发遇坑随记
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);