Недавно мне пришлось решить несколько похожую проблему, и я кратко объясню, что я сделал в случае, если это поможет.
Что вы можете сделать, это использовать несколько перекрывающихся видов, в которых может содержаться фоновая графика, которую вы не хотите часто перерисовывать, и вид на переднем плане, который содержит графику, которая часто обновляется. Затем, чтобы повысить производительность, вы можете сконструировать фоновое представление onDraw()
так, чтобы оно поддерживалось растровым изображением, которое затем сохранялось как переменная класса. В самой первой onDraw()
вашей фоновой графики вы делаете относительно медленное рисование в Canvas. При последующих вызовах onDraw()
вы просто рисуете этот растр в Canvas.
Я только что сделал это сам. По сути, мое приложение отображает несколько графических индикаторов. Эти датчики имеют много графики, которые рисуются только один раз (грань датчика, числовые условные обозначения), и графику указателя, которую необходимо перерисовывать снова и снова при изменении данных модели. Прежде всего, я разбил фоновую графику и переместил графику переднего плана в отдельные перекрывающиеся виды. Теперь, аннулирование и перерисовка графического указателя на переднем плане, конечно же, приводит к тому, что все перекрывающиеся объекты также становятся недействительными, поэтому метод onDraw()
для фонового графического представления вызывается каждый раз, когда перерисовывается указатель. Фоновому представлению требуется только один раз нарисовать фоновую графику, но он сохраняет растровое изображение, поддерживающее холст, и при последующих вызовах onDraw()
возвращает это растровое изображение обратно в Canvas (что намного быстрее, чем первоначальное создание графики с использованием Path (). объекты).
Bitmap bm;
....
protected void onDraw(Canvas canvas){
if(null==bm){
bm=Bitmap.createBitmap(getMeasuredWidth(),getMeasuredHeight(),Bitmap.Config.ARGB_8888);
// do your slow vector graphics drawing to Canvas here
}
Paint drawPaint = new Paint();
drawPaint.setAntiAlias(false);
drawPaint.setFilterBitmap(false);
drawPaint.setDither(false);
canvas.drawBitmap(bm, 0, 0, drawPaint);
}