Android使用貝塞爾曲線畫心形
本文實(shí)例為大家分享了Android使用貝塞爾曲線畫心形的具體代碼,供大家參考,具體內(nèi)容如下
一開始我只是想畫個圓,可畫著畫著就成了心形,那就將錯就錯
1. 創(chuàng)建一個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. 創(chuàng)建一個自定義的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);
? ? }
}運(yùn)行效果

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android實(shí)現(xiàn)圖片異步請求加三級緩存
這篇文章主要向大家詳細(xì)介紹了Android實(shí)現(xiàn)圖片異步請求加三級緩存的相關(guān)資料,需要的朋友可以參考下2016-02-02
淺談Android手機(jī)聯(lián)系人開發(fā)之增刪查改功能
這篇文章主要介紹了Android手機(jī)聯(lián)系人開發(fā)之增刪查改功能,需要的朋友可以參考下2017-05-05
Android?利用ImageView屬性實(shí)現(xiàn)選中和未選中效果
這篇文章主要介紹了Android巧用ImageView屬性實(shí)現(xiàn)選中和未選中效果,實(shí)現(xiàn)思路通常我們會選擇在布局里加個ImageView,然后通過代碼層面加個判斷去讓ImageView加載不同狀態(tài)的圖片,需要的朋友可以參考下2023-06-06
Android Studio3.2中導(dǎo)出jar包的過程詳解
這篇文章主要介紹了Android Studio3.2中導(dǎo)出jar包的過程,本文分步驟給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06
android studio3.3.1代碼提示忽略大小寫的設(shè)置
這篇文章主要介紹了android studio3.3.1代碼提示忽略大小寫的設(shè)置,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03
android項目實(shí)現(xiàn)帶進(jìn)度條的系統(tǒng)通知欄消息
本篇文章主要介紹了android項目實(shí)現(xiàn)帶進(jìn)度條的系統(tǒng)通知欄消息,就是實(shí)現(xiàn)在通知欄看到下載進(jìn)度。具有一定的參考價值,感興趣的小伙伴們可以參考一下。2016-10-10
Android中使用IntentService創(chuàng)建后臺服務(wù)實(shí)例
這篇文章主要介紹了Android中使用IntentService創(chuàng)建后臺服務(wù)實(shí)例,IntentService提供了在單個后臺線程運(yùn)行操作的簡單結(jié)構(gòu),需要的朋友可以參考下2014-06-06
Android ViewPager實(shí)現(xiàn)智能無限循環(huán)滾動回繞效果
這篇文章主要為大家詳細(xì)介紹了Android ViewPager實(shí)現(xiàn)智能無限循環(huán)滾動回繞效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-07-07

