5

ねえ、キャンバスを使ってさまざまなパターンで線を描きたいです。

任意のアイデアや提案をいただければ幸いです..!!!!

前もって感謝します。

4

2 に答える 2

3

Path.Docsを使用する必要があります:

Path クラスは、直線セグメント、二次曲線、および三次曲線で構成される複合 (複数の等高線) 幾何学的パスをカプセル化します。...

たとえば、ビューのinメソッドviewにタッチ イベントの位置を拡張して追加できます。次に、最新のタッチ イベントに対応するランダムな位置を生成し、それらをパスの他のインスタンスに追加する必要があります。最後にビューのメソッドで、すべてを描画します。このスニペットが私のアイデアを理解するのに役立つことを願っています:pathonTouchEvent(MotionEvent event)onDraw()

public class NetCanvas extends View {

    private static final double MAX_DIFF = 15;
    Path path0 = new Path();
    Path path = new Path();
    private Paint p0;
    private Paint p;

    public NetCanvas(Context context) {
        super(context);
        p0 = new Paint();
        p0.setShader(new LinearGradient(0, 0, 230, getHeight(), Color.GREEN,
                Color.RED, Shader.TileMode.CLAMP));
        p0.setStyle(Style.STROKE);

        p = new Paint();
        p.setShader(new LinearGradient(0, 0, 230, getHeight(), Color.BLUE,
                Color.MAGENTA, Shader.TileMode.CLAMP));
        p.setStyle(Style.STROKE);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        float x0 = event.getX();
        float y0 = event.getY();
        float x = generateFloat(event.getX());
        float y = generateFloat(event.getY());

        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            path0.moveTo(x0, y0);
            path0.lineTo(x0, y0);

            path.moveTo(x, y);
            path.lineTo(x, y);
        } else if (event.getAction() == MotionEvent.ACTION_MOVE) {
            path0.lineTo(x0, y0);

            path.lineTo(x, y);
        } else if (event.getAction() == MotionEvent.ACTION_UP) {
            path0.lineTo(x0, y0);

            path.lineTo(x, y);
        }
        invalidate();
        return true;
    }

    @Override
    public void onDraw(Canvas canvas) {
        canvas.drawPath(path0, p0);
        canvas.drawPath(path, p);
    }

    private float generateFloat(Float f){
        double d = (Math.signum(2*Math.random() - 1)) * Math.random() * MAX_DIFF;
        return (float) (f + d);
    }
}

上記のコードでは、2 つの を使用しましたが、3 つ以上pathを使用することもできます。また、結果は、画面上の指の速度によって異なります。例:
ここに画像の説明を入力

または、次のようになります。

ここに画像の説明を入力

編集:

上記の class( NetCanvas) extendsViewにより、そのインスタンスを作成し、他のビューと同様にそのインスタンスを使用できます。たとえば、そのインスタンスを Activity として設定するだけです。ここでは、ActivityのメソッドContentViewをオーバーライドします。onCreate()

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new NetCanvas(this));
    }

NetCanvas他のいくつかの変更で拡張するように変更できますSurfaceViewが。

于 2013-01-12T04:45:40.450 に答える
1

NetCanvasあなたの質問の2番目の画像のように見える形を描くように変更しました:

public class NetCanvas1 extends View {

    Path path0 = new Path();
    private Paint p0;
    private int points_Num = 20;
    private int first_Points_Num = 5;

    public NetCanvas1(Context context) {
        super(context);
        p0 = new Paint();
        p0.setShader(new LinearGradient(0, 0, 230, getHeight(), Color.GREEN,
                Color.RED, Shader.TileMode.CLAMP));
        p0.setStyle(Style.STROKE);

    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        float x0 = event.getX();
        float y0 = event.getY();

        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            path0.moveTo(x0, y0);
            path0.lineTo(x0, y0);

        } else if (event.getAction() == MotionEvent.ACTION_MOVE) {
            path0.lineTo(x0, y0);
        } else if (event.getAction() == MotionEvent.ACTION_UP) {
            path0.lineTo(x0, y0);
            invalidate();
        }
        return true;
    }

    @Override
    public void onDraw(Canvas canvas) {
        canvas.drawPath(path0, p0);
        FlaotPoint[] pointArray = getPoints();
        try {
            for (int i = 0; i < first_Points_Num; i++) {
                for (int j = i; j < pointArray.length; j++) {
                    canvas.drawLine(pointArray[i].getX(), pointArray[i].getY(),
                            pointArray[j].getX(), pointArray[j].getY(), p0);
                }
            }
            path0.reset();
        } catch (Exception e) {
        }
    }

    private FlaotPoint[] getPoints() {
        FlaotPoint[] pointArray = new FlaotPoint[points_Num];
        PathMeasure pm = new PathMeasure(path0, false);
        float length = pm.getLength();
        float distance = 0f;
        float speed = length / points_Num;
        int counter = 0;
        float[] aCoordinates = new float[2];

        while ((distance < length) && (counter < points_Num)) {
            // get point from the path
            pm.getPosTan(distance, aCoordinates, null);
            pointArray[counter] = new FlaotPoint(aCoordinates[0],
                    aCoordinates[1]);
            counter++;
            distance = distance + speed;
        }

        return pointArray;
    }

    class FlaotPoint {
        float x, y;

        public FlaotPoint(float x, float y) {
            this.x = x;
            this.y = y;
        }

        public float getX() {
            return x;
        }

        public float getY() {
            return y;
        }
    }
}

結果は、 の値points_Numfirst_Points_Numおよび for ループ内の線で接続されたポイントの順序によって異なります。

for (int i = 0; i < first_Points_Num; i++) {
                for (int j = i; j < pointArray.length; j++) {
                    canvas.drawLine(pointArray[i].getX(), pointArray[i].getY(),
                            pointArray[j].getX(), pointArray[j].getY(), p0);
                }
            }

各変数の値またはポイントの順序を変更して結果を変更できます。結果は次のようになります。

ここに画像の説明を入力 ここに画像の説明を入力

私の考えは簡単です:パスからポイントを取得し、それらを線で接続します.パスからポイントをgetPoints()取得する方法について詳しく知りたい場合は、この回答と参照を参照してください.

于 2013-01-15T21:11:25.557 に答える