缩放手势 ScaleGestureDetector 源码解析,这一篇就够了 (2)

我的理解是:用于判断滑动事件是否被取消

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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpjzfd.html