Android使用貝塞爾曲線畫心形
本文實例為大家分享了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); ? ? } }
運行效果
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android處理圖像數(shù)據(jù)轉(zhuǎn)換的各種方法
這篇文章主要介紹了Android處理圖像數(shù)據(jù)轉(zhuǎn)換的各種方法,本文講解了RGB值轉(zhuǎn)Bitmap、Color值轉(zhuǎn)Bitmap、字節(jié)數(shù)組轉(zhuǎn)Bitmap、讀取文件轉(zhuǎn)Bitmap、讀取資源轉(zhuǎn)Bitmap、輸入流轉(zhuǎn)Bitmap等內(nèi)容,需要的朋友可以參考下2015-01-01ubuntu上在androidstudio中啟動emulator閃退的解決方法
在AndrodStudio中點擊模擬器的啟動按鈕后,模擬器界面彈出后,又立刻閃退。下面通過本文給大家分享ubuntu上在androidstudio中啟動emulator閃退的解決方法,一起看看吧2017-07-07一款不錯的android6.0、7.0權(quán)限管理器推薦
下面小編就為大家分享一篇一款不錯的android6.0、7.0權(quán)限管理器推薦,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-01-01Android SwipeMenuListView框架詳解分析
這篇文章主要介紹了Android SwipeMenuListView框架詳解分析的相關(guān)資料,需要的朋友可以參考下2016-10-10關(guān)于Android發(fā)送短信獲取送達(dá)報告的問題(推薦)
最近公司開發(fā)一個項目,要求app能夠發(fā)送短信并獲取送達(dá)報告。實現(xiàn)代碼非常簡單的,下面小編給大家分享關(guān)于Android發(fā)送短信獲取送達(dá)報告的問題,感興趣的朋友一起看看吧2017-03-03Android實現(xiàn)網(wǎng)易云推薦歌單界面
大家好,本篇文章主要講的是Android實現(xiàn)網(wǎng)易云推薦歌單界面,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下2022-02-02