Android ViewGroup仅淡化内容/子项而非背景

时间:2017-10-09 15:11:32

标签: android android-layout

是否有一种简单的方法可以设置ViewGroup的内容(子)的透明度?

背景:我有一个自定义FrameLayout,其中包含许多不同的视图。现在我想淡出内容/孩子:

  • 布局的backgroundColor应该始终可见 - 因此我不能只setAlpha()整个ViewGroup
  • 我不想循环遍历所有孩子,并在每个孩子上手动拨打child.setAlpha()

当前方法

它正在运作但我并不完全满意 - 我认为有一个更简单的解决方案。

覆盖dispatchDraw()并在所有内容上方绘制一个矩形:

@Override
protected void dispatchDraw(Canvas canvas) {
    super.dispatchDraw(canvas);

    // Draw the alpha overlay above the children.
    if (mGridAlpha < 1.0f) {
        mOverlayPaint.setColor(adjustAlpha(mOverlayPaint.getColor(), 1 - mGridAlpha));
        canvas.drawRect(0, 0, canvas.getWidth(), canvas.getHeight(), mOverlayPaint);
    }
}

public static int adjustAlpha(int color, float factor) {
    int alpha = Math.round(255 * factor);
    int red = Color.red(color);
    int green = Color.green(color);
    int blue = Color.blue(color);
    return Color.argb(alpha, red, green, blue);
}

淡入/淡出是通过ValueAnimator

手动完成的
public void fadeContent(final boolean in) {
    ValueAnimator animator = ValueAnimator.ofFloat(0f, 1f);
    animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            mGridAlpha = in ? fraction : 1 - fraction;
            // Key here is to call invalidate() which will cause a dispatchDraw() call
            invalidate();
        }
    });
    animator.start();
}

0 个答案:

没有答案