O caminho da Finger Paint fica enorme ao longo do tempo e diminui a velocidade do aplicativo

5

Por isso, estou escrevendo um aplicativo de pintura Finger. Eu tenho várias cores que o usuário pode selecionar. Salvei o caminho e pintei informações dentro de um array.

  ArrayList<PaintPath> arrayPaintPath = new ArrayList<PaintPath>();

O caminho da pintura é

class PaintPath{
    Paint aPaint;
    Path  aPath;
    PaintPath(Paint paint, Path path){
        aPaint = paint;
        aPath   = path;
    }
}

e dentro do onTouch eu coleciono para cada ação.

@Override
public boolean onTouchEvent(MotionEvent event) {

    float x = event.getX();
    float y = event.getY();

    switch(event.getAction()){
    case MotionEvent.ACTION_DOWN:
        mypath  = new Path();
        mypaint = new Paint();
        mypaint.setAntiAlias(true);
        mypaint.setStyle(Paint.Style.STROKE);
        mypaint.setStrokeWidth(8f);
        mypath.moveTo(x, y);
        break;

    case MotionEvent.ACTION_MOVE:
        mypath.lineTo(x, y);
        break;

    default:
        return true;
    }

    // see which color was selected by user
    setColor(mypaint); 

    // see if eraser was selected
    if(Palette.currentPaletteState == Palette.PaletteState.ERASER){
        mypaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
        mypaint.setStrokeWidth(50f); 
    }

    // Here is were the array gets populated and the onDraw method 
    // use this array to draw
    arrayPaintPath.add(new PaintPath(mypaint,mypath));

    // force to call onDraw method
    invalidate();
    return true;  // return true to keep the event to this child only
}

Em seguida, o método onDraw

@Override
protected void onDraw(Canvas canvas) {

    for(PaintPath p: arrayPaintPath){

        mycanvas.drawPath(p.aPath, p.aPaint);

        canvas.drawBitmap(bmp, 0, 0,null);

    }
}

Então o principal problema é com o forloop. Conforme o usuário pinta com o tempo, o caminho e a tinta são coletados, assim como o caminho do apagador também é coletado. O array fica maior e maior. Isso reduz significativamente o desempenho.

Eu sei que eu poderia usar o SurfaceView e lidar com o trabalho em outro thread, mas esse thread também acaba fazendo looping no enorme array.

Alguém sabe o que seria uma solução elegante para isso?

    
por pokche 22.04.2016 / 22:14
fonte

0 respostas