要在保持焦点在中心元素上的情况下滚动VerticalGridView或RecyclerView,可以使用以下解决方法:
public class CenteredLayoutManager extends LinearLayoutManager {
public CenteredLayoutManager(Context context) {
super(context, VERTICAL, false);
}
@Override
public boolean requestChildRectangleOnScreen(RecyclerView parent, View child, Rect rect, boolean immediate, boolean focusedChildVisible) {
int parentHeight = parent.getHeight();
int childHeight = child.getHeight();
int topMargin = (parentHeight - childHeight) / 2;
int bottomMargin = topMargin;
rect.top -= topMargin;
rect.bottom += bottomMargin;
return super.requestChildRectangleOnScreen(parent, child, rect, immediate, focusedChildVisible);
}
}
RecyclerView recyclerView = findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(new CenteredLayoutManager(this));
recyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {
@Override
public boolean onInterceptTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e) {
View child = rv.findChildViewUnder(e.getX(), e.getY());
if (child != null && e.getAction() == MotionEvent.ACTION_DOWN) {
rv.requestFocusFromTouch();
}
return false;
}
@Override
public void onTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e) {
}
@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
}
});
这样,当你滚动RecyclerView时,焦点将始终保持在中心元素上。
上一篇:保持焦点文本框
下一篇:保持角度在1到180度之间