Android 盒子开发过程中遇到的问题及解决方法
程序员文章站
2022-06-04 14:35:31
...
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);
上一篇: Spark开发中遇到的问题及解决方法
推荐阅读
-
使用 Eclipse 给 APK 签名遇到的问题及解决方法
-
Android 使用volley过程中遇到的问题解决办法
-
vue项目部署上线遇到的问题及解决方法
-
Hadoop环境搭建过程中遇到的问题以及解决方法
-
win7 wamp 64位 php环境开启curl服务遇到的问题及解决方法
-
html5的input的required使用中遇到的问题及解决方法
-
android studio 3.0 升级 项目遇到的问题及更改思路(问题小结)
-
Python中的Socket 与 ScoketServer 通信及遇到问题解决方法
-
Vue 项目中遇到的跨域问题及解决方法(后台php)
-
Vue项目pdf(base64)转图片遇到的问题及解决方法