Избегайте размещения объектов во время операций рисования / макета ошибка в Android - PullRequest
0 голосов
/ 29 мая 2020

Я получил эту ошибку в Android Studio:

Избегайте выделения объектов во время операций рисования / макета

Код:

public class cizim extends View {

    Path path = new Path();
    Paint paint = new Paint();

    public cizim (Context c){
        super(c);
        paint.setColor(Color.BLACK);
        paint.setAntiAlias(true);

    }

    @Override
    protected void onDraw(Canvas canvas){
        canvas.setBitmap(BitmapFactory.decodeResource(getContext().getResources(), R.drawable.foto));
        canvas.drawPath(path, paint);
        super.onDraw(canvas);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event){
        float x = event.getX();
        float y = event.getY();
        path.addCircle(x, y, 10, Path.Direction.CW);
        invalidate();
        return super.onTouchEvent(event);
    }

}

Я получил ошибку с этим кодом:

canvas.setBitmap(BitmapFactory.decodeResource(getContext().getResources(), R.drawable.foto));

Как я могу решить эту проблему?

Мне нужна ваша помощь.

1 Ответ

0 голосов
/ 29 мая 2020

Рисование представления всегда является сложной задачей, потому что метод onDraw вызывается всякий раз, когда представление необходимо отрисовать снова, поэтому представьте себе выделение / создание новых объектов в этом методе; это определенно займет много времени и снизит производительность вашего приложения.

Поэтому вместо создания растрового изображения каждый раз, когда вызывается onDraw, создайте его только один раз в конструкторе представления.

Добавьте новую переменную экземпляра в свой класс:

public class cizim extends View {

    private Bitmap bitmap;

    ...
}

Затем в конструкторе создайте этот объект следующим образом:

public cizim(Context context) {
    super(context);
    paint.setColor(Color.BLACK);
    paint.setAntiAlias(true);
    bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.foto);
}

Наконец, измените свой метод onDraw на:

@Override
protected void onDraw(Canvas canvas){
    canvas.setBitmap(bitmap);
    canvas.drawPath(path, paint);
    super.onDraw(canvas);
}

Изменить:

На самом деле есть еще одна проблема с вашим кодом, которая приведет к UnsupportedOperationException при вызове canvas.setBitmap. Если вы обратитесь к документации , , setBitmap изменит растровое изображение, которое будет рисовать холст. Поскольку вам необходимо нарисовать растровое изображение на экране, вы не можете использовать здесь setBitmap. Итак, что вам действительно нужно, это canvas.drawBitmap

Измените свой метод onDraw на:

@Override
protected void onDraw(Canvas canvas){
    canvas.drawBitmap(bitmap, 0, 0, paint);
    canvas.drawPath(path, paint);
    super.onDraw(canvas);
}
...