網站首頁 編程語言 正文
用Canvas畫貝塞爾曲線,要畫貝塞爾曲線首先了解貝塞爾曲線:
由于用計算機畫圖大部分時間是操作鼠標來掌握線條的路徑,與手繪的感覺和效果有很大的差別。即使是一位精明的畫師能輕松繪出各種圖形,拿到鼠標想隨心所欲的畫圖也不是一件容易的事。這一點是計算機萬萬不能代替手工的工作,所以到目前為止人們只能頗感無奈。使用貝塞爾工具畫圖很大程度上彌補了這一缺憾。
貝塞爾曲線是計算機圖形圖像造型的基本工具,是圖形造型運用得最多的基本線條之一。它通過控制曲線上的四個點(起始點、終止點以及兩個相互分 離的中間點)來創造、編輯圖形。其中起重要作用的是位于曲線中央的控制線。這條線是虛擬的,中間與貝塞爾曲線交叉,兩端是控制端點。移動兩端的端點時貝塞 爾曲線改變曲線的曲率(彎曲的程度);移動中間點(也就是移動虛擬的控制線)時,貝塞爾曲線在起始點和終止點鎖定的情況下做均勻移動。注意,貝塞爾曲線上 的所有控制點、節點均可編輯。這種“智能化”的矢量線條為藝術家提供了一種理想的圖形編輯與創造的工具。
在安卓開發中Canvas提供了畫貝塞爾曲線的方法,在Canvas中的quadTo方法只能畫3次的貝塞爾曲線,不過還提供了rQuadTo方法實現了以結束點為原點的續接。用這個做一個滾動的波浪線,如果把這個波浪線截取一塊可以做成類似加速球的東西
/**
?* 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://這應該寫一個static final的變量
count++;
if (count < 80) {//形成循環,因為波浪線是兩段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)為原點開始畫,控制點、結束點
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);//終點
}
}
原文鏈接:https://blog.csdn.net/litao660044/article/details/48554417
相關推薦
- 2023-02-25 React18之update流程從零實現詳解_React
- 2022-03-14 IDEA 上傳文件 getRealpath("/upload)獲取不到文件上傳路徑問題
- 2022-11-05 Android實現雙曲線折線圖_Android
- 2022-03-21 Prometheus容器化部署的實踐方案_docker
- 2022-06-27 Android中的TimePickerView(時間選擇器)的用法詳解_Android
- 2023-12-21 Redis HyperLogLog的使用
- 2022-04-06 Go語言實現枚舉的示例代碼_Golang
- 2022-10-07 C#如何實現調取釘釘考勤接口的功能_C#教程
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支