android leanback使用详解以及获取焦点高亮
转自:http://blog.csdn.net/dongdengke123789/article/details/53541833?hp.com
最近公司有个电视端的项目,对于从未接触过TV端开发的我来说是一种跳转,同时也是一个机遇。TV端开发和手机端开发最大的 不同是焦点的处理以及获取焦点时的酷炫效果。本例子主要实现了利用HorizontalGridView来实现水平滑动的gridview以及获取焦点时的特效。
刚拿到效果时,感觉so easy!可真正到动手写代码时,却卡到了获取焦点时的特效了。上网查了好多资料,但是有关TV端的开发却非常少。于是,自己就尝试分析实现方式。获取焦点时的具体需求是这样的:获取焦点时,整个图片在原来的基础上放大到1.15倍,并在外层有种选中时带有阴影的高亮的图片。通过分析,使用动画来实现较为简单。经过尝试,放大实现了,但是达不到预期效果。经过多次尝试,终于实现了最终效果。基本效果图如下(由于是测试内容,UI比较丑,请见谅):
接下来就一步一步介绍具体的实现方案。
由于项目中使用了HorizontalGridView,所以要引入依赖
- compile 'com.android.support:leanback-v17:24.2.1'
compile 'com.android.support:leanback-v17:24.2.1'
此外使用HorizontalGridView还需要在清单文件中进行声明下
- <uses-feature
- android:name="android.software.leanback"
- android:required="false" />
<uses-featureandroid:name="android.software.leanback"android:required="false" />
到此,准备工作就完毕了,接下来就开始写布局文件了。
- <?xml version="1.0" encoding="utf-8"?>
- <RelativeLayout 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:id="@+id/activity_main"
- android:layout_width="match_parent"
- android:background="@drawable/index_bg"
- android:layout_height="match_parent">
- <android.support.v17.leanback.widget.HorizontalGridView
- android:id="@+id/horizontalgridview"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_margin="10dp"
- app:numberOfRows="2" />
- </RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:id="@+id/activity_main"android:layout_width="match_parent"android:background="@drawable/index_bg"android:layout_height="match_parent"><android.support.v17.leanback.widget.HorizontalGridViewandroid:id="@+id/horizontalgridview"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_margin="10dp"app:numberOfRows="2" />
</RelativeLayout>
接下来,就需要在JAVA代码去实现了。
- horizontalgridview=(HorizontalGridView) findViewById(R.id.horizontalgridview);
- horizontalgridview.requestFocus();
- for (int i=0;i<50;i++)
- mdatas.add("这是测试的"+i);
- MyAdapter adapter=new MyAdapter(this,mdatas);
- horizontalgridview.setAdapter(adapter);
horizontalgridview=(HorizontalGridView) findViewById(R.id.horizontalgridview);horizontalgridview.requestFocus();for (int i=0;i<50;i++)mdatas.add("这是测试的"+i);MyAdapter adapter=new MyAdapter(this,mdatas);horizontalgridview.setAdapter(adapter);
最为关键的就是Adapter的,在这里面要完成获取焦点时的特效,以及通过接口实现Item点击时的处理。
首先,我们自定义一个接口,完成item点击和获取焦点的回调:
- public interface OnItemCallBack {
- public void onFocusChange(View v, boolean hasFocus, int posiotion);
- public void onItemClick(View v, int position);
- }
public interface OnItemCallBack {public void onFocusChange(View v, boolean hasFocus, int posiotion);public void onItemClick(View v, int position);
}
接下来,自定义一个内部类,完成点击事件的处理,具体代码如下:
- private class MyClick implements View.OnClickListener {
- int position;
- public MyClick(int position) {
- this.position = position;
- }
- @Override
- public void onClick(View v) {
- if (onItemCallBack != null) {
- onItemCallBack.onItemClick(v, position);
- }
- }
- }
- public void setOnItemCallBack(OnItemCallBack onItemCallBack) {
- this.onItemCallBack = onItemCallBack;
- }
private class MyClick implements View.OnClickListener {int position;public MyClick(int position) {this.position = position;}@Overridepublic void onClick(View v) {if (onItemCallBack != null) {onItemCallBack.onItemClick(v, position);}}}public void setOnItemCallBack(OnItemCallBack onItemCallBack) {this.onItemCallBack = onItemCallBack;}
然后,在定义一个处理获取焦点的内部类,完成获取交单时的处理,具体代码如下:
- private class MyFocusChange implements View.OnFocusChangeListener {
- int position;
- MyViewHolder holder;
- public MyFocusChange(int position, MyViewHolder holder) {
- this.position = position;
- this.holder = holder;
- }
- @Override
- public void onFocusChange(View v, boolean hasFocus) {
- if (hasFocus) {
- holder.rl_scale.animate().scaleX(1.15f).scaleY(1.15f).start();
- holder.rl_scale.setBackgroundResource(R.drawable.bg_pic_s);
- } else {
- holder.rl_scale.animate().scaleX(1f).scaleY(1f).start();
- holder.rl_scale.setBackgroundResource(R.drawable.bg_pic_n);
- }
- if (onItemCallBack != null) {
- onItemCallBack.onFocusChange(v, hasFocus, position);
- }
- }
- }
private class MyFocusChange implements View.OnFocusChangeListener {int position;MyViewHolder holder;public MyFocusChange(int position, MyViewHolder holder) {this.position = position;this.holder = holder;}@Overridepublic void onFocusChange(View v, boolean hasFocus) {if (hasFocus) {holder.rl_scale.animate().scaleX(1.15f).scaleY(1.15f).start();holder.rl_scale.setBackgroundResource(R.drawable.bg_pic_s);} else {holder.rl_scale.animate().scaleX(1f).scaleY(1f).start();holder.rl_scale.setBackgroundResource(R.drawable.bg_pic_n);}if (onItemCallBack != null) {onItemCallBack.onFocusChange(v, hasFocus, position);}}}
到此,整个功能就实现了,最后粘上Adapter的整个代码:
- package cn.chinaiptv.horiziengridviewdemo;
- import android.content.Context;
- import android.support.v7.widget.RecyclerView;
- import android.view.LayoutInflater;
- import android.view.View;
- import android.view.ViewGroup;
- import android.widget.ImageView;
- import android.widget.LinearLayout;
- import android.widget.RelativeLayout;
- import android.widget.TextView;
- import java.util.ArrayList;
- /**
- * Created by Administrator on 2016/12/9.
- */
- public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
- private Context context;
- private ArrayList<String> mdatas;
- private OnItemCallBack onItemCallBack;
- public MyAdapter(Context context, ArrayList<String> mdatas) {
- this.context = context;
- this.mdatas = mdatas;
- }
- @Override
- public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
- View inflate = LayoutInflater.from(context).inflate(
- R.layout.item, null);
- MyViewHolder holder = new MyViewHolder(inflate);
- return holder;
- }
- @Override
- public void onBindViewHolder(MyAdapter.MyViewHolder holder, int position) {
- holder.tv_text.setText(mdatas.get(position));
- holder.itemView.setOnClickListener(new MyClick(position));
- holder.itemView.setOnFocusChangeListener(new MyFocusChange(position,
- holder));
- }
- @Override
- public int getItemCount() {
- return mdatas.size();
- }
- class MyViewHolder extends RecyclerView.ViewHolder{
- public ImageView iv_pic;
- public TextView tv_text;
- public RelativeLayout rl_scale;
- public MyViewHolder(View itemView) {
- super(itemView);
- iv_pic=(ImageView) itemView.findViewById(R.id.iv_pic);
- tv_text=(TextView) itemView.findViewById(R.id.tv_text);
- rl_scale=(RelativeLayout) itemView.findViewById(R.id.rl_scale);
- }
- }
- private class MyFocusChange implements View.OnFocusChangeListener {
- int position;
- MyViewHolder holder;
- public MyFocusChange(int position, MyViewHolder holder) {
- this.position = position;
- this.holder = holder;
- }
- @Override
- public void onFocusChange(View v, boolean hasFocus) {
- if (hasFocus) {
- holder.rl_scale.animate().scaleX(1.15f).scaleY(1.15f).start();
- holder.rl_scale.setBackgroundResource(R.drawable.bg_pic_s);
- } else {
- holder.rl_scale.animate().scaleX(1f).scaleY(1f).start();
- holder.rl_scale.setBackgroundResource(R.drawable.bg_pic_n);
- }
- if (onItemCallBack != null) {
- onItemCallBack.onFocusChange(v, hasFocus, position);
- }
- }
- }
- private class MyClick implements View.OnClickListener {
- int position;
- public MyClick(int position) {
- this.position = position;
- }
- @Override
- public void onClick(View v) {
- if (onItemCallBack != null) {
- onItemCallBack.onItemClick(v, position);
- }
- }
- }
- public void setOnItemCallBack(OnItemCallBack onItemCallBack) {
- this.onItemCallBack = onItemCallBack;
- }
- }
package cn.chinaiptv.horiziengridviewdemo;import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;import java.util.ArrayList;/*** Created by Administrator on 2016/12/9.*/public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {private Context context;private ArrayList<String> mdatas;private OnItemCallBack onItemCallBack;public MyAdapter(Context context, ArrayList<String> mdatas) {this.context = context;this.mdatas = mdatas;}@Overridepublic MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {View inflate = LayoutInflater.from(context).inflate(R.layout.item, null);MyViewHolder holder = new MyViewHolder(inflate);return holder;}@Overridepublic void onBindViewHolder(MyAdapter.MyViewHolder holder, int position) {holder.tv_text.setText(mdatas.get(position));holder.itemView.setOnClickListener(new MyClick(position));holder.itemView.setOnFocusChangeListener(new MyFocusChange(position,holder));}@Overridepublic int getItemCount() {return mdatas.size();}class MyViewHolder extends RecyclerView.ViewHolder{public ImageView iv_pic;public TextView tv_text;public RelativeLayout rl_scale;public MyViewHolder(View itemView) {super(itemView);iv_pic=(ImageView) itemView.findViewById(R.id.iv_pic);tv_text=(TextView) itemView.findViewById(R.id.tv_text);rl_scale=(RelativeLayout) itemView.findViewById(R.id.rl_scale);}}private class MyFocusChange implements View.OnFocusChangeListener {int position;MyViewHolder holder;public MyFocusChange(int position, MyViewHolder holder) {this.position = position;this.holder = holder;}@Overridepublic void onFocusChange(View v, boolean hasFocus) {if (hasFocus) {holder.rl_scale.animate().scaleX(1.15f).scaleY(1.15f).start();holder.rl_scale.setBackgroundResource(R.drawable.bg_pic_s);} else {holder.rl_scale.animate().scaleX(1f).scaleY(1f).start();holder.rl_scale.setBackgroundResource(R.drawable.bg_pic_n);}if (onItemCallBack != null) {onItemCallBack.onFocusChange(v, hasFocus, position);}}}private class MyClick implements View.OnClickListener {int position;public MyClick(int position) {this.position = position;}@Overridepublic void onClick(View v) {if (onItemCallBack != null) {onItemCallBack.onItemClick(v, position);}}}public void setOnItemCallBack(OnItemCallBack onItemCallBack) {this.onItemCallBack = onItemCallBack;}
}
到此,就完美实现了此功能。以上仅是自己的见解,如有不足之处欢迎讨论。
android leanback使用详解以及获取焦点高亮相关推荐
- leanback android,Android TV之谷歌android leanback框架详解
google leanback 库简介 "Leanback" 就是靠着看的意思.是指以放松的姿势倒在沙发上.谷歌推出 android.support.v17.leanback 软件 ...
- Android TV之谷歌android leanback框架详解
google leanback 库简介 "Leanback" 就是靠着看的意思.是指以放松的姿势倒在沙发上.谷歌推出 android.support.v17.leanback 软件 ...
- 《Android游戏开发详解》——第1章,第1.6节函数(在Java中称为“方法”更好)...
本节书摘来自异步社区<Android游戏开发详解>一书中的第1章,第1.6节函数(在Java中称为"方法"更好),作者 [美]Jonathan S. Harbour,更 ...
- JMessage Android 端开发详解
JMessage Android 端开发详解 目前越来越多的应用会需要集成即时通讯功能,这里就为大家详细讲一下如何通过集成 JMessage 来为你的 App 增加即时通讯功能. 首先,一个最基础的 ...
- 《Java和Android开发实战详解》——2.5节良好的Java程序代码编写风格
本节书摘来自异步社区<Java和Android开发实战详解>一书中的第2章,第2.5节良好的Java程序代码编写风格,作者 陈会安,更多章节内容可以访问云栖社区"异步社区&quo ...
- Android事件流程详解
Android事件流程详解 网络上有不少博客讲述了android的事件分发机制和处理流程机制,但是看过千遍,总还是觉得有些迷迷糊糊,因此特地抽出一天事件来亲测下,向像我一样的广大入门程序员详细讲述an ...
- Android Studio 插件开发详解二:工具类
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/78112856 本文出自[赵彦军的博客] 在插件开发过程中,我们按照开发一个正式的项 ...
- 《Android游戏开发详解》一2.16 区分类和对象
本节书摘来异步社区<Android游戏开发详解>一书中的第2章,第2.16节,作者: [美]Jonathan S. Harbour 译者: 李强 责编: 陈冀康,更多章节内容可以访问云栖社 ...
- Android Framework系统服务详解
Android Framework系统服务详解 操作环境 系统:Linux (Ubuntu 12.04) 平台:高通 Android版本:5.1 PS: 符号...为省略N条代码 一.大致原理分析 A ...
最新文章
- RegionServer宕机的原因
- uva11029 - Leading and Trailing
- Maven的学习资料收集--(九) 构建SSH项目以及专栏maven
- delphi7 如何判定dbgrid两行重复_教你如何在服装上加入好看的毛线刺绣花边
- git revert和reset区别
- win7 无法修改 host 文件解决方案
- jieba的一些使用
- java 锁优化_Java中锁优化
- Multisim入门
- mysql启动报sock_mysql启动错误:mysql.sock丢失
- 常见的总线通信方式及其特点
- 使用laravel快速开发网站流程(composer)
- 华为路由器PPP与MP-PPP的配置实例
- XjhDemo 插入数据
- Halcon学习笔记:3D_coordinates(3D标定)
- MySQL奇偶数判断
- 草履虫纳米机器人_纳米机器人的研究进展如何?
- csp认证201903-1--小中大(c++)
- 单片机 STM32 HAL PCF8574 例子代码
- Kali Linux 使用远程桌面连接——xrdpxfce
热门文章
- C# 删除文件和删除文件夹
- 性能优化 - likely和unlikely函数
- tf.Variable()函数
- 几何体的体积和表面积
- vue实现浏览器记住密码功能,并进行加密存储
- openstack核心组件-nova-计算服务
- ns2安装教程(ns2.35 Ubuntu16.04)
- NS2仿真:使用NS仿真软件模拟简单网络模型
- springboot+mysql情侣空间系统APP-计算机毕业设计源码39734
- testdisk windows mac linux,TestDisk for Mac-TestDisk Mac版下载 V7.2|TestDisk Mac版 - 燃文下载站...