2

我正在阅读RippleForegroundRippleDrawable (软件渲染部分)的实现,我已经知道有界意味着波纹有一个遮罩。

但我仍然对实施的某些方面感到困惑:

  1. 为什么实现说“有界涟漪没有进入动画”并简单地跳过进入动画?在这种情况下如何启动波纹动画(如果用户没有释放他的触摸所以没有退出)?

    @Override
    protected Animator createSoftwareEnter(boolean fast) {
        // Bounded ripples don't have enter animations.
        if (mIsBounded) {
            return null;
        }
        ...
    }
    
  2. 为什么实现为和选择了一个几乎恒定的值(为什么是random())?如果被遮罩的视图大于该尺寸怎么办,它会正常工作吗?mBoundedRadiusmTargetRadiusColorDrawable

    public RippleForeground(RippleDrawable owner, Rect bounds, float startingX, float startingY,
            boolean isBounded) {
        ...
        if (isBounded) {
            mBoundedRadius = MAX_BOUNDED_RADIUS * 0.9f
                    + (float) (MAX_BOUNDED_RADIUS * Math.random() * 0.1);
        }
        ...
    }
    
    ...
    
    private void computeBoundedTargetValues() {
        ...
        mTargetRadius = mBoundedRadius;
    }
    
4

1 回答 1

1

对于第一个问题,我通过深入研究提交历史并尝试新的 Marshmallow 图像自己找到了答案。答案很简单:

他们删除了有界的触摸(前景)波纹RippleDrawable,但没有删除无界的,故意留下这种不一致。

我刚刚在 Android SDK 的 Marshmallow 图像上进行了测试。它被移除了,更糟糕的是,他们将退出的涟漪留在了用户第一次触摸屏幕的地方,而不是他们的手指从屏幕上抬起的地方。

棉花糖上的涟漪

我无法理解这个设计决定,因为它对我来说似乎是一种回归,而不是一种改进,但就像在提交日志中一样,他们相信他们确实实现了有界波纹动画,而不是删除它。

但是对于第二个问题,我还没有得到答案。

于 2015-10-12T14:20:45.600 回答