在画布中快速绘制Bitmap android ics

时间:2012-06-27 07:31:42

标签: android bitmap draw android-canvas invalidation

我一直在开发一个应用程序来绘制ics安卓平板电脑,我遇到了一个问题,我无法弄清楚如何修复。

问题在于我正确地绘制并且实时绘制但是当我真的非常快(在真正的平板电脑上测试)时,圆圈不是真正的圆圈,它们看起来像5或6边的pilygons ......

这里我声明了位图并将其分配给画布:

    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;
    }

}

最后这里是“painter”的代码,它是canvas和onDraw()方法(我使用invalidate(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,但我不知道该怎么做,因为在绘制线之前我需要下一个点。

我找到了更好的方法,我想我会试试这个。

1 个答案:

答案 0 :(得分:1)

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

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

让它看起来不仅仅是绘制用户用手指绘制的内容。

不过,我还是想尽力帮忙。 drawCircle()真的应该总是画圆圈。点之间的绘制线将为您提供锐角(如果您关闭形状,则为多边形)。如果你想平滑地绘制这样的路径,那么Bézier曲线确实是你想要的。

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