Android TV开发经验总结---控件Gridview使用

GridView控件的使用(一) GridView它是一个强大的数据绑定控件,能够灵活地显示和编辑数据源中的数据。 阅读详情

    前一篇我们已经讲解的基本Android TV 开发的基础技能Android TV开发经验总结---初识TV开发,接下来聊聊TV开发中所涉及到的控件运用

    目前Android TV 开发的资料不是蛮多,经过一系列的搜索,目前比较适用的框架推荐 

     冰雪情缘TV / Android-TV-Frame    项目地址:https://git.oschina.net/hailongqiu/AndroidTVWidget

     在我们TV开发中用到最多的可能就是网格和列表了,今天我们先讲讲GridView,有人就会想现在不都是在用recyclerview吗? 但是我告诉你,在TV开发中目前如果不使用google自己的LeackbackTV框架的话目前的原生recyclerview在开发中你会发现,上下左右快速滑动的时候焦点不能预期的达到效果,当然后面我会讲解recyclerview在开发过程中的使用

     系统中的原生GridView在开发过程中会出现哪些问题呢,我们又可以怎么解决?

     首先为了让GridView能够上下左右焦点位置不乱跑,我使用的是Androd-tv-frame中的GridViewTV控件,具体代码请看上面连接中的源码

     然后在使用GridView过程中一般需要用到的监听事件

     gridView.setOnItemSelectedListener     选中事件

<pre name="code" class="java">    //选中事件
    gridView.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener(){
        @Override
        public void onItemSelected (AdapterView < ? > parent, View view,int position, long id){
                curposition = position;
         }
        @Override public void onNothingSelected (AdapterView < ? > parent){
        }
    });
    
    //点击事件 
    gridView.setOnItemClickListener(new AdapterView.OnItemClickListener(){
        @Override public void onItemClick (AdapterView < ? > parent, View view,int position, long id){
        }
    });
    
    //是否获取焦点事件
    gridView.setOnFocusChangeListener(new View.OnFocusChangeListener(){
        @Override public void onFocusChange (View view,boolean b){
        }
    });


 

 
 

        此处需要特别说明的是    gridView.setFocusable(true);   改变控件是否可以获得焦点,然而同时会触发 setOnFocusChangeListener事件 

        在GridView开发过程中还有很坑爹的问题,GridView在初始化或者重新setAdapter后在4.3版本以上会抢焦点默认选中第一个Item ,不光是GridView listview也是如此的情况,所以要避免这种情况的话需要给gridView.setFocusable(false)使得gridview不能抢焦

       其实在开发中如果在4.3版本一下你需要默认第一个Item也是有方法的,可以看看

GridView第一次选中不调用onItemSelected()的解决办法    利用反射促使第一次也调用

      接着说说我们在GridView开发中需要判断是否焦点在Item边缘地带了可以使用如下方法做判断,仅供参考需要自己完善自己逻辑
      
/**
     * 判断当前选中的位置在屏幕中的相对位置
     *
     * @param
     * @return
     */
    public static final int LEFT = 0;
    public static final int RIGHT = 1;
    public static final int BOTTOM = 2;
    public static final int TOP = 3;
    public int getGridSelectionState() {
        int selection = gridView.getSelectedItemPosition();
        int total = mLiveData.size();
        if (total <= 0) {
            return -1;
        }

        if(selection<gridView.getNumColumns()){
            return TOP;
        }

        if (selection + gridView.getNumColumns() >= total) {
            return BOTTOM;
        }
        if (selection % gridView.getNumColumns() == 0) {
            return LEFT;
        } else if (selection % gridView.getNumColumns() == gridView.getNumColumns()-1) {
            return RIGHT;
        } else {
            return -1;
        }
    }
       如果这时候你还需要通过方向来确定的话可以使用如下代码
private int direction = -1;
	@Override
	public boolean dispatchKeyEvent(KeyEvent event) {
		switch (event.getKeyCode()) {
			case KeyEvent.KEYCODE_DPAD_LEFT:
				direction = 1;
				break;
			case KeyEvent.KEYCODE_DPAD_RIGHT:
				direction = 2;
				break;
			case KeyEvent.KEYCODE_DPAD_UP:
				direction = 3;
				break;
			case KeyEvent.KEYCODE_DPAD_DOWN:
				direction = 4;
				break;
			default:
				direction = -1;
				break;
		}
		return super.dispatchKeyEvent(event);
	}

     有的时候我们需要分页加载数据怎么办,我的思路是判断当前选中的Item的位置是否在最底下,如果是就进行网络请求,在页面的OnkeyDown事件中监听,其实将逻辑封装在自定义Gridview中然后暴露回调接口出来
    
@Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        switch (keyCode) {
            case KeyEvent.KEYCODE_DPAD_DOWN:
                if (isGridFoucse) {  //<isGridFoucse标示Gridview是否获取了焦点
                    if (getGridSelectionState() == BOTTOM && isHaveMore) {  //翻页
                        //TODO:加载数据
                        return true;
                    }

                }
                break;
        }
        return false;


    }

 接着可能就是选中放大的效果了,之前我一直使用的还是上面框架中的放大效果,移动放大框效果很给力,只是在过程中你特别需要注意设置两个属性

android:clipToPadding="false"    android:clipChildren="false"    具体有什么用处你可以问问度娘,会解释的很清楚。

但是由于后期配合项目整体UI的要求,框架不适合,那么又如何有放大选中的效果呢,我的思路是设置Item放大后的背景,先隐藏当选中的时候对View进行放大正好是背景的大小,这就需要我们自己计算Item的宽高了,给个我实现的案例

先看看xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="@dimen/px449"
    android:layout_height="@dimen/px323"
    android:orientation="vertical">

    <LinearLayout
        android:id="@+id/root_layout"
        android:layout_width="@dimen/px400"
        android:layout_height="@dimen/px286"
        android:layout_centerInParent="true"
        android:background="@drawable/shape_rect_grid_item_bg"
        android:orientation="vertical"
        android:padding="@dimen/px4">

     

    </LinearLayout>

    <View
        android:id="@+id/grid_border"
        android:layout_width="@dimen/px449"
        android:layout_height="@dimen/px322"
        android:layout_centerInParent="true"
        android:background="@drawable/border_bg"
        android:focusable="false"
        android:visibility="invisible"/>
</RelativeLayout>

然后就是在选中中放大效果

gridView.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view,
                                       int position, long id) {
                if (isGridFoucse && view != null) {
                    if (mOldView != null) {
                        LiveGridAdapter.ViewHolder oldholder = (LiveGridAdapter.ViewHolder) mOldView.getTag();
                        setGridBg(oldholder,false);
                    }
                    if (view != null) {
                        LiveGridAdapter.ViewHolder holder = (LiveGridAdapter.ViewHolder) view.getTag();
                        view.bringToFront();
                        setGridBg(holder, true);
                    }
                    mOldView = view;
                    curposition = position;
                }
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {
            }
        });
		
		
		private void setGridBg(final LiveGridAdapter.ViewHolder oldholder,boolean toBig){
        if(toBig){
            oldholder.root_layout.animate().scaleX(1.09f).scaleY(1.09f).setDuration(DEFAULT_TRAN_DUR_ANIM)
                    .setListener(new Animator.AnimatorListener() {
                        @Override
                        public void onAnimationStart(Animator animation) {
                            if (oldholder.grid_border != null) {
                                oldholder.grid_border.setVisibility(View.VISIBLE);
                            }
                        }
                        @Override
                        public void onAnimationEnd(Animator animation) {

                        }
                        @Override
                        public void onAnimationCancel(Animator animation) {
                        }
                        @Override
                        public void onAnimationRepeat(Animator animation) {
                        }
                    });
        }else{
            oldholder.root_layout.animate().scaleX(1.0f).scaleY(1.0f).setDuration(DEFAULT_TRAN_DUR_ANIM)
                    .setListener(new Animator.AnimatorListener() {
                        @Override
                        public void onAnimationStart(Animator animation) {
                            if (oldholder.grid_border != null) {
                                oldholder.grid_border.setVisibility(View.INVISIBLE);
                            }
                        }

                        @Override
                        public void onAnimationEnd(Animator animation) {
                        }

                        @Override
                        public void onAnimationCancel(Animator animation) {
                        }

                        @Override
                        public void onAnimationRepeat(Animator animation) {
                        }
                    });
        }
    }

其实网上还有很多自定义Gridview 的放大效果,大家可以去搜索下看看



     

