2016-06-13 3 views
0

Я рисую сетку над растровым изображением. Пользователь может изменить размер, соотношение сторон или перетащить сетку. Выполнение этого с помощью drawLines приводит к довольно плохим заиканиям при выполнении этих операций. Есть ли лучший подход?Более эффективный способ рисования линий на холсте?

private void drawGrid() 
{ 
    canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); 
    gridOverlayView.invalidate(); 

    int count = 0; 
    for(int i = 0; i < numColumns +1 ; i++) 
    { 
     points[count] = originX + (cellWidth * i); 
     points[count+1] = originY; 
     points[count+2] = originX + (cellWidth * i); 
     points[count+3] = originY + (gridHeight); 
     count += 4; 
    } 

    for(int i = 0; i < numRows +1; i++) 
    { 
     points[count] = originX; 
     points[count+1] = originY + (cellHeight * i); 
     points[count+2] = originX + (gridWidth); 
     points[count+3] = originY + (cellHeight * i); 
     count += 4; 
    } 

    canvas.drawLines(points, 0, points.length, paint); 
    gridOverlayView.setImageBitmap(gridOverlayBitmap); 
} 

это вызывается из:

@Override 
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) 
    { 
     originX += e2.getX() - e1.getX(); 
     if(originX < 0f) 
     { 
      originX = 0f; 
     } 
     if(originX + gridWidth > imageWidth) 
     { 
      originX = imageWidth - gridWidth; 
     } 

     originY += e2.getY() - e1.getY(); 
     if(originY < 0f) 
     { 
      originY = 0f; 
     } 
     if(originY + gridHeight > imageHeight) 
     { 
      originY = imageHeight - gridHeight; 
     } 

     drawGrid(); 
     return true; 
    } 

ответ

0

Я решил проблему, выполнив пару вещей: Оптимизация макета после dev guide. Затем я просто уменьшил растровое изображение, которое я использовал, чтобы нарисовать сетку, а затем масштабировал ее, когда я хотел сохранить ее на исходном изображении. Это заставило все двигаться хорошо и плавно ... (на самом деле слишком быстро)

0

Поскольку нет исходного кода вы вызываете эту функцию, я не могу найти точную причину заикания. Я думаю, вы хотите изменить сетки в режиме реального времени с помощью взаимодействия с пользователем.

Я думаю, вам следует избегать перерисовки всей сетки во время перетаскивания пользователя.
Вместо этого вы можете переводить, масштабировать или поворачивать (если вам нужно) предыдущий битмап по вашему желанию.

Конечно, изображение результата иногда не в хорошем качестве, но вы можете воссоздать всю растровую карту сетки, когда пользователь перестает взаимодействовать.
Таким образом, вы можете достичь эффекта создания сетки в режиме реального времени.

Смежные вопросы