不断学习,做更好的自己!?
| 视频号 | CSDN | 简书 |
|---|---|---|
| 欢迎打开微信,关注我的视频号:KevinDev | 点我 | 点我 |
LeanBack 是 Google 官方推出的 TV 端的功能库,里面包含了很多在 TV Android 端开发常用的控件,本文重点介绍其对 RecyclerView 适配 TV 端做的封装:HorizontalGridView 。
效果图

属性 & 方法
- focusOutFront、focusOutEnd
如果标题栏使用 HorizontalGridView 实现,内容区域使用 Fragment 里放的 VerticalGridView 实现,可能出现标题栏和内容区焦点切换不成功的问题,比如说,焦点不能从内容区切到标题栏这样的情况。这时使用 focusOutFront 和 focusOutEnd 属性能够解决问题,解决不同容器里焦点切换不成功的问题。
- setHorizontalSpacing()
设置 HorizontalGridView 的 Item 之间的间距。
- setFocusScrollStrategy()
设置焦点的滚动方式,它的参数有3个可选值,默认值为 FOCUS_SCROLL_ALIGNED;
- FOCUS_SCROLL_ALIGNED:焦点在中间
- FOCUS_SCROLL_ITEM:焦点在末尾
- FOCUS_SCROLL_PAGE:翻页
- setNumRows()
设置行数,默认 HorizontalGridView 为一行,通过 setNumRows 方法可以设置多行。但有个注意点,设置多行后要注意 position 的位置。
- setRowHeight()
设置 HorizontalGridView 的 Item 的高度,而不是用来设置 HorizontalGridView 的高度。
- setSelectedPosition()、setSelectedPositionSmooth()
让某个 position 获取焦点,区别在于 setSelectedPositionSmooth 在移动时更平滑一点。
- duplicateParentState()
它的放大的焦点 View 是每个 Item 的最外层布局,而不是图标那个View,但是其焦点框却套在了图标那个 View 上,那这种效果如果我来实现就会用到 duplicateParentState 属性了。duplicateParentState 的意思是:当前控件是否跟随父控件的(点击、焦点等)状态。
基本使用
1. 添加依赖
implementation 'androidx.leanback:leanback:1.0.0' implementation 'androidx.leanback:leanback-preference:1.0.0'
2. 布局文件
- bg_title.xml
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/btn_focus" android:state_focused="true" />
selector>
- btn_focus.xml
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <corners android:radius="300dp" /> <solid android:color="#FF4081" />
shape>
- activity_widget.xml
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/teal_200" tools:context=".widget.WidgetActivity"> <androidx.leanback.widget.HorizontalGridView android:id="@+id/hg_title" android:layout_width="wrap_content" android:layout_height="50dp" app:focusOutEnd="true" app:focusOutFront="true" tools:ignore="MissingConstraints" />
androidx.constraintlayout.widget.ConstraintLayout>
- item_title.xml
<TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/tv_title" android:layout_width="wrap_content" android:layout_height="match_parent" android:background="@drawable/bg_title" android:clickable="true" android:focusable="true" android:gravity="center" android:textColor="#FFFFFF" android:focusableInTouchMode="true" android:paddingLeft="30dp" android:paddingRight="30dp" android:textSize="28sp" />
3. 创建 Presenter
/ * Created on 2022/4/16 17:51 * * @author Gong Youqiang */ public class TitlePresenter extends Presenter {
@Override public ViewHolder onCreateViewHolder(ViewGroup viewGroup) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_title, viewGroup, false); return new ViewHolder(view); } @Override public void onBindViewHolder(Presenter.ViewHolder viewHolder, Object o) {
if (o instanceof Title) {
ViewHolder vh = (ViewHolder) viewHolder; vh.tvTitle.setText(((Title) o).getName()); } } @Override public void onUnbindViewHolder(Presenter.ViewHolder viewHolder) {
} static class ViewHolder extends Presenter.ViewHolder {
TextView tvTitle; public ViewHolder(View view) {
super(view); tvTitle = view.findViewById(R.id.tv_title); } } }
4. Title.java
/ * Created on 2022/4/16 17:53 * * @author Gong Youqiang */ public class Title {
private String name; public Title(String name) {
this.name = name; } public String getName() {
return name; } public void setName(String name) {
this.name = name; } }
5. TitleModel
/ * Created on 2022/4/16 17:53 * * @author Gong Youqiang */ public class TitleModel {
public static List<Title> getTitleList() {
List<Title> titleList = new ArrayList<>(); titleList.add(new Title("儿童模式")); titleList.add(new Title("家庭模式")); titleList.add(new Title("商务模式")); return titleList; } }
6. 使用
public class WidgetActivity extends AppCompatActivity {
@BindView(R.id.hg_title) HorizontalGridView horizontalGridView; @SuppressLint("RestrictedApi") @Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); setContentView(R.layout.activity_widget); ButterKnife.bind(this); horizontalGridView.setHorizontalSpacing(30); ArrayObjectAdapter arrayObjectAdapter = new ArrayObjectAdapter(new TitlePresenter()); ItemBridgeAdapter itemBridgeAdapter = new ItemBridgeAdapter(arrayObjectAdapter); horizontalGridView.setAdapter(itemBridgeAdapter); horizontalGridView.setFocusScrollStrategy(BaseGridView.FOCUS_SCROLL_ITEM); arrayObjectAdapter.addAll(0, TitleModel.getTitleList()); } }
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/211284.html原文链接:https://javaforall.net
