2013-08-08 4 views
7

Я пытаюсь нарисовать такую ​​форму в методе onDraw пользовательского вида.Рисование «дыр» на холсте

К сожалению, я не могу «разрезать» прозрачный круг на холсте (рисуя круг с помощью Color.Transparent).

Должен ли я сначала нарисовать фигуру в другом растровом изображении, а затем нарисовать ее на холсте, предоставленном onDraw? Или это лучший (более простой) способ сделать это?

Custom shape

Вот код, который я попробовал (работает с Color.white):

mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); 
mPaint.setColor(Color.TRANSPARENT); 
mPaint.setStrokeWidth(4); 
mPaint.setStyle(Style.STROKE); 

canvas.drawColor(getResources().getColor(R.color.black_overlay)); 
canvas.drawCircle(-3*(this.getBottom()-this.getTop())/4, (this.getTop()+this.getBottom())/2, this.getBottom()-this.getTop(), mPaint); 

PS: Я получил точную форму я хотел, используя Color.white: Result achieved with Color.WHITE

Решение

@Override 
public void onDraw(Canvas canvas) 
{ 
    mBitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888); 
    mCanvas = new Canvas(mBitmap); 
    mCanvas.drawColor(getResources().getColor(R.color.black_overlay)); 
    mCanvas.drawCircle(-3*(getHeight())/4, (getHeight())/2, getHeight(), mPaint); 
    canvas.drawBitmap(mBitmap, 0, 0, null); 
} 
with 
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); 
    mPaint.setStrokeWidth(4); 
    mPaint.setStyle(Style.STROKE); 
    mPaint.setXfermode(new PorterDuffXfermode(Mode.CLEAR)); 

Примечание: createBitamp и новый холст должны быть перемещены из метода onDraw.

+0

хорошо, использовать изображение, если вы видите, что вручную слишком сложно –

+0

Что такое ColorTransparent? Почему бы не написать какой-то код того, что вы пробовали? Посмотрите, поможет ли это: http://stackoverflow.com/questions/9988671/android-r-color-transparent-not-fully-transparent – Sundeep

+0

Color.TRANSPARENT - постоянная андроида. – Tryum

ответ

9
+0

Я рассмотрел 3 из 4-х ссылок, но, снова попробовав, мне удалось пробить дыру, используя другое растровое изображение. Должен ли я принять этот ответ или сделать свой собственный ответ с моим окончательным кодом? – Tryum

+3

@Tryum Это ваше решение. Вы можете принять мой ответ и получить +2 точки репутации или написать свой собственный ответ с кодом и принять через 48 часов (вы не получите репутацию). Существует еще одно решение: напишите свой ответ и примите мое. Благодаря, – TN888