#android #android-recyclerview #android-canvas
#Android #android-recyclerview #android-холст
Вопрос:
У меня есть пользовательский вид, который рисует вогнутую форму (визуализируется красным прямоугольником на скриншоте). Этот пользовательский вид является частью моего макета элемента recycler view, который также содержит обычный вид с цветом фона (правая часть).
Это выдержка из моего пользовательского вида (без поворота, но с теми же методами рисования):
public class InvertedCircleView extends View {
private Paint mPaint;
private float mCanvasCenterX;
private float mCenterCircleWidth, mCenterCircleHeight;
public InvertedCircleView(Context context, AttributeSet attrs) {
super(context, attrs);
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}
@Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
[...]
mPaint.setStyle(Paint.Style.FILL);
canvas.drawPaint(mPaint);
mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
mCenterCircleWidth = canvas.getWidth();
mCenterCircleHeight = canvas.getHeight();
mCanvasCenterX = canvas.getWidth() / 2;
canvas.drawOval(mCanvasCenterX - (mCenterCircleWidth / 2),
-mCenterCircleHeight,
mCanvasCenterX (mCenterCircleWidth / 2),
mCenterCircleHeight,
mPaint);
}
}
Когда recyclerview отображается в первый раз, все выглядит нормально. Но когда я прокручиваю вниз (или вверх), часть пользовательского вида не отображается на всех новых элементах.
Что я тестировал до сих пор:
- setItemViewCacheSize -> это помогает, но при повторной прокрутке вверх отображается тот же плохой результат
- notifyDataSetChanged -> это напрямую приводит к «неправильной» визуализации для всех элементов
В чем может быть причина такого поведения?
Ответ №1:
Нашел свою ошибку: Я использовал «mPaint.setXfermode(новый PorterDuffXfermode(PorterDuff.Mode.ОЧИСТИТЬ));» в onDraw-функции. Но в конце я забыл сбросить Xfermode.
Я добавил строку «mPaint.setXfermode(null);» и все работает, как ожидалось 🙂