View事件的分发机制(二)

尊重人家的成果:https://blog.51cto.com/14009815/2342686

在上一篇文章中,浅谈Android 事件分发机制(一),简要分析了一下事件分发机制的原理,总结一下就是事件层层传递,直到被消费,原理看似简单,但是在实际使用过程中,场景各不相同,复杂程度也就因产品而异,这篇文章就通过给view加移动来模拟事件分发。

触摸事件
这里涉及到几个与手指触摸相关的常见事件:
在这里插入图片描述坐标系对于单指触控移动来说,一次简单的交互流程是这样的:
手指落下(ACTION_DOWN) -> 移动(ACTION_MOVE) -> 离开(ACTION_UP)

坐标系
Android坐标系以手机屏幕左上角的顶点为坐标原点,从该点向右为x轴正方向,从该点向下为y轴正方向。 上图所示,一次触摸涉及到多种距离的计算, 上图所标注的方法可以分为两类,一类是View提供的方法,一类是MotionEvent提供的方法。

View提供的:
getTop():获取到view自身的顶边到其父布局顶边的距离
getLeft():获取到view自身的左边到其父布局左边的距离
getRight():获取到view自身的右边到其父布局左边的距离
getBottom():获取到view自身底边到其父布局顶边的距离

MotionEvent提供的方法:
getX():获取触摸点距离控件左边的距离,即视图坐标
getY(): 获取触摸点距离控件顶边的距离,即视图坐标
getRawX():获取触摸点距离整个屏幕左边的距离,即绝对坐标
getRawY():获取触摸点距离整个屏幕顶边的距离,即绝对坐标
知道了以上的知识点后,基于文章一做view的移动,这里还是三个视图ViewC、ViewGroupB、ViewGroupA
在这里插入图片描述
C添加移动
在这里插入图片描述
给ViewC(蓝色区域)添加移动
onTouchEvent返回true,自身消费事件。
手指按下MotionEvent.ACTION_DOWN,记录当前距离控件左边和顶边的距离lastX、lastY。
手指移动时MotionEvent.ACTION_MOVE,获取当前距离控件左边和顶边的距离x、y,减去手指按下时记录的距离lastX、lastY,计算得到移动的距离,移动的距离加上view距离父布局的距离,得到相对于父布局的四个点坐标,layout重新确认位置。
手指离开MotionEvent.ACTION_UP,设置view距离父布局的margin,这边的操作主要是固定view的位置,后续和视图B一起移动时可固定位置。

private int lastX;
private int lastY;
@Override
public boolean onTouchEvent(MotionEvent event) {
    int x = (int) event.getX();
    int y = (int) event.getY();
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            lastX = x;
            lastY = y;
            break;
        case MotionEvent.ACTION_MOVE:
            //计算移动的距离
            int offsetX = x - lastX;
            int offsetY = y - lastY;
            int l = getLeft() + offsetX;
            int b = getBottom() + offsetY;
            int r = getRight() + offsetX;
            int t = getTop() + offsetY;
            //重新确认位置
            layout(l, t, r, b);
            break;
        case MotionEvent.ACTION_UP:
            LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) getLayoutParams();
            params.setMargins(getLeft(), getTop(), 0, 0);
            break;
        default:
            break;
    }
    return true;
}

B添加移动
在这里插入图片描述

同样给ViewGroupB添加以上的代码用于B的移动。(蓝色的视图C,×××的视图B)
在这里插入图片描述

情况一:如上图 这里视图B、C的onTouchEvent都返回true,在C区域滑动,viewC消费了事件,不再传递给B;只有在B、C不重叠的区域滑动,C才会移动,这时没有接触到C,所以不会触发C的事件。因为我们在C的MotionEvent.ACTION_UP手指离开时固定了C到父布局(B)的距离,所以C相对B的位置没变。
在这里插入图片描述
情况二:如上图,将C的onTouchEvent返回false,在C区域滑动,事件没有消费,传递给到了B,B可以滑动,在不重叠区域一样可以滑动B。
如果B把事件拦截了onInterceptTouchEvent返回true,那么效果和情况二相同的,不管C的onTouchEvent返回啥,都响应不了。
这里模拟了视图B、C的滑动,A的话原理相同,这里就不再描述。
浅谈android事件分发的两篇文章结束了,这里只是简单描述模拟了事件分发。日常项目中若是遇到情况怕是更为复杂,想要彻底玩转事件分发机制还需要进一步的研究。

深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值