2016-12-17 6 views
0

ビュー内でアンドゥ/リドゥ操作で複数のカラービットマップファイルを描画しようとしています。ここでアンドゥ/リドゥ、カラー/ビットマップのセットアップのための私のセットアップはだ、長いリストのパスを適用した後に表示が応答しない

private ArrayList<Path> paths = new ArrayList<Path>(); 
private ArrayList<Path> undonePaths = new ArrayList<Path>(); 

private Map<Path, Integer> colorMap = new HashMap<>(); 
private Map<Path, Bitmap> colorFillMap = new HashMap<Path, Bitmap>(); 

構成をペイント:

 drawPath = new Path(); 
     drawPaint = new Paint(Paint.DITHER_FLAG); 
     drawPaint.setAntiAlias(true); 
     drawPaint.setFilterBitmap(true); 
     drawPaint.setDither(true); 
     drawPaint.setColor(paintColor); 
     drawPaint.setStrokeWidth(brushSize); 
     drawPaint.setStyle(Paint.Style.STROKE); 
     drawPaint.setStrokeJoin(Paint.Join.ROUND); 
     drawPaint.setStrokeCap(Paint.Cap.ROUND); 
     drawPaint.setAlpha(100); 

     setLayerType(View.LAYER_TYPE_SOFTWARE, drawPaint); 

ありますいつでも私は単にパスリスト内の修正されたカラー/ビットマップを格納しています変化する。これにより、以前の状態で使用されていたのとまったく同じ色/ビットマップを復元できます。

private void touch_start(float x, float y) { 
     undonePaths.clear(); 
     drawPath.reset(); 
     drawPath.moveTo(x, y); 
     mX = x; 
     mY = y; 
    } 

    private void touch_move(float x, float y, float x2, float y2) { 
     float dx = Math.abs(x - mX); 
     float dy = Math.abs(y - mY); 
     if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) { 
      drawPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2); 
      mX = x; 
      mY = y; 
     } 
    } 

    private void touch_up() { 

     // commit the path to our offscreen 
     drawPath.lineTo(mX, mY); 
     drawCanvas.drawPath(drawPath, drawPaint); 

     // kill this so we don't double draw 
     paths.add(drawPath); 
     // the selectedColor is dynamically changeable 
     colorMap.put(drawPath, selectedColor); 
     drawPath = new Path(); 
     drawPath.reset(); 
    } 

    public void onClickUndo() { 
     if (paths.size() > 0) { 
      undonePaths.add(paths.remove(paths.size() - 1)); 
      invalidate(); 
     } 
    } 

    public void onClickRedo() { 
     if (undonePaths.size() > 0) { 
      paths.add(undonePaths.remove(undonePaths.size() - 1)); 
      invalidate(); 
     } 
    } 

、最終的にonDraw()内部Iに格納された値に基づいて各パスを描いてい方法、しかし

protected void onDraw(Canvas canvas) { 
     canvas.save(); 

     try { 
      for (Path p : paths) { 

      if (colorFillMap.get(p) != null) { 
       // the colorFillMap is dynamically changeable 
       canvas.drawBitmap(colorFillMap.get(p), 0, 0, drawPaint); 
      } else { 
        if (colorMap.get(p) != null) { 
         drawPaint.setColor(colorMap.get(p)); 
        } 
         if (p != null) { 
          canvas.drawPath(p, drawPaint); 

          drawPaint.setColor(selectedColor); 

          canvas.drawPath(drawPath, drawPaint); 
         } 
       } 
      } 
     } 

     canvas.restore(); 
    } 

は、パスのカップルを適用した後ビューが遅くなり、タッチ応答性が応答しなくなる。リスト内の多数のパスがこれを引き起こしているのは不思議です。とにかく私はプロセスをスピードアップすることができますか?私は何か間違っているのですか?

答えて

0

私はプロセスをスピードアップできますか?

ビットマップで図面を実行できるため、ビットマップをonDraw()で描画するだけで済みます。例:

private Canvas mCanvas; 
private Bitmap mCanvasBitmap; 
@Override 
    protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
     super.onSizeChanged(w, h, oldw, oldh); 
     if (mCanvasBitmap == null) { 
      mCanvasBitmap = Bitmap.createBitmap(w,h, Bitmap.Config.ARGB_8888); 
      mCanvas = new Canvas(mCanvasBitmap); 
     } 

    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 
     if(mCanvasBitmap == null) return; 
     canvas.drawBitmap(mCanvasBitmap,0,0,null); 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
    .... 

    mCanvas.draw(...); 
    invalidate(); 

    .... 

    } 

ただし、やり直し/元に戻す操作の新しい方法を見つける必要があります。

関連する問題