2017-09-22 138 views
0

我嘗試創建這樣的繪製創建透明

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

我在做什麼錯? 謝謝

+0

正確的解決方法是使用形狀,不拉絲手動:https://developer.android.com/guide/topics/resources/drawable-resource.html#Shape –

+0

在你的代碼的問題,那你繪製透明圈在紅色背景。當然,沒有什麼會改變。您應該繪製像素並且不要繪製透明區域。 –

+0

你在哪裏使用這個GetsugaDrawable? – Ankita

回答

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);在目標視圖上

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

試試這個。