安卓TV开发(六) 移动智能终端UI之实现类似GridView的焦点控制FocusView框架 到这里,所有关于智能设备的UI绘制技巧以及全部讲完了,回顾五篇文章,如果成为一个自己定义布局或者控件高手,我们不仅要掌握安卓view的生命周期,事件的机制,动画的类型,还要有java Swiing绘图功底,而且还要有一定的设计思想功底,这样自己写出的view才能让别人加以利用和扩展,总之学习是循环渐进,不断提高的。虽然本次Foucus能满足大部分非触摸屏设备上的UI需求,但是万变不离其宗,更多好的功能还需要朋友们自己挖掘和扩展。 阅读详情

相关推荐

Android TV (三)(创建电视页面布局)

官方地址 镜像地址创建电视页面布局用户通常在距离电视屏幕10英尺的位置观看,并且它远远大于大多数Android设备的显示屏,但是这种类型的屏幕不能提供与小屏幕相同级别的细节和颜色。这些因素要求你为电视设备创建应用布局时,能创造一个有效的和愉快的用户体验。使用布局主题Android主题能为你的应用提供基础的布局。您应该使用一个主题来修改您的应用程序的activity的显示,这意味着这些activity

fengfancky的博客 3477

Android【GridView使用】

安卓GridView使用实例 GridView与ListView的用法基本一致,不同的只是布局。当我们打开手机,应用会以宫格显示,那就是GridView。 以代码形式展示,本次适配器使用BaseAdapter,熟悉了适配器的用法,就只需要注意几个GridView的属性即可。 1、GridView首先必须了解的地方???? GridView组件用来以网格方式排列视图,与矩阵类似,当屏幕上有很多元素(文字、图片或其他元素)需要显示时,可以使用该组件 GridView是一个在二维可滚动的网格中展示内容

w_Eternal的博客 1万+

Android GridView使用(详细版)

在学习GridView 之前,我们需要先了解GridView的继承关系,GridView跟ListView很类似,Listview主要以列表形式显示数据,GridView则是以网格形式显示数据,掌握ListView使用方法后,会很轻松的掌握GridView的使用方法。

轻描时光 2153

【Android从零单排系列二十二】《Android视图控件——GridView》

小伙伴们,在上文中我们介绍了Android视图组件ExpandableListView,本文我们继续盘点,介绍一下视图控件的GridView。GridView是一个在Android中常用的布局控件,它可以以网格形式展示数据,类似于表格或者矩阵。GridView可以按照指定的行数和列数将数据显示在多个单元格中,使得数据呈现出规律的排列方式。GridView通过Adapter来提供数据,并且可以自定义每个单元格的布局。用户可以自定义Adapter来适配各种数据源,并为每个单元格设置不同的视图样式和内容。

商务合作|问题讨论|交流学习 请联系作者微信,加微信请务必注明来意,博客主页有联系方式 4043

Android TV,机顶盒Gridview 焦点

切换两个控件之间的焦点,TV、机顶盒用android自带的控件 例如listview或者gridview 是,因为需要适配手机等,所以控件某些方面(如每个控件的焦点,切换时的速度,位置等)是不会很匹配TV、机顶盒的.最好的方法是自己绘制一个gridview <GridView android:id="@+id/lv_main" android:layout_width="wrap_content" android:layout_height="wrap_

码点 748

Android TV GridView的Item焦点处理以及滚动条不能滚动的解决方案

前言 在Android Tv开发中,会涉及到对GridView控件的焦点处理,来支持遥控器的上下左右的操作,但是也会遇到一些坑,比如说Item获取到焦点后,滚动条不能滚动,下面就解决方案做个笔记仅供参考 1.Item获取焦点 <GridView android:id="@+id/gridview_file" android:layout_width="match_parent" android:layout

安卓兼职framework和app工程师的博客 911

android tv gridview,Android TV开发经验总结---控件Gridview使用

前Android TV 开发的资料不是蛮多,经过一系列的搜索,目前比较适用的框架推荐冰雪情缘TV/Android-TV-Frame 项目地址:https://git.oschina.net/hailongqiu/AndroidTVWidget在我们TV开发中用到最多的可能就是网格和列表了,今天我们先讲讲GridView,有人就会想现在不都是在用recyclerview吗? 但是我告诉你,...

weixin_42505032的博客 2万+

Android控件之GridView用法实例分析

本文实例讲述了Android控件之GridView用法。分享给大家供大家参考。具体如下: GridView是一项显示二维的viewgroup,可滚动的网格。一般用来显示多张图片。 以下模拟九宫图的实现,当鼠标点击图片时会进行相应的跳转链接。 目录结构如下: main.xml布局文件,存放GridView控件 <?xml version=1.0 encoding=utf-8?> <!-- android:numColumns=auto_fit ,GridView的列数设置为自动 android:columnWidth=90dp,每列的宽度,也就是Item的宽度 android

