Using alpha mask in TextView also removes alpha parent view?

I am trying to use a TextView with an alpha linear gradient, for example:

enter image description here

I have an implementation that almost works, here is the code:

public class MyTextView extends TextView {

    Paint paint = new Paint();

    void init() {
        paint.setAlpha(0xffffffff);
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.OVERLAY)); 
        paint.setShader(
            new LinearGradient(
                0, 0, getWidth(), getHeight(), 
                0xffffffff, 0x00000000, 
                Shader.TileMode.CLAMP));
    }

    void draw(Canvas canvas) {
        super.draw(canvas);

        canvas.drawRect(0, 0, getWidth(), getHeight(), paint);
    }
}

He sits in this layout, which has its own translucent background:

<View background="#33000000">
    <MyTextView />
</View>

The drawing mode seems to remove the translucent background color of its parent view. I'm not sure how to stop the drawing code in the textview class from the influence of the background color of its parent view?

thank

+4
source share
1 answer

try the following:

public class AlphaMaskLayout extends RelativeLayout {

    private Paint paint;

    public AlphaMaskLayout(Context context) {
        super(context);
        init(context, null, 0);
    }

    public AlphaMaskLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context, attrs, 0);
    }

    public AlphaMaskLayout(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init(context, attrs, defStyle);
    }

    private void init(Context context, AttributeSet attrs, int defStyle) {
        paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        paint.setAlpha(0xffffffff);
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));

        setLayerType(LAYER_TYPE_SOFTWARE, null);
        setWillNotDraw(false);
    }

    @Override
    public void draw(Canvas canvas) {
        super.draw(canvas);
        canvas.drawRect(0, 0, getWidth(), getHeight(), paint);
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        paint.setShader(
                new LinearGradient(
                        0, 0, w, h,
                        new int[]{ 0xffffffff, 0xfaffffff, 0x00000000, 0x00000000, 0xfaffffff, 0xffffffff},
                        new float[]{0, 0.15f, 0.3f, 0.7f, 0.85f, 1f},
                        Shader.TileMode.CLAMP));
    }
}

in xml:

<your.package.AlphaMaskLayout
    android:layout_centerInParent="true"
    android:layout_width="160dp"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/moving_textview"
        android:layout_centerVertical="true"
        android:padding="16dp"
        android:textSize="16sp"
        android:background="@null"
        android:textColor="@android:color/white"
        android:shadowColor="@android:color/black"
        android:shadowDx="1"
        android:shadowDy="1"
        android:shadowRadius="1"
        android:text="Hello World!!!"
        android:gravity="center"
        android:layout_centerInParent="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</saulmm.coordinatorexamples.AlphaMaskLayout>
0
source

Source: https://habr.com/ru/post/1660458/


All Articles