转自:http://blog.csdn.net/dongdengke123789/article/details/53541833?hp.com

最近公司有个电视端的项目,对于从未接触过TV端开发的我来说是一种跳转,同时也是一个机遇。TV端开发和手机端开发最大的 不同是焦点的处理以及获取焦点时的酷炫效果。本例子主要实现了利用HorizontalGridView来实现水平滑动的gridview以及获取焦点时的特效。

刚拿到效果时,感觉so easy!可真正到动手写代码时,却卡到了获取焦点时的特效了。上网查了好多资料,但是有关TV端的开发却非常少。于是,自己就尝试分析实现方式。获取焦点时的具体需求是这样的:获取焦点时,整个图片在原来的基础上放大到1.15倍,并在外层有种选中时带有阴影的高亮的图片。通过分析,使用动画来实现较为简单。经过尝试,放大实现了,但是达不到预期效果。经过多次尝试,终于实现了最终效果。基本效果图如下(由于是测试内容,UI比较丑,请见谅):

接下来就一步一步介绍具体的实现方案。

由于项目中使用了HorizontalGridView,所以要引入依赖

[java] view plain copy print?
  1. compile 'com.android.support:leanback-v17:24.2.1'
compile 'com.android.support:leanback-v17:24.2.1'

此外使用HorizontalGridView还需要在清单文件中进行声明下

[java] view plain copy print?
  1. <uses-feature
  2. android:name="android.software.leanback"
  3. android:required="false" />
    <uses-featureandroid:name="android.software.leanback"android:required="false" />

到此,准备工作就完毕了,接下来就开始写布局文件了。

[java] view plain copy print?
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. xmlns:tools="http://schemas.android.com/tools"
  5. android:id="@+id/activity_main"
  6. android:layout_width="match_parent"
  7. android:background="@drawable/index_bg"
  8. android:layout_height="match_parent">
  9. <android.support.v17.leanback.widget.HorizontalGridView
  10. android:id="@+id/horizontalgridview"
  11. android:layout_width="match_parent"
  12. android:layout_height="match_parent"
  13. android:layout_margin="10dp"
  14. app:numberOfRows="2" />
  15. </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代码去实现了。

[java] view plain copy print?
  1. horizontalgridview=(HorizontalGridView) findViewById(R.id.horizontalgridview);
  2. horizontalgridview.requestFocus();
  3. for (int i=0;i<50;i++)
  4. mdatas.add("这是测试的"+i);
  5. MyAdapter adapter=new MyAdapter(this,mdatas);
  6. 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点击和获取焦点的回调:

[java] view plain copy print?
  1. public interface OnItemCallBack {
  2. public void onFocusChange(View v, boolean hasFocus, int posiotion);
  3. public void onItemClick(View v, int position);
  4. }
public interface OnItemCallBack {public void onFocusChange(View v, boolean hasFocus, int posiotion);public void onItemClick(View v, int position);
}

接下来,自定义一个内部类,完成点击事件的处理,具体代码如下:

[java] view plain copy print?
  1. private class MyClick implements View.OnClickListener {
  2. int position;
  3. public MyClick(int position) {
  4. this.position = position;
  5. }
  6. @Override
  7. public void onClick(View v) {
  8. if (onItemCallBack != null) {
  9. onItemCallBack.onItemClick(v, position);
  10. }
  11. }
  12. }
  13. public void setOnItemCallBack(OnItemCallBack onItemCallBack) {
  14. this.onItemCallBack = onItemCallBack;
  15. }
 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;}

然后,在定义一个处理获取焦点的内部类,完成获取交单时的处理,具体代码如下:

