【问题标题】:Drawing fast in canvas Bitmap android ics在画布位图android ics中快速绘制
【发布时间】:2012-06-27 07:31:42
【问题描述】:

我一直在开发一款在 ics android 平板电脑上绘图的应用,但遇到了一个我不知道如何解决的问题。

问题是我画得正确并且是实时画的,但是当我走得非常快(在真正的平板电脑上测试)时,圆圈并不是真正的圆圈,它们看起来像 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 是您将在此处设置的“Painter”

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”的代码,它是画布和 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);
    }
}
}

如您所见,我使用的是位图,只是使需要失效的区域无效,我不知道还能做什么。

有没有正确绘制的方法?即使我必须更改所有位图和画布..

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

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

【问题讨论】:

    标签: android bitmap draw android-canvas invalidation


    【解决方案1】:

    我完全不清楚你想做什么。从您的文字中,听起来您正在尝试进行基本的“手指绘画”,您基本上只是绘制与输入匹配的曲线。你的代码对我来说看起来不太像,但是在你使用的变量之间,我们没有看到(stroke 和strokes)的声明和一个字母的变量名称,我有点丢失。当然是这两行:

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

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

    不过,我还是想帮忙。 drawCircle() 真的应该一直画圆圈。在点之间画线会给你尖角(如果你关闭一个形状,多边形)。如果你想平滑地绘制这样的路径,那么贝塞尔曲线确实是你想要的。

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

    【讨论】:

    • 抱歉耽搁了,那是很久以前的事了,但我终于按照你说的那样使用了贝塞尔,现在我已经看到了。谢谢!
    猜你喜欢
    • 2013-11-06
    • 1970-01-01
    • 2012-11-01
    • 2011-10-14
    • 1970-01-01
    • 1970-01-01
    • 2018-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多