股票场内基金交易,没时间盯盘?

   
使用优财助手电脑客户端记录下您的股票买入卖出数据,能帮您时刻盯盘,会根据您记录的未售出买入价计算上涨或下跌幅度,及时弹框通知您。想知道如何使用?快点击左方视频观看了解吧~~下载地址:http://youcaizhushou.com

前言

这是demo 链接

Android 中 View 的事件传递是一个老生常谈的问题,但也是学习 Android 的重点和难点。本人将分三篇来分享 Android 中的事件传递。

  • 通过 demo 分析 Android 事件的传递过程
  • 通过源码分析 Android 事件的传递过程
  • 运用所学解决 Android 中滑动冲突

MotionEvent

Android 中事件的传递其实传递的就是 MotionEvent 对象。MotionEvent 中封装了事件的各种状态和属性。最常用的最典型的有如下几种:

  • ACTION_DOWN ———————手指刚接触屏幕
  • ACTION_MOVE ———————手指在屏幕上移动
  • ACTION_UP ———————手指从屏幕上松开的一瞬间

Android 事件传递相关方法

  • public boolean dispatchTouchEvent(MotionEvent ev) 负责事件的分发
  • public boolean onInterceptTouchEvent(MotionEvent ev) 负责事件拦截
  • public boolean onTouchEvent(MotionEvent event) 负责事件的处理

在 ViewGroup 中有上述三个方法,但是在 View 中没有 onInterceptTouchEvent 方法。因为 View 没有子 View,所以就不牵扯到事件的拦截。

编写 demo

自定义相关 View

由于 LinearLayout 继承 ViewGroup,我们只需新建类 CustomLinearLayout 继承 LinearLayout。重写上述三个方法,如下

同样的新建类 CustomTextView 继承 TextView,重写 dispatchTouchEvent 和 onTouchEvent。同样重写 MainActivity 中的 dispatchTouchEvent 和 onTouchEvent。

布局文件

查看运行结果

事件分发 Log

事件分发Log

由图事件分发 Log 可以看出 ACTION_DOWN 传递的顺序示意图,如下图:

Android 事件分发示意图

Android 事件分发示意图(1)

在这之间我们并没有消费事件,由此可以看到事件从最外层逐级向内层传递,如果在这之间事件没有被消费掉,事件将由内层控件逐级向外层控件传递。

以 ACTION_DOWN 为例,详细分析 Android 事件传递的流程。 首先,MainActivity 捕获到 ACTION_DOWN 事件,并由 MainActivity 的 dispatchTouchEvent 方法分发给其子控件。因为 CustomLinearLayout 是 MainActivity 的子控件(我们暂且这么认为),所以 ACTION_DOWN 被分发给 CustomLinearLayout 并由 CustomLinearLayout 的 dispatchTouchEvent 继续分发。由于 CustomLinearLayout 是 ViewGroup 能够对事件进行拦截,所以 ACTION_DOWN 被分发给 CustomLinearLayout 的 onInterceptTouchEvent 方法。如果 onInterceptTouchEvent 返回 true 则拦截,否则不拦截。这里 CustomLinearLayout 的 onInterceptTouchEvent 返回 false,不对 ACTION_DOWN 拦截。所以 ACTION_DOWN 继续被分发给 CustomLinearLayout 的子控件 CustomTextView ,并由 CustomTextView 的 dispatchTouchEvent 进行分发。因为 CustomTextView 是 View 并且是最内层的 View ,所以 ACTION_DOWN 被分发给 CustomTextView 的 onTouchEvent 方法进行处理。本 demo 中 ACTION_DOWN 没有被 CustomTextView 的 onTouchEvent 处理掉,所以 ACTION_DOWN 向上传递给 CustomLinearLayout 的 onTouchEvent 。而 CustomLinearLayout 的 onTouchEvent 也没有处理 ACTION_DOWN,所以 ACTION_DOWN 继续向上传递给 MainActivity 的 onTouchEvent 。而 MainActivity 的 onTouchEvent 也没有处理,至此 ACTION_DOWN 将被释放,ACTION_DOWN 事件分发结束。

由图 事件分发 Log 我们还可以看出,ACTION_MOVE 和 ACTON_UP 并没有向内层控件传递,而是由 MainActivity 自己分发和处理。这说明 ACTION_MOVE 和 ACTON_UP 只传递到消费 ACTION_DOWN 的控件。为了验证这个我们将 CustomLinearLayout.onTouchEvent 的返回值改为 true 表示事件被 CustomLinearLayout 处理。

事件拦截Log

事件拦截Log

由 事件拦截Log可以看出 ACTION_MOVE 和 ACIONT_UP 只传递到了 CustomLinearLayout 这说明我们的上述观点是正确的。

由上面的代码可以看到和 onTouchEvent 方法一样,dispatchTouchEvent 和 onInterceptTouchEvent 方法也有一个 boolean 类型的返回值,这个返回值分别代表什么意思呢?

  • onInterceptTouchEvent 返回值为 true 时;表示事件被拦截,不在向内层控件传递。反之则向内层控件传递。
  • dispatchTouchEvent 返回 true 表示事件被 dispatchTouchEvent 自身处理消耗掉。至此,事件已经完结;返回 false 不再继续进行分发,并交由上层控件的onTouchEvent 方法进行处理;返回 super.dispatchTouchEvent(ev) 时,事件将继续传递。

最后两条结论的 log 将不再贴出,请读者自己验证。

最后给出本 demo 中事件分发的详细流程图,如下图:

Android 事件分发流程图

Android 事件分发流程图

   

想获得去掉 5 元限制的证券账户吗?

证券交易股票基金的佣金,不足 5 元会按照 5 元收取。比如交易 1000 元的股票,按照普遍的证券佣金手续费率万 2.5,其交易佣金为 0.25 元,小于 5 元,实际会收取佣金 5 元,买卖两次需要支付 10 元佣金成本,1% 的利润就这样没了。

如果您想去掉最低交易佣金 5 元限制,使用微信扫描左边小程序二维码,访问微信小程序「优财助手」,点击底部菜单「福利」,阅读文章「通过优财开证券账户无最低交易佣金 5 元限制」,按照文章步骤操作即可获得免 5 元证券账户,股票基金交易手续费率万 2.5。

请注意,一定要按照文章描述严格操作,如错误开户是无法获得免 5 元证券账户的。

发表评论

电子邮件地址不会被公开。 必填项已用*标注