使用透明

时间:2017-09-22 08:00:31

标签: android android-layout android-drawable

我尝试创建这样的drawable

enter image description here

我编写代码并且几乎正常工作

public class GetsugaDrawable extends Drawable {

private final Context context;
private final float radiusScale = 1.2f;
private final float yOffset = 0.3f;

private final int colorLower = Color.RED;
private final int colorUpper = Color.BLACK;

private final Paint upperPaint = new Paint();

public GetsugaDrawable(Context c) {
    context = c;
    upperPaint.setColor(colorUpper);
    upperPaint.setFlags(Paint.ANTI_ALIAS_FLAG);
}

@Override
public void draw(@NonNull Canvas canvas) {
    final Rect bounds = new Rect(getBounds());
    canvas.drawColor(colorLower, PorterDuff.Mode.SRC);
    final float radius = radiusScale * bounds.height();
    final int x = bounds.centerX();
    final float y = (bounds.centerY() - bounds.height() * yOffset) - radius;
    canvas.drawCircle(x, y, radius, upperPaint);
}

@Override
public void setAlpha(int alpha) {
    // ignored TODO impl.
}

@Override
public void setColorFilter(@Nullable ColorFilter colorFilter) {
    // ignored TODO impl.
}

@Override
public int getOpacity() {
    return PixelFormat.TRANSLUCENT;
}
}

这是我的结果

enter image description here

我试图改变

    private final int colorUpper = Color.BLACK;

    private final int colorUpper = Color.TRANSPARENT;

但是当我再次使用透明色运行我的应用时,结果就像这样

enter image description here

我做错了什么? 感谢

2 个答案:

答案 0 :(得分:0)

添加upperPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));

public class GetsugaDrawable extends Drawable {
private final Context context;
private final float radiusScale = 1.2f;
private final float yOffset = 0.3f;

private final int colorLower = Color.RED;
private final int colorUpper = Color.BLACK;

private final Paint upperPaint = new Paint();

public GetsugaDrawable(Context c) {
    context = c;
    upperPaint.setAntiAlias(true);
    upperPaint.setColor(colorUpper);
    upperPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));      
}

@Override
public void draw(@NonNull Canvas canvas) {
    final Rect bounds = new Rect(getBounds());
    canvas.drawColor(colorLower);
    final float radius = radiusScale * bounds.height();
    final int x = bounds.centerX();
    final float y = (bounds.centerY() - bounds.height() * yOffset) - radius;
    canvas.drawCircle(x, y, radius, upperPaint);
}

@Override
public void setAlpha(int alpha) {

}

@Override
public void setColorFilter(@Nullable ColorFilter colorFilter) {

}

@Override
public int getOpacity() {
    return PixelFormat.TRANSLUCENT;
}}

并且不要忘记view.setLayerType(View.LAYER_TYPE_HARDWARE,null);在目标视图

答案 1 :(得分:0)

您可以更改draw功能。

@Override
public void draw(@NonNull Canvas canvas) {
    final Rect bounds = new Rect(getBounds());
    final float radius = radiusScale * bounds.height();
    final int x = bounds.centerX();
    final float y = (bounds.centerY() - bounds.height() * yOffset) - radius;
    Path path = new Path();
    path.addCircle(x, y, radius, CW);
    canvas.clipPath(path, Region.Op.DIFFERENCE);
    canvas.drawColor(colorLower);
}

试试这个。