Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用android-ics快速绘制画布位图_Android_Bitmap_Draw_Android Canvas_Invalidation - Fatal编程技术网

用android-ics快速绘制画布位图

用android-ics快速绘制画布位图,android,bitmap,draw,android-canvas,invalidation,Android,Bitmap,Draw,Android Canvas,Invalidation,我一直在开发一个应用程序来吸引android平板电脑的ics,但我遇到了一个我不知道如何解决的问题 问题是我画的是正确的,而且是实时的,但是当我画得非常快(在真正的平板电脑上测试)时,这些圆不是真正的圆,它们看起来像是5或6边的堆积体 在这里,我声明位图并将其分配给画布: Display display = getWindowManager().getDefaultDisplay(); Point size = new Point(); display.getSize(s

我一直在开发一个应用程序来吸引android平板电脑的ics,但我遇到了一个我不知道如何解决的问题

问题是我画的是正确的,而且是实时的,但是当我画得非常快(在真正的平板电脑上测试)时,这些圆不是真正的圆,它们看起来像是5或6边的堆积体

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

    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”的代码,它是canvas和onDraw()方法(我使用invalidate(t,l,r,b)来优化它……)

私有类画师扩展视图{
公共画家(背景){
超级(上下文);
}
公众抽签(){
如果(第一次喷漆){
//只需将画布漆成白色一次
油漆=新油漆();
绘制.设置样式(绘制.样式.填充);
油漆。设置颜色(颜色。白色);
c、 油漆;
第一幅画=假;
layP.invalidate();
}
否则{
油漆=新油漆();
绘制.设置样式(绘制.样式.填充);
paint.setAntiAlias(真);
intr=startx.get(startx.size()-1.intValue();
int t=starty.get(starty.size()-1.intValue();
int l=endx.get(endx.size()-1.intValue();
intb=endy.get(endy.size()-1.intValue();
int n=strokes.get(strokes.size()-1);
油漆。设置行程宽度(n);
油漆。设置颜色(颜色。黑色);
c、 抽绳(r、t、l、b、油漆);
c、 拉丝圈(r、t、n/2、油漆);
如果(l>r){
int aux=l;
l=r;
r=辅助;
}
如果(t>b){
int aux=t;
t=b;
b=辅助;
}
r+=n;
l-=n;
t-=n;
b+=n;
如果(t<0)t=0;
如果(l<0)l=0;
layP.失效(l,t,r,b);
}
}
@凌驾
受保护的void onDraw(画布c){
c、 drawBitmap(bm,0,0,null);
}
}
}
正如你所看到的,我使用了一个位图,我只是使需要失效的区域失效,我不知道还能做什么

有没有一种方法可以正确地绘制?即使我必须更改所有位图和画布

我曾尝试实现贝塞尔,但我不知道如何实现,因为我需要在画线之前的下一个点


我已经找到了贝塞尔方法,我想我要尝试一下。

我一点也不清楚你想做什么。从你的文本中,听起来你想做基本的“手指绘画”,基本上你只是画出与输入匹配的曲线。你的代码在我看来不太像,但是在你使用的变量之间,我们没有看到(
stroke
stroke
)和一个字母的变量名的声明,我有点不知所措。当然,这两行:

c.drawLine(r, t, l, b, paint);
c.drawCircle(r, t, n/2, paint);
让它看起来你不仅仅是在画用户用手指画的东西

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


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

很抱歉延迟,那是很久以前的事了,但我终于如您所说使用了Bézier,我现在已经看到了。谢谢!
c.drawLine(r, t, l, b, paint);
c.drawCircle(r, t, n/2, paint);