在TextView上使用alpha遮罩会同时移除父视图的alpha吗?

4
我正在尝试将一个带有线性透明度渐变的TextView应用于它,如下所示:

enter image description here

我有一个几乎能正常工作的实现,以下是代码:

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);
    }
}

它位于这个布局中,该布局具有自己的半透明背景:
<View background="#33000000">
    <MyTextView />
</View>

画笔模式似乎会移除其父视图的半透明背景色。我不确定如何阻止我的textview类中的绘制代码影响其父视图的背景颜色?
谢谢。
1个回答

0

试试这个:

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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接