用android-ics快速绘制画布位图
我一直在开发一个应用程序来吸引android平板电脑的ics,但我遇到了一个我不知道如何解决的问题 问题是我画的是正确的,而且是实时的,但是当我画得非常快(在真正的平板电脑上测试)时,这些圆不是真正的圆,它们看起来像是5或6边的堆积体 在这里,我声明位图并将其分配给画布:用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
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);