ics android タブレットで描画するアプリを開発していますが、修正方法がわからない問題が発生しました。
問題は、私が正しく描画し、リアルタイムで描画することですが、非常に高速に実行すると (実際のタブレットでテスト)、円は実際には円ではなく、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 は、ここで説明する「ペインター」です)。
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;
}
}
最後に、キャンバスである「ペインター」と 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 を使用し、無効にする必要のあるゾーンを無効にするだけで、他に何をすべきかわかりません。
うまく描く方法ってありますか?すべてのビットマップとキャンバスを変更しなければならない場合でも..
ベジエを実装しようとしましたが、線を描く前に次のポイントが必要なので、その方法がわかりません。
ベジエ法を見つけたので、これを試してみようと思います。