Mam podklasę ImageView
, której używam do rysowania obrazów z zaokrąglonymi narożnikami. Kod jest oparty na this answer, i przedstawia się następująco:Wydajność podczas rysowania ImageView z zaokrąglonymi rogami
public class ImageViewRoundedCorners extends ImageView {
...
@Override
protected void onDraw(Canvas canvas) {
Bitmap scaledBitmap = Bitmap.createBitmap(getMeasuredWidth(),
getMeasuredHeight(),
Bitmap.Config.ARGB_8888);
Canvas scaledCanvas = new Canvas(scaledBitmap);
super.onDraw(scaledCanvas);
drawRoundedCornerBitmap(canvas, scaledBitmap,
getMeasuredWidth(), getMeasuredHeight());
scaledBitmap.recycle();
}
protected void drawRoundedCornerBitmap(Canvas outputCanvas, Bitmap input, int w, int h) {
Bitmap output = Bitmap.createBitmap(w, h, Config.ARGB_8888);
Canvas canvas = new Canvas(output);
mPaint.reset();
mPaint.setAntiAlias(true);
canvas.drawARGB(0, 0, 0, 0);
mPaint.setStyle(Paint.Style.FILL);
canvas.drawPath(mClipPath, mPaint);
mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
canvas.drawBitmap(input, 0, 0, mPaint);
outputCanvas.drawBitmap(output, 0, 0, null);
}
}
z tym kodem, obraz jest prawidłowo sporządzony z zaokrąglonymi narożnikami. Aby uniknąć alokacji w pierwszych dwóch wierszach drawRoundedCornerBitmap
, chcę narysować bezpośrednio na outputCanvas
, który jest płótnem pierwotnie przekazanym do onDraw
. Nowa realizacja wygląda następująco:
protected void drawRoundedCornerBitmap(...) {
mPaint.reset();
mPaint.setAntiAlias(true);
outputCanvas.drawARGB(0, 0, 0, 0);
mPaint.setStyle(Paint.Style.FILL);
outputCanvas.drawPath(mClipPath, mPaint);
mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
outputCanvas.drawBitmap(input, 0, 0, mPaint);
}
Z jakiegoś powodu ten kod wydaje się ignorować tryb Porter-Duff i zamiast po prostu rysuje obraz z normalnych (nie-zaokrąglonymi narożnikami). Dlaczego tak jest? Co to jest w przypadku rysowania do pliku pośredniego Bitmap
, który sprawia, że oryginalny kod działa?
Ja też mam ten sam problem. –
znalazłeś rozwiązanie dla tego ... nawet próbuję tego samego :( –