如何在 Canvas 后面设置 CustomView 的背景?

How to set a Background of a CustomView behind the Canvas?

我有一个这样的自定义 View

public class ShadowTextView extends TextView {

...

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

        super.onMeasure(widthMeasureSpec, heightMeasureSpec);

        final int parentWidth = MeasureSpec.getSize(widthMeasureSpec);
        final int parentHeight = MeasureSpec.getSize(heightMeasureSpec);
        final int minSize = Math.min(parentWidth, parentHeight);

        mShadow = new Paint(Paint.ANTI_ALIAS_FLAG);

        RadialGradient gradient = new RadialGradient(
                parentWidth * mCenterX,
                parentHeight * mCenterY,
                minSize * mGradientRadiusWidthPercent,
                new int[]{mStartColor, mCenterColor, mEndColor},
                null,
                android.graphics.Shader.TileMode.CLAMP);

        mShadow.setDither(true);
        mShadow.setShader(gradient);

    }

    @Override
    protected void onDraw(Canvas canvas) {

        super.onDraw(canvas);

        canvas.drawRect(0, 0, getWidth(), getHeight(), mShadow);

    }

...

}

在 XML 中,我想使用此 CustomView 背景超过我的 Canvas

<com.ShadowTextView
    android:layout_width="match_parent"
    android:layout_height="match_parent"

    android:background="@drawable/circle"
    android:paddingBottom="3dp"

    android:gravity="center"
    android:text="+"
    android:textColor="@android:color/white"
    android:textSize="32dp"

    app:startColor="@android:color/black"
    app:centerColor="@android:color/black"
    app:endColor="@android:color/transparent"
    app:gradientRadiusWidthPercent=".5"
/>

circle.xml:

<layer-list>

    <item xmlns:android="http://schemas.android.com/apk/res/android"
        android:bottom="6dp"
        android:left="3dp"
        android:right="3dp">

        <shape android:shape="oval">

            <!--
                accentColor might be material red #F44336
            -->

            <solid android:color="#F44336" />

        </shape>

    </item>

</layer-list>

Canvas 阴影在前景中,但应该在背景中,这意味着在 android:background="@drawable/circly" 和文本后面。

当前结果:

想要的结果:

最后一条重要提示:
我知道有很多开放的库可以获得浮动操作按钮。请不要推荐我。我想找到我的 "own" 解决方案,所以设计了一个 textView。

解决方案非常简单。通过 XML 定义 'android_background' 的背景设置是在 draw(...) – 而不是在 onDraw(...) – 方法中绘制的。

所以,我所要做的就是在 draw(...) 方法中绘制我的影子,然后调用 super.draw(...) 方法来绘制背景(在我的影子上)。

此外,在 super.draw(...) 方法中调用 onDraw(...) 方法来绘制 TextView.

的文本

与上面相同的代码,稍作改动:

public class ShadowTextView extends TextView {

    ...

    // overriding of the draw() method instead of the onDraw(...) method

    @Override
    public void draw(Canvas canvas) {

        canvas.drawRect(0, 0, canvas.getWidth(), canvas.getHeight(), mShadow);

        /*
            Draw the background setting by XML definition android:background
         */
        super.draw(canvas);

    }

    ...

}

感谢您的关心。