安卓Tv开发(一)移动智能电视之焦点控制(触控事件)

      前言:移动智能设备的发展,推动了安卓另一个领域,包括智能电视和智能家居,以及可穿戴设备的大量使用,但是这些设备上的开发并不是和传统手机开发一样,特别是焦点控制和用户操作体验风格上有很大的区别,本系列博文主要用TV播放器的实现去了解下在智能设备上的开发一个APP的流程,实现遥控器控制焦点移动,方向键模拟鼠标,并完成在线视频直播,手机当遥控器使用等相关功能。点击查看原文 ,转载请说明出处 :http://blog.csdn.net/sk719887916


     说到安卓TV上的APP应用,最主要还是看焦点控制,其他和手机APP无多大区别。比如常见的TV版本视频播放器,TV浏览器,以及电视游戏,都采用九宫格的UI视觉 demoUI如下


  

实现这个ui很容易,但是要实现遥控器上下左右控制并实现动画放大效果,到边缘进行翻页效果,很多同学就不知道怎么做了 ,看到很多人在手机上实现的手机UI很炫,但是貌似

没有一篇讲解TV或者电视盒子上应用开发的列子的,包括点击翻页,或者移动,在这个TV开发入门的文章中,本人以微小的技术给大家先说下安卓事件焦点机制,之后的几篇文章中,

本人将结合自己经验,详细说明安卓TV项目开发,安卓在线电视demo,实现一个TV上的视频应用,前提是要学会自定义view,,也要学会android事件机制,,必须先了解触控事件,

MotionEvent是必要,接下来本蝙给大家说下MotionEvent具体原理,,下篇将会说道键盘点击事件KeyEvent。

安卓主要点击事件


android下,事件的发生是在监听器下进行,android系统可以响应按键事件和触摸屏事件,事件说明如下:

onClick(View v) 一个普通的点击按钮事件

onlongClick(View v) 一个普通的点击长按按钮事件

boolean onKeyMultiple(int keyCode,int repeatCount,KeyEvent event)多个事件连续时发生,用于按键重复,必须重载@Override实现

boolean onKeyDown(int keyCode,KeyEvent event) 用于在按键进行按下时发生

boolean onKeyUp(int keyCode,KeyEvent event 用于在按键进行释放时发生

boolean onKeyLongPress(int keyCode, KeyEvent event)当你长时间按时发生

onTouchEvent(MotionEvent event) 触摸屏事件,当触摸屏幕时发生(暂时简单的这么理解,后做详细说明)

boolean dispatchTouchEvent(MotionEvent event)  触控时负责事件传递必须重载@Override实现 (View和Activity都可以进行分发)

     当然也有传递KeyEvent的方法 

boolean onInterceptTouchEvent(MotionEvent event)  触控时负责事件拦截ViewGroup负责事件拦截。


Event事件机制


 在引出下文之前 我们先大致了解下Android事件机制,安卓事件机制主要包含事件的 拦截,传递(分发),响应(消费)。在翻阅了很多文章后,再结合谷歌官方文章总结出,安卓每个事件都会进行以上三种过程。那么接下来我们先开始理解下事件的整个过程


 (1)Event事件的拦截


   onInterceptTouchEvent(),安卓中此事件负责拦截一个用户产生的点击或者触摸事件,主要起终止传递作用,当用户点触摸产生一个事件时,由上层(view,Activity)传入事件时,此方法负责拦截,拦截后将交由本控件去消费当前事件,如果无需拦截,则继续交由下层的view去自己传递和分发。具体如下:
     如果返回true,则代表拦截此事件,那么事件就不会往子控件进行传递,由当前view进行调用  onTouchEvent()来响该事件。反之 返回false 不拦截,事件将继续传递  则由子view去调用自己的 dispatchTouchEvent()  去分发, 最后由具体的控件去消费此事件。

 注意:很多书中和博客中忽视了一点,当然 onInterceptHoverEvent() 也拥有拦截权利,但是它和OnInterCeptTouchEvent()有细微区别,此方法主要处理滑动事件,通俗讲就是当产生有位移的事件时(列如当我们的触摸事件由产生速率的时候)触发此方法。

 (2)Event事件的传递


dispatchEvent(MotionEvent event)  负责事件的调度,很多人称之为分发和传递也一个意思,主要负责将事件交由哪个控件去处理,如果自己不想处理,则可以继续往下传递,想处理则触发本身view的ontuchEvent()
  
   此方法也返回bool类型,返回ture代表传递,返回false代表不传递,和我们的事件拦截恰恰相反,对于初学者来说很容易搞糊涂,本事件Activty,ViewGroup,View都拥有处理权,主要将事件负责转发,无论交由别人处理还是自己,其实都在充当调度角色,是事件的核心。
  

 (3)Event事件响应

      安卓中事件具体处理由   onTouchEvent()  来执行,此阶段主要负责事件的消费响应,通过处理完事件后,然后逐步向上级汇报,如果消费了上次则不会再进行做响应消费处理,只会继续返回给根布局。

  此方法返回布尔类型,如果消费了此事件,则会调用上级的此方法,默认返回false做处理,如果返回true,则代表不消费此时间 ,让上级调用本方法去做处理,逐步网上汇报,直到Activity得到消息为止。

 (4 (4 )Event传递整个过程

          通过上面三个各自的方法,我们已经了解了各个环节中自己充当的角色,那么整个事件怎么传递的呢,为了让大家更加方便的理解,我也很蛋疼的画了一蛋疼图,虽然本人不怎么喜欢画图。



  

     如上图,A:代表当前Activty。B.:ViewGrup.    C :View.   对于View还不够清楚的请移步  《AndroidUI之View的加载机制》自行阅读
为了方便理解,我们把view理解为具体一个控件,列如C代表Button,B代表布局。当我们点击屏幕上的C时整个事件将会由A—B --C —B—A,事件分发我们可以理解为 钻井模式,消费回调为 冒泡模式

        当点击C (Button)时,首先有A进行分发,然后传递到B,如果B不拦截,则继续分发,传递到C ,此时C无法继续传递 ,则执行事件,消费后继续向上反馈,上级则不会进行消费处理,如果不消费,则由上级B(Layout)进行处理,如果不处理,则继续交由A(Activity)处理,此时此事件结束。

   

      以上便是一个完整的事件周期,我们可在不同环节根据当前需要I进行处理,已到达响应的需求.  只要我们理解了时间的整个过程,那么焦点事件我们可以随心所欲的去处理。

MotionEvent事件


    一般我们是在View或者activty的重写onTouchEvent()方法中处理MotionEvent对象的.

   

    public boolean onTouchEvent(MotionEvent event) 


 (1)MotionEvent事件的类型

     

 主要的事件类型有:

 ACTION_DOWN: 表示用户开始触摸.

 ACTION_MOVE: 表示用户在移动(手指或者其他)

 ACTION_UP:表示用户抬起了手指 

ACTION_CANCEL:表示手势被取消了,一些关于这个事件类型的讨论见:http://stackoverflow.com/questions/11960861/what-causes-a-motionevent-action-cancel-in-android

还有一个不常见的:

ACTION_OUTSIDE: 表示用户触碰超出了正常的UI边界.

但是对于多点触控的支持,Android加入了以下一些事件类型.来处理,如另外有手指按下了,

有的手指抬起来了.等等:

ACTION_POINTER_DOWN:有一个非主要的手指按下了.

ACTION_POINTER_UP:一个非主要的手指抬起来了


可以通过getAction()可以获取类型,在android2.2之后加入多点触控支持之后使用getActionMasked()方法.

 (2)事件发生的位置,x,y轴

  • 12
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 19
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值