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);
|