Рисование представления всегда является сложной задачей, потому что метод 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);
}