AndroidTv Home接口的实现原理(二)-Leanback库的首页卡槽

NBAAndroid

1个回答

写回答

18014131730

2024-12-28 03:33

+ 关注

微信
微信

本文已授权微信公众号dasu_Android(大苏)独家发行首先查看效果图:在上一篇文章中Androidtv焦点放大,我们留下了一个问题。在“电视首页”界面中,这是非常常见的聚焦卡放大效果。在本文中,让我们看一下LeaNBAck库的实现方式。

如果我们想自己实现它,这个想法应该不难。它是编写一个放大和缩小,然后在卡片获得焦点时应用放大,而在失去焦点时应用放大,因此关键是如何封装。然后让我们学习GoogleLeaNBAck库的ItemView缩放的实现思想。当我查看源代码时,我习惯于按目的阅读它,因此只要我专注于理解与目的相关的代码,而不必分析每一行代码。

毕竟,当前很多代码的容量有限,目前尚不清楚。所以,这次阅读源代码的目的是找出:当卡片位置获得焦点时,放大和缩小的如何显示?阅读源代码时,经常会遇到一个问题,那就是从哪里开始以及从哪里开始?这就是为什么我习惯有目的地阅读的原因,因为我们可以从目的进行分析,猜测我们需要的代码在哪里,然后找到我们应该在哪里阅读,然后逐步进行分析。

Android
Android

例如,在此任务中,我们应该从哪里开始阅读源代码?首先,您必须了解LeaNBAck库的基本用法,这就是为什么我的第一个博客首先简要介绍LeaNBAck库的用法。在上一个博客中,我们可以看到我们正在处理以下类别的LeaNBAck库:由于我们在处理LeaNBAck方面仅有几点,因此起点应该是这些。

毕竟,我们对LeaNBAck不熟悉,所以我们只能从接触的地方开始。因此,请再考虑一下,因为您想在卡片聚焦并失去焦点时实现放大和缩小,那么您肯定需要监视ItemView的焦点变化,对吗?然后,我们通常要做的只是监视RecyclerView。Adapter中onCreateViewHolder()或onBindViewHolder()中ItemView的焦点。

现在方向已经确定,有必要找到哪个类实现了与LeaNBAckHome接口相对应的RecyclerView。Adapter。我们也知道Presenter在LeaNBAck中的角色类似于RecyclerView。Adapter,所以让我们先看一下Presenter。

ListRowPresenter继承自RowPresenter继承自Presenter,然后我们通过AndroidStudio跳转到Presenter进行查看。Presenter是一个抽象类,具有三个抽象方法,分别是onCreateViewHolder(),onBindViewHolder()和onUnbindViewHolder(),与RecyclerView。

Adapter很相似。根据我们之前的分析,ItemView焦点监视通常在onCreateViewHolder()或onBindViewHolder()中实现,然后让我们看一下其实现类ListRowPresenter。在ListRowPresenter中找不到这三种方法的实现,然后由其父类RowPresenter实现,我们继续通过AS跳至RowPresenter。

我们不需要了解onCreateViewHolder()中的代码,当然,您有时间和能力来做到这一点,但是现在主要是想了解其卡片缩放的实现,因此我们只需要查看是否存在与焦点监视有关的任何代码就是这样。显然,我没有找到它。有几种方法被称为。一些方法知道该功能是一目了然地创建对象。

您也可以单击以查看。在这里,我们着重于initializeRowViewHolder()方法。似乎没有与焦点监视相关的代码,但是在左侧有一个标志,表明子类ListRowPresenter已覆盖此方法,然后在运行代码时实际调用该代码,然后我们将单击以查看。

有很多代码,屏幕快照还没有完成,但是我们找到了一个键,并通过查看名称FocusHighlightHelper。setupBrowseItemFocusHighlight()找到了一种与焦点相关的方法,是吗?我们继续单击以查看。此方法的主要思想是设置每行的ItemView,即卡片位置获得焦点时的行为。

这不是卡片位置的缩放。看来我们已经找到了。查看代码,我调用ItemBridgeAdapter的setFocusHighlight()方法并继续进行后续操作。该方法仅设置mFocusHighlight变量的值,并且ItemBridgeAdapter继承RecyclerView。

Adapter,似乎在此处实现了对卡位置的焦点监视。看看onCreateViewHolder()方法是否有效。presenterView实际上是在Presenter中创建的ItemView,因此这里实际上是用于将焦点设置在卡位置上的更改监视。

viewHolder。mFocusChangeListener应该是View。OnFocusChangeListener的对象。让我们看一下。mFocusChangeListener的初始化通过实例化一个类对象来分配一个值,然后此类应实现View。

OnFocusChangeListener接口。让我们继续看看。现在很清楚。当焦点改变时,它将调用mFcousHightlight的onItemFocused()方法。mFcousHightlight在FocusHighlightHelper。

setupBrowseItemFocusHighlight()之前传递,称为ItemBridgeAdapter的setFocusHighlight()方法。让我们看看它传递了什么。查看BrowseItemFocusHighlight类的作用。

因此,焦点更改侦听器已注册到ItemBridgeAdapter中。当焦点改变时,通知mFcousHightlight执行onItemFocused()方法,而mFcousHightlight是BrowseItemFocusHighlight类的实例,因此实际上是执行上图中的逻辑。

通过查看代码也很容易理解。设置ItemView的选定状态并运行焦点Androidtv焦点放大,然后应在此处实现卡片位置的缩放。继续查看是否存在。实际上,此方法是创建对象。如果对象具有缓存,则将其从缓存中取出。如果没有,只需创建一个新的。

这种缓存的想法值得学习。此类用于实现缩放的效果。通过实现TimeAnimator。TimeListener接口来实现属性,当然,缩放也可以通过其他方式来实现。它只不过是放大和缩小视图,在此不做具体说明。如果有兴趣进行分析,可以来这里看看Google如何实现缩放。

如果以后有空,我可以再次分析这堂课。好的,基本上分析到此为止。卡片位置缩放在LeaNBAck库中的实现,从这里我们开始阅读源代码以找到焦点监控实现的相关代码到实现代码,整个过程基本上就是这样。将来,当您想了解源代码的某些功能是如何实现的时,您可以参考此想法进行分析,逐步进行后续操作,仅查找与我们目标相关的代码,以便您不能对整个源代码的复杂性感到困惑。

最后,我想再次总结一下上述过程。我最近刚刚开设了一个公共帐户,我想激励自己继续写作。一开始,我主要分享原始的AndroidAndroid-Tv知识。如果您有兴趣,可以引起注意。谢谢您的支持~~。

举报有用(10分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号