[java] view plain copy print?
  1. private class MyFocusChange implements View.OnFocusChangeListener {
  2. int position;
  3. MyViewHolder holder;
  4. public MyFocusChange(int position, MyViewHolder holder) {
  5. this.position = position;
  6. this.holder = holder;
  7. }
  8. @Override
  9. public void onFocusChange(View v, boolean hasFocus) {
  10. if (hasFocus) {
  11. holder.rl_scale.animate().scaleX(1.15f).scaleY(1.15f).start();
  12. holder.rl_scale.setBackgroundResource(R.drawable.bg_pic_s);
  13. } else {
  14. holder.rl_scale.animate().scaleX(1f).scaleY(1f).start();
  15. holder.rl_scale.setBackgroundResource(R.drawable.bg_pic_n);
  16. }
  17. if (onItemCallBack != null) {
  18. onItemCallBack.onFocusChange(v, hasFocus, position);
  19. }
  20. }
  21. }
 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的整个代码:

[java] view plain copy print?
  1. package cn.chinaiptv.horiziengridviewdemo;
  2. import android.content.Context;
  3. import android.support.v7.widget.RecyclerView;
  4. import android.view.LayoutInflater;
  5. import android.view.View;
  6. import android.view.ViewGroup;
  7. import android.widget.ImageView;
  8. import android.widget.LinearLayout;
  9. import android.widget.RelativeLayout;
  10. import android.widget.TextView;
  11. import java.util.ArrayList;
  12. /**
  13. * Created by Administrator on 2016/12/9.
  14. */
  15. public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
  16. private Context context;
  17. private ArrayList<String> mdatas;
  18. private OnItemCallBack onItemCallBack;
  19. public MyAdapter(Context context, ArrayList<String> mdatas) {
  20. this.context = context;
  21. this.mdatas = mdatas;
  22. }
  23. @Override
  24. public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
  25. View inflate = LayoutInflater.from(context).inflate(
  26. R.layout.item, null);
  27. MyViewHolder holder = new MyViewHolder(inflate);
  28. return holder;
  29. }
  30. @Override
  31. public void onBindViewHolder(MyAdapter.MyViewHolder holder, int position) {
  32. holder.tv_text.setText(mdatas.get(position));
  33. holder.itemView.setOnClickListener(new MyClick(position));
  34. holder.itemView.setOnFocusChangeListener(new MyFocusChange(position,
  35. holder));
  36. }
  37. @Override
  38. public int getItemCount() {
  39. return mdatas.size();
  40. }
  41. class MyViewHolder extends RecyclerView.ViewHolder{
  42. public ImageView iv_pic;
  43. public TextView tv_text;
  44. public RelativeLayout rl_scale;
  45. public MyViewHolder(View itemView) {
  46. super(itemView);
  47. iv_pic=(ImageView) itemView.findViewById(R.id.iv_pic);
  48. tv_text=(TextView) itemView.findViewById(R.id.tv_text);
  49. rl_scale=(RelativeLayout) itemView.findViewById(R.id.rl_scale);
  50. }
  51. }
  52. private class MyFocusChange implements View.OnFocusChangeListener {
  53. int position;
  54. MyViewHolder holder;
  55. public MyFocusChange(int position, MyViewHolder holder) {
  56. this.position = position;
  57. this.holder = holder;
  58. }
  59. @Override
  60. public void onFocusChange(View v, boolean hasFocus) {
  61. if (hasFocus) {
  62. holder.rl_scale.animate().scaleX(1.15f).scaleY(1.15f).start();
  63. holder.rl_scale.setBackgroundResource(R.drawable.bg_pic_s);
  64. } else {
  65. holder.rl_scale.animate().scaleX(1f).scaleY(1f).start();
  66. holder.rl_scale.setBackgroundResource(R.drawable.bg_pic_n);
  67. }
  68. if (onItemCallBack != null) {
  69. onItemCallBack.onFocusChange(v, hasFocus, position);
  70. }
  71. }
  72. }
  73. private class MyClick implements View.OnClickListener {
  74. int position;
  75. public MyClick(int position) {
  76. this.position = position;
  77. }
  78. @Override
  79. public void onClick(View v) {
  80. if (onItemCallBack != null) {
  81. onItemCallBack.onItemClick(v, position);
  82. }
  83. }
  84. }
  85. public void setOnItemCallBack(OnItemCallBack onItemCallBack) {
  86. this.onItemCallBack = onItemCallBack;
  87. }
  88. }
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使用详解以及获取焦点高亮相关推荐

  1. leanback android,Android TV之谷歌android leanback框架详解

    google leanback 库简介 "Leanback" 就是靠着看的意思.是指以放松的姿势倒在沙发上.谷歌推出 android.support.v17.leanback 软件 ...

  2. Android TV之谷歌android leanback框架详解

    google leanback 库简介 "Leanback" 就是靠着看的意思.是指以放松的姿势倒在沙发上.谷歌推出 android.support.v17.leanback 软件 ...

  3. 《Android游戏开发详解》——第1章,第1.6节函数(在Java中称为“方法”更好)...

    本节书摘来自异步社区<Android游戏开发详解>一书中的第1章,第1.6节函数(在Java中称为"方法"更好),作者 [美]Jonathan S. Harbour,更 ...

  4. JMessage Android 端开发详解

    JMessage Android 端开发详解 目前越来越多的应用会需要集成即时通讯功能,这里就为大家详细讲一下如何通过集成 JMessage 来为你的 App 增加即时通讯功能. 首先,一个最基础的 ...

  5. 《Java和Android开发实战详解》——2.5节良好的Java程序代码编写风格

    本节书摘来自异步社区<Java和Android开发实战详解>一书中的第2章,第2.5节良好的Java程序代码编写风格,作者 陈会安,更多章节内容可以访问云栖社区"异步社区&quo ...

  6. Android事件流程详解

    Android事件流程详解 网络上有不少博客讲述了android的事件分发机制和处理流程机制,但是看过千遍,总还是觉得有些迷迷糊糊,因此特地抽出一天事件来亲测下,向像我一样的广大入门程序员详细讲述an ...

  7. Android Studio 插件开发详解二:工具类

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/78112856 本文出自[赵彦军的博客] 在插件开发过程中,我们按照开发一个正式的项 ...

  8. 《Android游戏开发详解》一2.16 区分类和对象

    本节书摘来异步社区<Android游戏开发详解>一书中的第2章,第2.16节,作者: [美]Jonathan S. Harbour 译者: 李强 责编: 陈冀康,更多章节内容可以访问云栖社 ...

  9. Android Framework系统服务详解

    Android Framework系统服务详解 操作环境 系统:Linux (Ubuntu 12.04) 平台:高通 Android版本:5.1 PS: 符号...为省略N条代码 一.大致原理分析 A ...

