2013-08-08 16 views
7

Próbuję narysować taki kształt w metodzie onDraw widoku niestandardowego.Rysowanie "otworów" w obszarze roboczym

Niestety, nie mogę "wyciąć" przezroczystego kółka na płótnie (rysując okrąg z kolorem. Przezroczysty).

Czy najpierw należy narysować kształt w innej mapie bitowej, a następnie narysować go na płótnie dostarczonym przez onDraw? Czy jest to lepszy (prostszy) sposób to zrobić?

Custom shape

Oto kod próbowałem (współpracuje z 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: Mam dokładny kształt chciałem podczas korzystania Color.WHITE: Result achieved with Color.WHITE

Rozwiązanie

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

Uwaga: createBitamp i nowe płótno powinny zostać przeniesione z metody onDraw.

+0

dobrze, użycie obrazu, jeśli widzisz, że ręcznie jest zbyt skomplikowany –

+0

Co to jest ColorTransparent? Czemu nie zamieścić kodu sprawdzającego? Sprawdź, czy to pomaga - http://stackoverflow.com/questions/9988671/android-r-color-transparent-not-fully-transparent – Sundeep

+0

Color.TRANSPARENT jest stałą systemu Android. – Tryum

Odpowiedz

9
+0

Sprawdziłem 3 z 4 linków, ale ponownie próbując, udało mi się przebić moją dziurę za pomocą innej bitmapy. Czy powinienem przyjąć tę odpowiedź, czy też udzielić mi własnej odpowiedzi za pomocą mojego ostatniego kodu? – Tryum

+3

@Tryum To twoja decyzja. Możesz przyjąć moją odpowiedź i otrzymać +2 punkty reputacji lub napisać własną odpowiedź za pomocą kodu i zaakceptować w ciągu 48 godzin (nie otrzymasz reputacji). Jest jeszcze jedno rozwiązanie: napisz swoją odpowiedź i przyjmij moją. Dzięki, – TN888

Powiązane problemy