Android用Canvas繪制貝塞爾曲線
用Canvas畫貝塞爾曲線,要畫貝塞爾曲線首先了解貝塞爾曲線:
由于用計算機畫圖大部分時間是操作鼠標(biāo)來掌握線條的路徑,與手繪的感覺和效果有很大的差別。即使是一位精明的畫師能輕松繪出各種圖形,拿到鼠標(biāo)想隨心所欲的畫圖也不是一件容易的事。這一點是計算機萬萬不能代替手工的工作,所以到目前為止人們只能頗感無奈。使用貝塞爾工具畫圖很大程度上彌補了這一缺憾。
貝塞爾曲線是計算機圖形圖像造型的基本工具,是圖形造型運用得最多的基本線條之一。它通過控制曲線上的四個點(起始點、終止點以及兩個相互分 離的中間點)來創(chuàng)造、編輯圖形。其中起重要作用的是位于曲線中央的控制線。這條線是虛擬的,中間與貝塞爾曲線交叉,兩端是控制端點。移動兩端的端點時貝塞 爾曲線改變曲線的曲率(彎曲的程度);移動中間點(也就是移動虛擬的控制線)時,貝塞爾曲線在起始點和終止點鎖定的情況下做均勻移動。注意,貝塞爾曲線上 的所有控制點、節(jié)點均可編輯。這種“智能化”的矢量線條為藝術(shù)家提供了一種理想的圖形編輯與創(chuàng)造的工具。
在安卓開發(fā)中Canvas提供了畫貝塞爾曲線的方法,在Canvas中的quadTo方法只能畫3次的貝塞爾曲線,不過還提供了rQuadTo方法實現(xiàn)了以結(jié)束點為原點的續(xù)接。用這個做一個滾動的波浪線,如果把這個波浪線截取一塊可以做成類似加速球的東西
/** ?* Created by Administrator on 2015/9/17. ?*/ public class MyPathView extends View { private int height; private int width; private Path path;//路徑 private Paint mPaint; private Paint mPaintpoint; private int count; private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case 0x23://這應(yīng)該寫一個static final的變量 count++; if (count < 80) {//形成循環(huán),因為波浪線是兩段40所以一個周期80 ? ? ? ? ? ? ? ? ? ? ? ? setCount(count); handler.sendEmptyMessageDelayed(0x23, 20); ? ? ? ? ? ? ? ? ? ? } else { count = 0; handler.sendEmptyMessageDelayed(0x23, 20); ? ? ? ? ? ? ? ? ? ? } break; ? ? ? ? ? ? } ? ? ? ? } ? ? }; public void setCount(int count) { this.count = count; ? ? ? ? invalidate(); ? ? } public MyPathView(Context context) { super(context); ? ? } public MyPathView(Context context, AttributeSet attrs) { super(context, attrs); path = new Path(); mPaint = new Paint(); mPaintpoint = new Paint(); mPaintpoint.setStrokeWidth(10); mPaintpoint.setColor(Color.YELLOW); mPaint.setAntiAlias(true); mPaint.setTextSize(50); mPaint.setStyle(Paint.Style.STROKE); handler.sendEmptyMessage(0x23);// ? ? } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); width = getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec); height = getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec); ? ? ? ? setMeasuredDimension(width, height); ? ? } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); path.reset(); path.moveTo(count, 100); for (int i = 0; i < 10; i++) { path.rQuadTo(20, 10, 40, 0);//以(count=0,100)為原點開始畫,控制點、結(jié)束點 path.rQuadTo(20, -10, 40, 0);//以(40,0)為原點開始畫,形成一個類似余弦的波浪周期 ? ? ? ? } ? ? ? ? canvas.drawPath(path, mPaint); 使用quadTo繪制曲線 // ? ? ?path.moveTo(100, 100); // ? ? ? ?path.quadTo(100, 400, 300, 300);//控制點終點 // ? ? ? ?canvas.drawPoint(100,100,mPaintpoint);//起點 // ? ? ? ?canvas.drawPoint(100,400,mPaintpoint);//控制點 // ? ? ? ?canvas.drawPoint(300,300,mPaintpoint);//終點 } }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android中使用tcpdump、wireshark進行抓包并分析技術(shù)介紹
這篇文章主要介紹了Android中使用tcpdump、wireshark進行抓包并分析技術(shù)介紹,本文講解了下載并安裝tcpdump、pc上安裝wireshark等內(nèi)容,需要的朋友可以參考下2015-04-04Jetpack Compose圖片組件使用實例詳細(xì)講解
在Compose中,圖片組件主要有兩種,分別是顯示圖標(biāo)的Icon組件和顯示圖片的Image組件,當(dāng)我們顯示一系列的小圖標(biāo)的時候,我們可以使用Icon組件,當(dāng)顯示圖片時,我們就用專用的Image組件2023-04-04Android通過Path實現(xiàn)搜索按鈕和時鐘復(fù)雜效果
這篇文章主要為大家詳細(xì)介紹了Android通過Path實現(xiàn)搜索按鈕和時鐘復(fù)雜效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-09-09深入android Unable to resolve target ''android-XX''詳解
本篇文章是對android Unable to resolve target 'android-XX'錯誤的解決方法進行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06Android Studio 3.0 原生支持kotlin 例子詳解
這篇文章主要介紹了 Android Studio 3.0 原生支持kotlin 例子詳解,非常具有實用價值,需要的朋友可以參考下2017-05-05android實現(xiàn)RecyclerView列表單選功能
這篇文章主要為大家詳細(xì)介紹了android實現(xiàn)RecyclerView列表單選功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-07-07Android PopupMenu彈出菜單的實現(xiàn)
這篇文章主要介紹了 Android PopupMenu彈出菜單的實現(xiàn)的相關(guān)資料,希望通過本文能幫助到大家,實現(xiàn)這樣的功能,需要的朋友可以參考下2017-10-10Android開發(fā)之獲取LayoutInflater對象的方法總結(jié)
這篇文章主要介紹了Android開發(fā)之獲取LayoutInflater對象的方法,結(jié)合實例形式總結(jié)分析了Android獲取LayoutInflater對象的常用技巧,需要的朋友可以參考下2016-02-02