我一直在开发一个应用程序来绘制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,但我不知道该怎么做,因为在绘制线之前我需要下一个点。
我找到了更好的方法,我想我会试试这个。
答案 0 :(得分:1)
我一点也不清楚你要做什么。从你的文字来看,听起来你正在尝试做基本的“手指画”,你基本上只是画出与输入相匹配的曲线。您的代码对我来说看起来不那么多,但是在您使用的变量之间我们没有看到(stroke
和strokes
)的声明和单字母变量名称,I有点失落。当然这两行:
c.drawLine(r, t, l, b, paint);
c.drawCircle(r, t, n/2, paint);
让它看起来不仅仅是绘制用户用手指绘制的内容。
不过,我还是想尽力帮忙。 drawCircle()
真的应该总是画圆圈。点之间的绘制线将为您提供锐角(如果您关闭形状,则为多边形)。如果你想平滑地绘制这样的路径,那么Bézier曲线确实是你想要的。
如果您下载sample code from the SDK,就会有一个名为“FingerPaint”的示例,它可以很好地演示如何平滑地绘制任意曲线。