TV上和手机的区别主要是焦点的获取和响应
第一种方式:在activity中
private void handleFocus(int index, boolean hasFocus) {
try {
// setFocusable这个是用键盘是否能获得焦点
// setFocusableInTouchMode这个是触摸是否能获得焦点
memberItems[index].setFocusableInTouchMode(hasFocus);
memberItems[index].setFocusable(hasFocus);
if (hasFocus) {
memberItems[index].requestFocus();
}
if (index == 0) {
// scrollTo在当前视图内容偏移至(x , y)坐标处。
// smoothScrollTo类似于scrollTo,但是滚动的时候是平缓的而不是立即滚动到某处。另外,smoothScrollTo()方法可以打断滑动动画。
pay_list.smoothScrollTo(0, 0);
} else {
pay_list.smoothScrollTo(790 * (index - 1) + 130, 0);
}
} catch (Exception e) {
e.printStackTrace();
}
}
调用,传入参数
@Override
public void loadMemberInfoFinish(CallBack<List<MemberCardsModel>> callBack) {
paylist.addAll(callBack.data);
initMemberItem();
handleFocus(0, true);
currentFocusIndex = 0;
}
第二种:在fragment中
public interface IFocusChangeListener {
public void onFocus(IUIViewBase view, boolean hasFocus);
}
@Override
public void onFocusChange(View arg0, boolean arg1) {
if (focusChangeListener != null) {
focusChangeListener.onFocus(this, arg1);
}
hasFocus = arg1;
if (scaleFocus) {
getView().bringToFront();
doScaleAnimation(arg1);
}
}
@Override
public boolean hasFocus() {
return hasFocus;
}
@Override
public void onFocus(IUIViewBase iuiViewBase, boolean b) {
if (b) { layout.setBackgroundResource(R.drawable.home_sc_selected);
} else {
layout.setBackgroundResource(R.drawable.home_sc_selected_tm);
}
}
@Override
public boolean requestFocus() {
return true;
}
@Override
public FocusReturnType onKeyCenter() {
if (currentFocus == 0) {
SelectionUrlOne();
} else {
SelectUrl();
}
return FocusReturnType.hasFocus;
}
Log检测响应codekey对应的具体的值,方法:
Log.i("dfghj", "preSegmentBtn keyCode " + keyCode);
if (listener != null && (keyCode == KeyEvent.KEYCODE_ENTER || keyCode == KeyEvent.KEYCODE_DPAD_CENTER) && event.getAction() == KeyEvent.ACTION_DOWN) {
listener.onPrevBtnClicked();
return true;
}
return false;
第一个true,有事件本身消费,第二个false,消费后把控制全还给父类。
还有一个比较麻烦的问题,什么时候调用父类的,什么时候调用自己对应的keycode对相关功能进行操作,例如:音量我在加减的时候怎么屏蔽掉系统的音量加减
在activity里面可以直接做处理
switch (keyCode){
case KeyEvent.KEYCODE_VOLUME_UP://音量+
return true;
case KeyEvent.KEYCODE_VOLUME_DOWN://音量-
return true;
case KeyEvent.KEYCODE_DPAD_UP:
return onkeyUp();
case KeyEvent.KEYCODE_DPAD_DOWN:
return onkeydown();
但是在frgment里面
switch (keyCode) {
case KeyEvent.KEYCODE_VOLUME_UP:
((KaraokeAudioEffectDialog) dialog).turnUpMusicVolume();
((KaraokeAudioEffectDialog) dialog).turnUpMicVolume();
seekBar.setProgress(KaraokeAudioEffectDialog.musicVoice);
value.setText(String.valueOf(KaraokeAudioEffectDialog.musicVoice));
if (!dialog.isShowing()) {
if (!volume.isVisible()) {
volume.clearAnimation();
volume.setVisible(true);
}
}
if (volume.isVisible()) {
UIHandler.removeCallbacks(runnable);
UIHandler.postDelayed(runnable, 2000);
}
return FocusReturnType.systemFocus;
所以在fragment里面处理的需要放在他的activity上面进行
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_VOLUME_UP:
return false;
case KeyEvent.KEYCODE_VOLUME_DOWN:
// playFragment.onKeyDown(keyCode, event);
return false;
}
return super.onKeyDown(keyCode, event);
都返回false