安卓gridview控件的使用

但是由于后期配合项目整体UI的要求,框架不适合,那么又如何有放大选中的效果呢,我的思路是设置Item放大后的背景,先隐藏当选中的时候对View进行放大正好是背景的大小,这就需要我们自己计算Item的宽高了,给个我实现的案例。有的时候我们需要分页加载数据怎么办,我的思路是判断当前选中的Item的位置是否在最底下,如果是就进行网络请求,在页面的OnkeyDown事件中监听,其实将逻辑封装在自定义Gridview中然后暴露回调接口出来。

m0_72495985的博客 1246

实战演练,如何用Easyexcel合并单元格,设置字体、边框样式,并在尾行加入备注

,实现效果如下:1、多级表头合并2、表头底纹+表格边框3、合并相同数据单元格4、尾行加入备注。

Su7148的博客 1万+

机器学习模型——非线性回归

升维是一种常用的处理非线性问题的方法,它通过将原始数据从低维空间映射到高维空间来增强模型的表达能力。我们可以看出,二维数据用一维直线很难去很好的拟合。升维里的degree设置的不易过大,否则容易造成维度灾难。升维后,拟合的线与原数据比较符合。将非线性问题转换为线性问题。

qq_60688380的博客 1421

Android TV Widget: 打造极致电视应用体验

Android TV Widget,一个专为Android电视、盒子及投影设备设计的开源控件库,采用Java语言编写。此项目由FrozenFreeFall发起,致力于简化电视应用的开发流程,提升用户体验。通过集合一系列定制化UI组件和实用工具,它成为了开发者在Android TV平台上的得力助手。 ## 核心功能 - **自定义适配器与视图**: 提供专门针对电视界面的标题栏adapter基础类

gitblog_01255的博客 644

Typora绘制思维导图

我们观察一下,其实思维导图就是树状结构的数据嘛,作为程序员,拿语言写树状结构的数据是很平常的事情。而且写代码可比画图省事多了,查阅资料可以知道,有一种`mermaid`语法,就是做这件事情的,支持 UML,甘特图,流程图等。

Peter Cheung的博客 7933

android tv gridview,Android TV,机顶盒Gridview 焦点

切换两个控件之间的焦点,TV、机顶盒用android自带的控件 例如listview或者gridview 是,因为需要适配手机等,所以控件某些方面(如每个控件的焦点,切换时的速度,位置等)是不会很匹配TV、机顶盒的.最好的方法是自己绘制一个gridview正常的GridView,然而item的控件就需要自定义了:MyImageViewimport android.annotation.Suppre...

weixin_42451850的博客 373

Kisssoft软件在行星齿轮设计上的初试

行星齿轮传动与链传动相比较,具有质量小,体积小,承载能力强,传动比大,传动效率高等优点,但在行星齿轮传动种种优点下,不可避免的带来一些缺点,对其材料的要求过高,在追求传动比大而体积小的同时,其传动结构大大的复杂化,以及在制造和安装过程中较困难,对于行星齿轮传动设计来说,不仅应该了解其优点,而且应该在设计中,充分发挥其优点,且把其缺点降低到最低的限度。从而才能设计出性能优良的行星齿轮传动装置,为我们赛车提供更加强大的动力保证。 Kisssoft软件为我们行星齿轮传动设计提供了一体化方案,从设...

m0_69808569的博客 1万+

Linux平台CCS安装配置完整示例

手把手讲解在Linux系统中完成CCS安装与环境配置的全过程,涵盖关键步骤与常见问题解决,是查找ccs安装教程时不可多得的实战指南。

weixin_42601134的博客 514

android tv 控件大全,AndroidTvWidget-AndroidTV/盒子/投影仪控件

使用说明:https://git.oschina.net/hailongqiu/AndroidTVWidget/wikis/AndroidTVWidget-use-manual键盘使用说明:https://git.oschina.net/hailongqiu/AndroidTVWidget/wikis/Android-TV-%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%...

weixin_30160357的博客 501

基于CatBoost回归模型的完整预测分析:从建模到SHAP可解释性分析

