1. 遥控器按键的监听方法 实现 View.OnKeyListener接口,重写onKey()方法
@Override //第一个参数代表监听的控件对象 第二个参数是输入的按键信息 第三个参数是按键的动作(按下,释放等) public boolean onKey(View view, int keyCode, KeyEvent keyEvent) { if(keyCode == KEYCODE_DPAD_DOWN &&keyEvent.getAction() == ACTION_DOWN){ switch (view.getId()){ case R.id.play: MainActivity.MoveToPosition(0); break; case R.id.booking: MainActivity.MoveToPosition(1); break; case R.id.download: MainActivity.MoveToPosition(3); break; case R.id.delete: MainActivity.MoveToPosition(4); break; } } return false; }
2.使得recyclerview的某一项获得焦点的方法
public static void MoveToPosition(int n) { //调用recyclerview的getChildAt(n).requestFocus()即可 mainBinding.mainRecycler.getChildAt(n).requestFocus(); }
3.recyclerView 快速移动时,焦点乱飞的问题
自定义recyclerview使用的LayoutManager 并重写onInterceptFocusSearch方法
public class MyLinearLayoutManager extends LinearLayoutManager { public MyLinearLayoutManager(Context context) { super(context); } @Nullable @Override //拦截焦点 public View onInterceptFocusSearch(@NonNull View focused, int direction) { int count = getItemCount();//获取item的总数 int fromPos = getPosition(getFocusedChild());//当前焦点的位置 int lastVisibleItemPos = findLastVisibleItemPosition();//最新的已显示的Item的位置 switch (direction) {//根据按键逻辑控制position case View.FOCUS_RIGHT: fromPos++; break; case View.FOCUS_LEFT: fromPos--; break; } if(fromPos < 0 || fromPos >= count ) { //如果下一个位置<0,或者超出item的总数,则返回当前的View,即焦点不动 return focused; } else { //如果下一个位置大于最新的已显示的item,即下一个位置的View没有显示,则滑动到那个位置,让他显示,就可以获取焦点了 if (fromPos > lastVisibleItemPos) { scrollToPosition(fromPos); } } return super.onInterceptFocusSearch(focused, direction); } }
4.recyclerview 嵌套fragment fragment有按钮,但是无法获得焦点问题
强行在recyclerview的adapter里面获取焦点
在onBindViewHolder方法中 强行获取焦点
if(position == 3){
holder.textView.setNextFocusDownId(R.id.download);
}
5.自定义view 使用drawText时,文字居中问题
//使画出的文字居中 Paint.FontMetrics fontMetrics=textPaint.getFontMetrics(); //(fontMetrics.descent - fontMetrics.ascent)/2 得到文字高度的一半 float distance=(fontMetrics.descent - fontMetrics.ascent)/2 - fontMetrics.bottom; float baseline=getHeight()/2+distance; canvas.drawText(text, getWidth()/2, baseline, textPaint);