2012-06-27 32 views
0

我一直在开发一个应用程序来绘制ics android平板电脑,我遇到了一个问题,我找不出如何解决。在画布上快速绘制位图android ics

问题是,我绘制正确,并在实时绘制,但当我真的很快(在真正的平板电脑上测试)的圆圈不是真正的圆形,他们看起来像5或6边的pilgons ...

这里我声明位图,并将其分配到画布:

Display display = getWindowManager().getDefaultDisplay(); 
    Point size = new Point(); 
    display.getSize(size); 
    width = size.x; 
    height = size.y; 
    bm = Bitmap.createBitmap(width, height-50,Bitmap.Config.ARGB_8888); 
    c = new Canvas(bm); 

这里我用得到的x码,Y:(该layP是“刷”,你会本身到这里

class SaveOnTouchListener implements OnTouchListener{ 

    public boolean onTouch(View v, MotionEvent e) { 
     final float x = e.getX(); 
     final float y = e.getY(); 
     if(e.getAction() == MotionEvent.ACTION_DOWN){ 
      startx.add(x); 
      starty.add(y); 
      x1 = x; 
      y1 = y; 
     } else if(e.getAction() == MotionEvent.ACTION_MOVE){ 
      endx.add(x); 
      endy.add(y); 
      x2 = x; 
      y2 = y; 
      if (id == 1) strokes.add(sb.getProgress()+1); 
      else strokes.add(4*(sb.getProgress()+1)); 
      layP.draw(); 
      startx.add(x); 
      starty.add(y); 
      x1 = x; 
      y1 = y; 
     } else if(e.getAction() == MotionEvent.ACTION_UP){ 
      x2 = x; 
      y2 = y; 
      endx.add(x); 
      endy.add(y); 
      strokes.add(stroke); 
      layP.draw(); 
      return false; 
     } 
     return true; 
    } 

} 

最后这里的“画家”,这是画布和的onDraw()方法的代码(我用的无效(T,L,R,B)做了优化....)

private class Painter extends View{ 
    public Painter(Context context){ 
     super(context); 
    } 

    public void draw() { 
     if (firstPainting) { 
          //paint the canvas white just once 
      Paint paint = new Paint(); 
      paint.setStyle(Paint.Style.FILL); 
      paint.setColor(Color.WHITE); 
      c.drawPaint(paint); 
      firstPainting = false; 
      layP.invalidate(); 
     } 
     else { 
       Paint paint = new Paint(); 
       paint.setStyle(Paint.Style.FILL); 
       paint.setAntiAlias(true); 
       int r = startx.get(startx.size()-1).intValue(); 
       int t = starty.get(starty.size()-1).intValue(); 
       int l = endx.get(endx.size()-1).intValue(); 
       int b = endy.get(endy.size()-1).intValue(); 
       int n = strokes.get(strokes.size()-1); 
       paint.setStrokeWidth(n); 
       paint.setColor(COLOR.BLACK); 
       c.drawLine(r, t, l, b, paint); 
       c.drawCircle(r, t, n/2, paint); 

       if (l > r) { 
        int aux = l; 
        l = r; 
        r = aux; 
       } 
       if (t > b) { 
        int aux = t; 
        t = b; 
        b = aux; 
       } 
       r += n; 
       l -= n; 
       t -= n; 
       b += n; 
       if (t < 0) t = 0; 
       if (l < 0) l = 0; 
       layP.invalidate(l,t,r,b); 
     } 
    } 


    @Override 
    protected void onDraw(Canvas c) { 
      c.drawBitmap(bm, 0, 0, null); 
    } 
} 
} 

正如你所看到的,我使用了一个BitMap,并且我只是使需要失效的区域无效,我不知道该怎么办。

有没有办法正确绘制?即使我不得不改变所有的位图和画布..

我试图实现Bezier,但我不知道该怎么做,因为我需要绘制线条之前的下一个点。

我找到了bezier方法,我想我会试试这个。

回答

1

我一点也不清楚你想要做什么。从你的文本中,这听起来像你正在尝试做基本的“手指画”,你基本上只画出与输入相匹配的曲线。你的代码看起来不像这样,但在你使用的变量之间,我们还没有看到(strokestrokes)的声明和单字母变量名称,我有点失落。当然这两条线:

c.drawLine(r, t, l, b, paint); 
c.drawCircle(r, t, n/2, paint); 

使它看起来像你要做的不仅仅是绘制用户用手指画的东西。

不过,我想尝试帮忙。 drawCircle()真的应该总是画圆圈。在点之间绘制线条会给你带来尖角(如果你关闭了一个形状,将会出现多边形)。如果你想顺利地画出这样的路径,那么Bézier曲线确实是你想要的。

如果您下载sample code from the SDK,有一个名为“FingerPaint”的示例,它非常好地演示了如何平滑绘制任意曲线。

+0

对不起,这是很久以前的延迟,但我最终使用了Bézier,就像你说的,现在我已经看到了。谢谢! –