本文介绍了使用CatBoost回归模型进行完整预测分析的流程。首先导入必要的Python库并加载数据,进行数据预处理包括训练测试集划分和归一化处理。然后通过网格搜索优化CatBoost超参数,使用最优参数训练模型并评估预测性能。结果显示模型具有较高的决定系数(R²=0.9944)和较低的误差指标(RMSE=0.0696)。接着进行残差分析和正态性检验,发现残差基本服从正态分布。最后通过SHAP分析实现模型可解释性,识别关键特征影响。该方法为梯度提升树在回归问题中的应用提供了完整解决方案。

fx666_的博客 746

安卓TV开发遇到的那些坑

最近公司需要开发一个TV的luancher,就是那种纯物理按键的遥控,没有触摸屏,现在说说我踩得那些坑。(其实布局和代码逻辑和正常的安卓应用差不多) 1.焦点 焦点 焦点,重要的事情说三遍,安卓TV由于没有触摸屏所以需要手动设置可以获取焦点的控件。 2.设置获取到状态也就是常用的select。 3.各种事件冲突。 4.按键事件 通过重写onKeyDown(),onKeyUp()方法中监听keyCode的值,来判断用户按下的是哪个键,比如OK键 其他特殊的键值,上下左右键的话,系统会自动处.

帅气的红烧肉的博客 2539

深度解析NXP AMCLIB状态观测器:PMSM无感FOC控制实战指南

状态观测器是现代电机控制中的核心算法,它基于电机数学模型,通过测量定子电压和电流,实时估算出转子的位置和速度,从而替代了传统的物理传感器。其原理遵循“预测-校正”的闭环结构,通过比较模型预测值与实际采样值的误差,不断修正内部状态估计。这项技术的核心价值在于实现了无传感器控制,显著降低了系统成本、提升了可靠性与紧凑性,广泛应用于伺服驱动、变频器、电动汽车和家电等领域。本文聚焦于NXP AMCLIB库中的角度跟踪观测器和反电动势观测器,深入剖析其设计思路、固定点运算实现以及参数整定方法,为工程师在永磁同步电机无

cumi7754的博客 2830

uniapp - 实现APP后台持续定位+手机息屏后能持续上传位置信息数据,详解后台保活持续运行+手机锁屏保证后台持续/实时定位的解决方案及示例源码(完美兼容安卓android与苹果ios系统手机)

使用uniapp开发app实现后台保活定位能力,uniapp实时定位保活 息屏定位后台运行,uniapp APP实时定位高德 后台运行 支持锁屏息屏运行,持续获取定位信息,uniapp App端后台间隔时间发送定位功能实现,UniApp实现手机应用常活,固定时间内上传手机位置信息,后台(或锁屏)持续/实时定位的实现方案,uni-app后台持续定位,锁屏后能持续上传位置信息,实现后台定位持续无限制定位高德定位,百度定位,UniApp后台持续定位保如何在APP退到后台时保持定位服务,uniapp 切换app仍能

🏆 前端领域优质创作者 1万+

Android-tv-widget 项目推荐

**Android-tv-widget** 是一个专为 Android TV、盒子及投影仪设计的开源控件库。该项目的主要编程语言是 Java,它提供了一系列用于构建 TV 应用的 UI 控件和框架。 ## 项目核心功能 1. **Leanback 框架**:类似于谷歌的 Leanback 框架,但更加简洁和方便,适合快速开发 TV 应用。 2. **键盘框架**:提供了一套完整的键盘控件,方便

gitblog_00313的博客 474

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

android tv 开发的列表条目在获得焦点时的背景效果

项目要做一个列表,给出的条目获得焦点时的图片是这样的,看这个图片,边框发光的效果范围超大,如果按正常的做法,要使条目中文字显示正常,就要把每个item的高度设为很高,这样显然不适合要求,让设计师将焦点图片的发光范围改小,效果也可能达不好之前设计的效果,这个设计师怎么就非要设置这们的效果呢 ?结果研究半天只能有下面这勉强可行方法 1 , 之前是要ListView实现的,现在改用GridVi

casun_li的专栏 795

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

安卓TV中Gridview或listview获取不到焦点

子item处理无法点击或者无法获取焦点。

aijiameng的博客 1025

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

AN GridView 横向分页,适合TV等有按键需求的android系统

关键分析:根据屏幕比例算出每一页放多少个Item

muxi@Achilles的专栏 1839
上一篇: Android TV开发经验总结---初识TV开发
下一篇: Android如何实现APP自动更新
Derbe
博客等级 码龄15年 27粉丝 6原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值