最新文章

  1. RegionServer宕机的原因
  2. uva11029 - Leading and Trailing
  3. Maven的学习资料收集--(九) 构建SSH项目以及专栏maven
  4. delphi7 如何判定dbgrid两行重复_教你如何在服装上加入好看的毛线刺绣花边
  5. git revert和reset区别
  6. win7 无法修改 host 文件解决方案
  7. jieba的一些使用
  8. java 锁优化_Java中锁优化
  9. Multisim入门
  10. mysql启动报sock_mysql启动错误:mysql.sock丢失
  11. 常见的总线通信方式及其特点
  12. 使用laravel快速开发网站流程(composer)
  13. 华为路由器PPP与MP-PPP的配置实例
  14. XjhDemo 插入数据
  15. Halcon学习笔记:3D_coordinates(3D标定)
  16. MySQL奇偶数判断
  17. 草履虫纳米机器人_纳米机器人的研究进展如何?
  18. csp认证201903-1--小中大(c++)
  19. 单片机 STM32 HAL PCF8574 例子代码
  20. Kali Linux 使用远程桌面连接——xrdpxfce

热门文章

  1. C# 删除文件和删除文件夹
  2. 性能优化 - likely和unlikely函数
  3. tf.Variable()函数
  4. 几何体的体积和表面积
  5. vue实现浏览器记住密码功能,并进行加密存储
  6. openstack核心组件-nova-计算服务
  7. ns2安装教程(ns2.35 Ubuntu16.04)
  8. NS2仿真:使用NS仿真软件模拟简单网络模型
  9. springboot+mysql情侣空间系统APP-计算机毕业设计源码39734
  10. testdisk windows mac linux,TestDisk for Mac-TestDisk Mac版下载 V7.2|TestDisk Mac版 - 燃文下载站...