Android 将外部视图内容绘制到内部画布中,同时使其变暗?

Android 将外部视图内容绘制到内部画布中,同时使其变暗?,android,canvas,view,Android,Canvas,View,我正在自定义视图中绘制另一个视图的内容,如下所示: @Override public void draw(final Canvas canvas){ // Draw lower filler canvas.save(); canvas.translate(0, mCurrentExpansionRect.bottom - mStartBounds.bottom); canvas.clipRect(0, mStartBounds.bottom, canvas.get

我正在自定义视图中绘制另一个视图的内容,如下所示:

@Override
public void draw(final Canvas canvas){
    // Draw lower filler
    canvas.save();
    canvas.translate(0, mCurrentExpansionRect.bottom - mStartBounds.bottom);
    canvas.clipRect(0, mStartBounds.bottom, canvas.getWidth(), canvas.getHeight());
    mOuterView.draw(canvas);
    canvas.restore();

    // Draw upper filler
    canvas.save();
    canvas.translate(0, mCurrentExpansionRect.top - mStartBounds.top);
    canvas.clipRect(0, 0, canvas.getWidth(), mStartBounds.top);
    mOuterView.draw(canvas);
    canvas.restore();

    // Draw content
    canvas.save();
    canvas.translate(0, mCurrentExpansionRect.top);
    canvas.clipRect(0, 0, mCurrentExpansionRect.right, mCurrentExpansionRect.height());
    super.draw(canvas);
    canvas.restore();
}
mOuterView是提供背景并在自定义视图的顶部和底部绘制的视图(这些背景称为上下“填充”)

我想调暗上下填充物,但无法修改其油漆

在修改输出(如调暗输出)时,是否可以在自定义视图中绘制另一个视图的内容

我想避免在已经绘制的上下填充层上绘制调光层,以避免过度绘制

编辑: 最终结果的视频:
展开视图上方和下方的行是上部和下部填充物,在行展开时应逐渐变暗。

一种方法是在填充物上绘制渐变,这会产生额外的过度拉伸,我想避免这种情况,但这似乎是唯一的方法

@Override
public void draw(final Canvas canvas){
    // Draw lower filler
    canvas.save();
    canvas.translate(0, mCurrentExpansionRect.bottom - mStartBounds.bottom);
    canvas.clipRect(0, mStartBounds.bottom, canvas.getWidth(), canvas.getHeight());
    mOuterView.draw(canvas);
    canvas.restore();

    // Draw lower filler shadow
    canvas.save();
    canvas.translate(0, mCurrentExpansionRect.bottom);
    mFillerShadowPaint.setShader(mLowerFillerShadow);
    mFillerShadowPaint.setAlpha((int) (mAnimatedFraction * 255));
    canvas.drawPaint(mFillerShadowPaint);
    canvas.restore();

    // Draw upper filler
    canvas.save();
    canvas.translate(0, mCurrentExpansionRect.top - mStartBounds.top);
    canvas.clipRect(0, 0, canvas.getWidth(), mStartBounds.top);
    mOuterView.draw(canvas);
    canvas.restore();

    // Draw upper filler shadow
    canvas.save();
    canvas.translate(0, mCurrentExpansionRect.top - mTopDistance);
    mFillerShadowPaint.setShader(mUpperFillerShadow);
    mFillerShadowPaint.setAlpha((int) (mAnimatedFraction * 255));
    canvas.drawPaint(mFillerShadowPaint);
    canvas.restore();

    // Draw content
    canvas.save();
    canvas.translate(0, mCurrentExpansionRect.top);
    canvas.clipRect(0, 0, mCurrentExpansionRect.right, mCurrentExpansionRect.height());
    super.draw(canvas);
    canvas.restore();
}

这是一个看起来很奇怪的代码,但并不违法。不过我想解释一下,为什么你要为未来的维护人员做这件事。在画布上画另一个视图。首先,它将此视图与外部视图紧密耦合。通常在绘图代码中未完成的操作。我很好奇这个视图实际上是什么——如果它只是一个图像或背景,那么在这个类中,您最好使用一个可绘制视图,而不是使用两个视图来获得这种效果。或者,如果其中一个/两个都有真实数据,则可能将这两个视图合并为一个视图。这个想法很难说,因为我不完全明白你想做什么。是的,你是对的。用例非常具体。它用于在不接触RecyclerView的情况下扩展RecyclerView行。它覆盖新的展开布局并设置行展开的动画。要在展开行的上方和下方移动行,将在展开行上方和下方的画布上绘制recyclerview的内容。与谷歌新推出的收件箱应用非常相似。我将创建一个视频并将其添加到此帖子中,以显示它应该做什么,请稍候。@Gabeschen我已经添加了视频。单击一行后,recyclerview将覆盖“我的自定义视图”,行扩展将设置动画。扩展行上方和下方的recyclerview行是上下填充行,它们被绘制到我的扩展自定义视图的画布中,并且应该变暗。你不可能为Facebook工作,是吗?你似乎正在解决与我在这里看到的问题类似的问题。无论如何,我知道的使图像变暗的一种方法是在图像后面画黑色,然后应用alpha因子。这应该会让它变得更暗。