Android Studio TV开发教程
在电视应用内搜索
在电视上使用媒体应用程序时,用户经常会记住特定的内容。 如果您的应用包含大量内容目录,浏览特定标题可能不是用户找到所需内容的最有效方式。 搜索界面可以帮助用户比浏览更快地获得他们想要的内容。
Leanback支持库提供了一组类,可在您的应用程序中启用与电视上的其他搜索功能一致的标准搜索界面,并提供语音输入等功能。
本课讨论如何使用Leanback支持库类在您的应用程序中提供搜索界面。
添加搜索动作
将BrowseFragment
类用于媒体浏览界面时,可以启用搜索界面作为用户界面的标准部分。 搜索界面是在BrowseFragment
对象上设置View.OnClickListener
时出现在布局中的图标。 以下示例代码演示了这种技术。
@覆盖
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
的setContentView(R.layout.browse_activity);
mBrowseFragment =(BrowseFragment)
。getFragmentManager()findFragmentById(R.id.browse_fragment);
...
mBrowseFragment.setOnSearchClickedListener(new View.OnClickListener(){
@覆盖
public void onClick(View view){
Intent intent = new Intent(BrowseActivity.this,SearchActivity.class);
startActivity(意向);
}
});
mBrowseFragment.setAdapter(buildAdapter());
}
注意:您可以使用setSearchAffordanceColor(int)
设置搜索图标的颜色。
添加搜索输入和结果
当用户选择搜索图标时,系统通过定义的意图调用搜索活动。 您的搜索活动应该使用包含SearchFragment
的线性布局。该片段还必须实现SearchFragment.SearchResultProvider
接口以显示搜索结果。以下代码示例演示如何扩展SearchFragment
类以提供搜索界面和结果:
公共类MySearchFragment扩展了SearchFragment
实现SearchFragment.SearchResultProvider {
private static final int SEARCH_DELAY_MS = 300;
private ArrayObjectAdapter mRowsAdapter;
private Handler mHandler = new Handler();
private SearchRunnable mDelayedLoad;
@覆盖
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
mRowsAdapter = new ArrayObjectAdapter(new ListRowPresenter());
setSearchResultProvider(本);
setOnItemClickedListener(getDefaultItemClickedListener());
mDelayedLoad = new SearchRunnable();
}
@覆盖
public ObjectAdapter getResultsAdapter(){
返回mRowsAdapter;
}
@覆盖
公共布尔onQueryTextChange(字符串newQuery){
mRowsAdapter.clear();
if(!TextUtils.isEmpty(newQuery)){
mDelayedLoad.setSearchQuery(newQuery);
mHandler.removeCallbacks(mDelayedLoad);
mHandler.postDelayed(mDelayedLoad,SEARCH_DELAY_MS);
}
返回true;
}
@覆盖
公共布尔onQueryTextSubmit(字符串查询){
mRowsAdapter.clear();
if(!TextUtils.isEmpty(query)){
mDelayedLoad.setSearchQuery(查询);
mHandler.removeCallbacks(mDelayedLoad);
mHandler.postDelayed(mDelayedLoad,SEARCH_DELAY_MS);
}
返回true;
}
}
上面显示的示例代码旨在与单独的SearchRunnable
类一起使用,该类在单独的线程上运行搜索查询。 这种技术可以阻止可能运行缓慢的查询阻塞主用户界面线程。
建立电视游戏
电视屏幕提出了许多对手机游戏开发者而言可能是新的考虑因素。 这些领域包括其大尺寸,其控制方案,以及所有玩家同时观看的事实。
显示
在为电视屏幕开发游戏时需要注意的两个主要问题是其作为共享显示屏的性质以及需要针对横向设计游戏。
考虑共享显示
客厅电视为多人游戏带来了设计挑战,因为所有玩家都能看到一切。 这个问题与依赖每个玩家拥有隐藏信息的游戏(如纸牌游戏或策略游戏)尤其相关。
有些机制可以解决一个玩家窃听他人信息的问题:
- 屏幕上有一个盲板来帮助隐藏信息。 例如,在单词或纸牌游戏等基于回合的游戏中,一次一名玩家可能会查看显示。 当玩家完成移动时,游戏允许他或她用遮挡物遮挡屏幕,阻止任何人查看秘密信息。 当下一位玩家开始转身时,遮挡物会打开以显示他或她自己的信息。
- 在手机或平板电脑上运行的伴侣应用程序可以让玩家通过作为第二个屏幕隐藏信息。
支持景观显示
电视总是横向:你不能转动它,并且没有纵向。 总是将您的电视游戏设计为以横向模式显示。
输入设备
电视机没有触摸界面,所以更重要的是让你的控制权正确并确保玩家发现它们直观而有趣。 处理控制器还引入了一些其他需要注意的问题,例如跟踪多个控制器,并正常处理断开连接。 包括游戏在内的所有电视应用都应该一致地处理控制器 请阅读管理电视控制器以获取有关使用TV控制器和Handle控制器的更多信息,了解有关使用TV 控制器进行游戏的特定信息。
表现
游戏应该包含在Android清单中的一些特别的东西。
在主屏幕上显示您的游戏
Android TV主屏幕将游戏与常规应用分开显示。 要使游戏出现在游戏列表中,请在应用程序清单的<application>
标记中将android:isGame
属性设置为"true"
例如:
<应用
...
机器人:isGame = “真”
...
>
声明支持游戏控制器
游戏控制器可能对电视设备的用户不可用或不可用。 为了正确告知用户您的游戏支持游戏控制器,您必须在应用清单中包含以下条目:
<uses-feature android:name =“android.hardware.gamepad”android:required =“false”/>
注:指定android:hardware:gamepad
支持时,请勿将android:required
属性设置为"true"
如果您这样做,用户将无法在电视设备上安装您的应用程序。
有关清单条目的更多信息,请参阅应用程序清单 。
Google Play游戏服务
如果您的游戏集成了Google Play游戏服务 ,则应记住与成就,登录,保存游戏和多人游戏有关的一些注意事项。
成就
你的游戏至少应该包括五个(可获得的)成就。 只有从支持的输入设备控制游戏玩法的用户才能获得成就。 有关成就以及如何实施的更多信息,请参阅Android中的成就 。
签到
您的游戏应该在启动时尝试签署用户。 如果玩家连续几次拒绝登录,您的游戏应该停止询问。 在Android上实施登录了解有关登录的详情。
保存
使用Google Play服务保存的游戏存储您的游戏保存。 您的游戏应该将游戏存档绑定到特定的Google帐户,以便即使在不同设备上也能够唯一识别:无论玩家是使用手机还是电视,游戏都应该能够从同一用户帐户中获取游戏保存信息。
您还应该在游戏的用户界面中提供一个选项,以允许玩家删除本地和云存储的数据。 您可以将选项放入游戏的Settings
屏幕中。 有关使用Play服务实现已保存游戏的具体信息,请参阅Android中的已保存游戏 。
多人游戏体验
提供多人体验的游戏必须允许至少两名玩家进入房间。 有关Android中多人游戏的更多信息,请参阅Android开发人员网站上的实时多人游戏和基于回合的多人游戏文档。
出口
提供一致且明显的UI元素,让用户可以优雅地退出游戏。 该元素应该可以通过D-pad导航按钮访问。 这样做,而不是依靠主页按钮来提供退出,因为这是不一致的,也不可靠跨越不同的控制器。
卷筒纸
请勿在Android TV的游戏中启用网页浏览。 Android TV不支持网络浏览器。
注意:您可以使用WebView
类登录Google+和Facebook等服务。
联网
游戏经常需要更大的带宽来提供最佳的性能,并且许多用户更喜欢以太网到WiFi来提供这种性能。 你的应用程序应该检查WiFi和以太网连接。 如果您的应用仅适用于电视,则无需像使用移动应用那样检查3G / LTE服务。