我的理解是:用于判断滑动事件是否被取消
final boolean anchoredScaleCancelled = mAnchoredScaleMode == ANCHORED_SCALE_MODE_STYLUS && !isStylusButtonDown; streamComplete@Google Translate: 流完成
我的理解是,这个布尔变量用于标记
当前动作是否完成
我这里说的动作有两种
这里指的是:在大动作如三指触屏放大过程中,又一个手指离开了屏幕这种
在大动作三指触屏中发生的一个小动作,离开一指
final boolean streamComplete = action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL || anchoredScaleCancelled; action == MotionEvent.ACTION_DOWN || streamComplete如果发生了上面这种小动作,或者说有一手指离开了屏幕,就进行调用
if (action == MotionEvent.ACTION_DOWN || streamComplete) {...} if (mInProgress)@google Translate:重置侦听器正在进行的任何缩放。
如果是ACTION_DOWN,我们开始一个新的事件流。
这意味着应用程序可能没有给我们所有的事件。很遗憾。
首先判断该进程(从第一个手指碰上屏幕,到最后一个手指离开屏幕为止)是否结束
如果仍在运行中,这调用回调方法:onScaleEnd 使其结束
if (mInProgress) { mListener.onScaleEnd(this); mInProgress = false; mInitialSpan = 0; mAnchoredScaleMode = ANCHORED_SCALE_MODE_NONE; } else if (inAnchoredScaleMode() && streamComplete)如果当前进程已经结束
判断 mAnchoredScaleMode 是否为 ANCHORED_SCALE_MODE_STYLUS 状态
同时判断操作流 streamComplete 是否完成
都符合的情况下结束这一手势变化
else if (inAnchoredScaleMode() && streamComplete) { mInProgress = false; mInitialSpan = 0; mAnchoredScaleMode = ANCHORED_SCALE_MODE_NONE; } if (streamComplete)结束本次 onTouchEvent 方法的调用,等待下一次调用发生
if (streamComplete) { return true; }总结: 可以看到,当触发 down 或者触发 up,cancel 时,如果之前处于缩放计算的状态,会将其状态重置, 并调用 onScaleEnd 方法。
进入锚定比例模式当判断用户动作,如果为双击这类点击事件,进入该模式
与正常缩放区分。这个模式功能一般是:双击最大化和最小化
if (!mInProgress && mStylusScaleEnabled && !inAnchoredScaleMode() && !streamComplete && isStylusButtonDown) { // Start of a button scale gesture mAnchoredScaleStartX = event.getX(); mAnchoredScaleStartY = event.getY(); mAnchoredScaleMode = ANCHORED_SCALE_MODE_STYLUS; mInitialSpan = 0; } mAnchoredScaleStartX & mAnchoredScaleStartY后文中将用于重新计算焦点
mAnchoredScaleStartX = event.getX(); mAnchoredScaleStartY = event.getY(); mAnchoredScaleMode赋值之后,再次调用 inAnchoredScaleMode() 方法,返回值变为 true
mAnchoredScaleMode = ANCHORED_SCALE_MODE_STYLUS; 计算缩放中心 final boolean configChanged = action == MotionEvent.ACTION_DOWN || action == MotionEvent.ACTION_POINTER_UP || action == MotionEvent.ACTION_POINTER_DOWN || anchoredScaleCancelled; final boolean pointerUp = action == MotionEvent.ACTION_POINTER_UP; final int skipIndex = pointerUp ? event.getActionIndex() : -1; // Determine focal point float sumX = 0, sumY = 0; final int div = pointerUp ? count - 1 : count; final float focusX; final float focusY; if (inAnchoredScaleMode()) { // In anchored scale mode, the focal pt is always where the double tap // or button down gesture started focusX = mAnchoredScaleStartX; focusY = mAnchoredScaleStartY; if (event.getY() < focusY) { mEventBeforeOrAboveStartingGestureEvent = true; } else { mEventBeforeOrAboveStartingGestureEvent = false; } } else { for (int i = 0; i < count; i++) { if (skipIndex == i) continue; sumX += event.getX(i); sumY += event.getY(i); } focusX = sumX / div; focusY = sumY / div; } configChanged