0

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 を使用し、無効にする必要のあるゾーンを無効にするだけで、他に何をすべきかわかりません。

うまく描く方法ってありますか?すべてのビットマップとキャンバスを変更しなければならない場合でも..

ベジエを実装しようとしましたが、線を描く前に次のポイントが必要なので、その方法がわかりません。

ベジエ法を見つけたので、これを試してみようと思います。

4

1 に答える 1

1

あなたが何をしようとしているのか、私にはまったくわかりません。テキストからは、基本的に入力に一致する曲線を描くだけの基本的な「指の絵」を作成しようとしているように聞こえます。あなたのコードは私にはあまり似ていませんが、(strokestrokes)の宣言が見られない使用している変数と1文字の変数名の間で、私は少し迷っています。確かにこれらの2行:

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

ユーザーが指で描いたものを単に描くだけではないように見せます。

それでも、私は助けたいと思います。 drawCircle()本当に常に円を描く必要があります。ポイント間に線を引くと、鋭いコーナーが得られます(シェイプを閉じるとポリゴンになります)。このようなパスをスムーズに描画したい場合は、ベジェ曲線が最適です。

SDKからサンプルコードをダウンロードすると、「FingerPaint」という例があります。これは、任意の曲線をスムーズに描画する方法を示す非常に優れた機能を備えています。

于 2012-07-06T03:47:28.653 に答える