我正在尝试使用 RecyclerView 创建类似于此的布局,用于类似电视的应用程序。
第一个元素表示焦点项目的外观。我尝试过的解决方案是:
唯一有效的方法是缩放聚焦元素,但这不是一个解决方案,因为所有的孩子都被缩放,比如TextViews等,文本看起来不正确。 有没有人有这方面的解决方案?谢谢!
答案 0 :(得分:0)
API 21 + 只需在您的观看中使用
@Override
public void onFocusChange(View v, boolean hasFocus) {
ViewCompat.setElevation(this, hasFocus?1:0);
}
API 16 + 这是我的扩展TvRecyclerView:
public class TvRecyclerView extends android.support.v7.widget.RecyclerView {
public TvRecyclerView(Context context) {
super(context);
setChildrenDrawingOrderEnabled(true);
}
public TvRecyclerView(Context context, AttributeSet attrs) {
super(context, attrs);
setChildrenDrawingOrderEnabled(true);
}
public TvRecyclerView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
setChildrenDrawingOrderEnabled(true);
setClipToPadding(false);
}
@Override
protected int getChildDrawingOrder(int childCount, int i) {
View view = getLayoutManager().getFocusedChild();
if (null == view) {
return super.getChildDrawingOrder(childCount, i);
}
int position = indexOfChild(view);
if (position < 0) {
return super.getChildDrawingOrder(childCount, i);
}
if (i == childCount - 1) {
return position;
}
if (i == position) {
return childCount - 1;
}
return super.getChildDrawingOrder(childCount, i);
}
}
基本上它只是重新排序项目,因此焦点项目始终位于顶部。
同样在您的观看中,您需要使用
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
v.setScaleX(1.5f);
v.setScaleY(1.5f);
mRecyclerView.invalidate();
} else {
v.setScaleX(1.0f);
v.setScaleY(1.0f);
}
}