Android使用貝塞爾曲線畫心形

本文實例為大傢分享瞭Android使用貝塞爾曲線畫心形的具體代碼,供大傢參考,具體內容如下

一開始我隻是想畫個圓,可畫著畫著就成瞭心形,那就將錯就錯

1. 創建一個Activity

RelativeLayout container = findViewById(R.id.download_container);

    DisplayMetrics metrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(metrics);
    deviceWidth = metrics.widthPixels;
    deviceHeight = metrics.heightPixels;

    Circle circle = new Circle(this, deviceWidth / 2, deviceHeight / 2, deviceWidth / 8);
    Line line = new Line(this, deviceWidth / 2, deviceHeight / 2, deviceWidth / 8);
    container.addView(line);

2. 創建一個自定義的View

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PointF;
import android.view.View;

public class Line extends View {

    private Paint mPaint;
    private PointF startPointF;
    private PointF endPointF;
    private PointF controlPointF1, controlPointF2;

    private PointF startPointF2;
    private PointF endPointF2;
    private PointF controlPointF3, controlPointF4;

    public Line(Context context, float x, float y, float radius) {
        super(context);
        double d = (2 * Math.sqrt(2) - 1);
        this.startPointF = new PointF(x, y - radius);
        this.endPointF = new PointF(x, y + radius / 10);
        this.controlPointF1 = new PointF(x, (float) (y - d * radius));
        this.controlPointF2 = new PointF((float) (x + d * radius), (float) (y - d * radius));

        this.startPointF2 = new PointF(x, y - radius);
        this.endPointF2 = new PointF(x, y + radius / 10);
        this.controlPointF3 = new PointF(x, (float) (y - d * radius));
        this.controlPointF4 = new PointF((float) (x - d * radius), (float) (y - d * radius));

        this.mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        this.mPaint.setColor(Color.WHITE);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        //繪制貝塞爾曲線
        Path path = new Path();

        path.moveTo(startPointF.x, startPointF.y);
        path.cubicTo(controlPointF1.x, controlPointF1.y, controlPointF2.x, controlPointF2.y, endPointF.x, endPointF.y);
        canvas.drawPath(path, mPaint);

        path.moveTo(startPointF2.x, startPointF2.y);
        path.cubicTo(controlPointF3.x, controlPointF3.y, controlPointF4.x, controlPointF4.y, endPointF2.x, endPointF2.y);
        canvas.drawPath(path, mPaint);
    }
}

運行效果

以上就是本文的全部內容,希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。

推薦閱讀: