android開發自定義view倍絲曲線,從0到1Android自定義View(四)貝塞爾曲線

原標題:從0到1Android自定義View(四)貝塞爾曲線

2017年安卓巴士全球開發者論壇-上海站

作者

本文由兩點水投稿,博客地址:http://www.apkbus.com/myspaceblog-911082.html

前言

扯來扯去,前面三篇自定義 View 文章,終于扯完了一些知識點,有些枯燥,所以我也是講下核心點,沒有細分析,主要是讓各位有點印象和了解。這篇終于是實踐,敲代碼的了,因為工作原因,這篇拖的比較久,不過這系列會一直更新下去的,會把我工作中用到的自定義 View 也會加上去。好了,回歸正原題,說到自定義 View ,似乎都離不開貝塞爾曲線,因此,第一篇實踐就是與貝塞爾曲線有關的。點擊左下角”閱讀原文“可查看全部。

目錄

d37cd450453d81f36a0d26b9c83f98a7.png

貝塞爾曲線

1、貝塞爾曲線簡介

來看看官方對神奇的賽貝爾曲線的介紹:貝塞爾曲線于 1962,由法國工程師皮埃爾·貝塞爾所廣泛發表,他運用貝塞爾曲線來為汽車的主體進行設計。貝塞爾曲線最初由 Paul de Casteljau 于 1959 年運用 de Casteljau 演算法開發,以穩定數值的方法求出貝茲曲線。貝塞爾曲線主要用于二維圖形應用程序中的數學曲線,曲線由起始點,終止點(也稱錨點)和控制點組成,通過調整控制點,貝塞爾曲線的形狀會發生變化。

看完后是不是一臉蒙蔽,一句話理解貝塞爾曲線就是:將任意一條曲線轉化為精確的數學公式。

2、賽貝爾曲線公式

竟然說了是將曲線轉化為精確的數學公式,那么我們來看下具體的數學公式( 注:以下公式中,B(t) 為 t 時間下點的坐標; P0 為起點,Pn 為終點,Pi 為控制點 ):

(1) 一階貝塞爾曲線(線段)

由 P0 至 P1 的連續點, 描述的一條線段

8b413b158eb9a54dd7f64efc9e305f15.png

(2) 二階貝塞爾曲線(拋物線):

由 P0 至 P1 的連續點 Q0,描述一條線段。

由 P1 至 P2 的連續點 Q1,描述一條線段。

由 Q0 至 Q1 的連續點 B(t),描述一條二次貝塞爾曲線。

b004c80459a264fba3ee29dc272a9566.png

(3) 三階貝塞爾曲線:

45a240a032aaaf7b838aaed7d50025bc.png

3、貝塞爾曲線在 Android 中的應用

其實貝塞爾曲線在 Android 自定義 View 中運用還是挺多的,比如

Android 5.0 后下拉刷新的陰影曲線

QQ 消息提醒的小紅點

用于左右滑動時顯示個數的點的移動動畫

水流波動效果

一個彈性效果的抽屜菜單

4、Android Path 類中提供貝塞爾曲線的操作方法

在 Android 開發中,要實現貝塞爾曲線其實還是很簡單的,因為 Android 已經給我們提供了相關接口,此接口方法在 Path 類中,而關于 Path 類的講解,前面一篇博客就介紹過了。而且通過 Android 的 API 可以知道,貝塞爾曲線從 API1 就開始支持了。下面就是賽貝爾曲線對應的 API 方法了。

貝塞爾曲線

對應的方法

演示動畫

一階曲線
(線性曲線)

lineTo

0df5e793b9c02ec98e77bd56370ce456.gif

二階曲線

quadTo

8a3a4b75df453a49f0564f183a41032c.gif

三階曲線

cubicTo

b8cdc2e19a5b8fe0ad05988f1bd6806b.gif

四階曲線

5c926fe25645bc1fa7dc6dd134d48be6.gif

5、通過 de Casteljau 算法繪制貝塞爾曲線

上面提過,Path 類中提供了畫一到三階的貝塞爾曲線的方法,如果我們需要繪制更高階的貝塞爾曲線呢?我們可以采用德卡斯特里奧算法(De Casteljau’s Algorithm)來實現貝塞爾曲線。

效果圖:

6e12c292d460d320730866cd787d91e3.gif

a56c0927807c5d11e8ef04188ec50286.gif

Github 上的代碼:beziercurve

里面主要就一個類,beziercurve,這是個自定義 View ,BezierCurve里面主要提供了以下的方法:

Methods:

method 方法

deion 描述

void start()

開始貝塞爾曲線(required)

void stop()

停止貝塞爾曲線(optional)

boolean addPoint()

增加控制點(optional)

boolean delPoint()

刪除控制點(optional)

int getOrder()

獲取貝塞爾曲線階數(optional)

void setRate(int rate)

設置移動速率(optional)

void setTangent(boolean tangent)

設置是否顯示切線(optional)

void setLoop(boolean loop)

設置是否循環(optional)

void setOrder(int order)

設置貝塞爾曲線階數(optional)

最后通過BezierCurveActivity來展示。

貝塞爾曲線的應用1.QQ 消息提醒可拖拽紅點

Github 上的項目地址:qqmsgnotify

效果圖:

81f2f8967534afc90f8c7256a9e3b037.gif

主要是在繪制紅點的時候運用了貝塞爾曲線,在固定的位置中,拖拽的時候,有一種粘性的效果,就是這里運用了貝塞爾曲線。

51f17e66efa331db4b73615bef174949.png

運用:

(1) 在對應的位置創建一個 TextView

(2) 設置 GooViewListener 監聽事件就可以了

mTvPoint = (TextView) findViewById(R.id.point_conversation); mTvPoint.setText("10"); mTvPoint.setTag(10); GooViewListener listener = newGooViewListener(this, mTvPoint) {

@Overridepublic void onDisappear(PointF mDragCenter){

super.onDisappear(mDragCenter); Toast.makeText(QQMsgNotifyActivity.this, "消失了", Toast.LENGTH_SHORT).show(); } @Overridepublic void onReset(boolean isOutOfRange){

super.onReset(isOutOfRange); Toast.makeText(QQMsgNotifyActivity.this, "重置了", Toast.LENGTH_SHORT).show(); } }; mTvPoint.setOnTouchListener(listener);2.Viewpage頁面引導切換動畫

Github 上的項目地址:guideview

效果圖:

014876e132e448869e50e92f22f03104.gif

其實這個例子也是,運用貝塞爾曲線也就是在繪制那個圓形的地方而已,其他地方基本不怎么使用貝塞爾曲線。

大家都在看

歡迎大家到安卓巴士論壇博文》返回搜狐,查看更多

責任編輯:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/531861.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/531861.shtml
英文地址,請注明出處:http://en.pswp.cn/news/531861.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何保證對象的唯一性

/* 如何保證對象的唯一性:1.不允許其他程序用new來創建該類對象。2.在該類創建一個本類實例。3.對外提供一個方法讓其他程序可以獲取該對象的引用。 */ public class Test{public static void main(String[] args){//Subject sub Subject.oSub;//這種方法不可控&am…

ios kvo 要引入_騰訊社招iOS面試記錄

畢業好幾年了,上周發送了簡歷給騰訊,參加了騰訊面試。具體部門這邊就不說了。這次面試還是收獲到了很多。一面電話面試:面試官主要是針對iOS相關的基礎問題。先簡單自我介紹一下自己對mrc和arc的理解談談對自動釋放池的理解自動釋放池在mrc和…

動態設置html字號,動態設置html的font-size值 (適配文字大小)

PC端(function () {function setRootFontSize() {let rem, rootWidth;let rootHtml document.documentElement;//限制展現頁面的最小寬度rootWidth rootHtml.clientWidth < 1366 ? 1366 : rootHtml.clientWidth;// 19.2 設計圖尺寸寬 / 100( 設計圖的rem 100 )rem roo…

一個小例子對多態簡單的理解

class Parent{int age;String name;public Parent(String name, int age){this.name name;this.age age;}public void writeWay(){System.out.println("毛筆!");}}class Child extends Parent{int age;String name;//這里只說為了說明一個問題&#xff0c;其實完全…

運行shell腳本時怎么知道jdk路徑_Shell寫腳本關于ssh執行jar包,需要刷新JDK路徑的問題...

比如腳本中下面這一段ssh $i "java -jar /applog/$PROJECT/$APPNAME --server.port$SERVER_PORT >/dev/null 2>&1 &"免密登錄linux服務器&#xff0c;執行jar包&#xff0c;通過ssh執行java程序&#xff0c;涉及到一個找不到JDK路徑的問題&#xff0c;…

html 中加號的表示方法,CSS的+(加號)選擇器怎么用

在CSS中“”符號選擇器用于選擇緊跟在指定元素之后但不在特定元素內部的元素。下面本篇文章就來具體介紹一下&#xff0c;希望對大家有所幫助。“”符號選擇器在CSS中“”符號選擇器被稱為相鄰兄弟選擇器&#xff0c;用于選取在同一父元素下的&#xff0c;緊跟指定元素之后的另…

poj 1724ROADS(bfs和dfs做法)

1 /*2 dfs比較好想&#xff0c;就是測試數據的問題&#xff0c;導致在遍歷邊的時候要倒著遍歷才過&#xff01;3 */4 #include<iostream> 5 #include<cstdio>6 #include<cstring>7 #include<vector>8 #include<algorithm>9 #define Max 0x3f3f3f…

華為新系統 鴻蒙,旗艦CPU+鴻蒙OS!華為Mate家族重磅新品來襲

我們常說安卓平板的生態跟蘋果iPad有很大差距&#xff0c;不論是應用質量還是原生系統支持&#xff0c;蘋果都做的更好一些。可能也是因為這個原因&#xff0c;因此安卓平板&#xff0c;尤其是旗艦級別的平板至今除了三星之外&#xff0c;也就只有華為在做。作為安卓陣營兩大廠…

mysql中用來取余數的函數是_MySQL常用函數-單行處理函數-字符串處理函數(更新中...)...

本篇文章用到的數據庫表/* SQLyog Ultimate v12.09 (64 bit) MySQL - 5.7.23-log : Database - myemployees ********************************************************************* *//*!40101 SET NAMES utf8 */;/*!40101 SET SQL_MODE*/;/*!40014 SET OLD_UNIQUE_CHECKSUN…

HDU 1024Max Sum Plus Plus(最大m字段和)

/* 動態轉移方程&#xff1a;dp[i][j]max(dp[i-1]a[i], max(dp[t][j-1])a[i]) (j-1<t<i) 表示的是前i個數j個字段和的最大值是多少&#xff01; */ 1 #include<iostream> 2 #include<cstdio>3 #include<cstring>4 #define N 10000 5 using nam…

html盒子模型頁面居中,【靜態頁面架構】CSS之盒子模型

CSS架構盒子模型&#xff1b;以內容區(顯示文本和圖像)內邊距(內容區至邊距的距離)邊距(內容區的邊界)外邊距(元素的邊框之間的距離)1.邊距&#xff1b;border屬性&#xff1b;簡寫屬性用來設置邊距的上(top)右(right)下(bottom)左(left)。寬度&#xff0c;顏色和樣式div{width…

最強動畫制作人書包_聲優訪談丨戀與制作人動畫中配聲優訪談——夏磊

親愛的制作人們&#xff1a;距離戀與制作人動畫上線還有6天&#xff01;今天的中配聲優訪談嘉賓是在動畫中為許墨獻聲的夏磊老師~固定布局 工具條上設置固定寬高背景可以設置被包含可以完美對齊背景圖和文字以及制作自…

(單例設計模式中)懶漢式與餓漢式在多線程中的不同

/*目的&#xff1a;分析一下單例設計模式中&#xff0c;懶漢式與餓漢式在多線程中的不同&#xff01;開發時我們一般選擇餓漢式&#xff0c;因為它簡單明了&#xff0c;多線程中不會出現安全問題&#xff01;而餓漢式需要我們自己處理程序中存在的安全隱患&#xff0c;但是餓漢…

shiro修改html不生效,shiro中anon配置不生效

再配置shiro的時候&#xff0c;如下代碼要注意&#xff1a;1、下述代碼中必須是LinkedHashMap 而不能是HashMap。2、anon定義必須在authc之前否則anon定義不生效Beanpublic ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager){ShiroFilterFactor…

codesys com庫_CoDeSys官方系統庫在線下載,替換國內下載服務器教程

歡迎加入工控分享技術服務社區推薦閱讀Codesys學習資料大全Codesys控制器關于CANopen總線的詳細應用說明當你軟件報以下錯誤&#xff0c;你可以直接下載&#xff0c;如果下載不成功&#xff0c;可以換個網絡試一試&#xff0c;或者進行下面的操作。由于國內網絡問題&#xff0c…

centos7恢復mysql數據庫_MySQL數據庫升級遷移填坑記

原庫&#xff1a;*.*.101.73/74 系統環境: Suse 12.4MySQL: 5.7.29新庫&#xff1a;*.*.110.46/47系統環境&#xff1a;CentOS7.7 64位MySQL版本: 5.7.30[一、數據庫升級遷移場景]因業務側在*.*.101.73/74 mysql數據庫服務器上部署了java應用程序、HadoopHbase數據庫等大數據…

so把asp頁面生成靜態的html,23、asp系列課程--server.URLEncode方法和server.HTMLEncode方法...

作者&#xff1a;楊凡來自&#xff1a;楊凡博客地址&#xff1a;blog.sina.com.cn/aboutshisanserver.URLEncode方法和server.HTMLEncode方法可以對字符串進行編碼。我們一個一個的說。server.URLEncode可以對字符串進行URL編碼轉換&#xff0c;語法格式為&#xff1a;server.u…

poj 1905Expanding Rods

1 /*2 二分 幾何3 弧長L&#xff0c; 圓半徑R&#xff0c; 弧度 q&#xff0c; LR*q;4 二分&#xff1a; 弧度&#xff08;0~PI&#xff09; 或者 高度&#xff08;L/2~L&#xff09; 5 */6 #include<cstdio> 7 #include<iostream>8 #include<cmath>9…

java中同步嵌套引起的死鎖事例代碼

/*目的&#xff1a;自己寫一個由于同步嵌套引起的死鎖&#xff01;思路&#xff1a;多個線程在執行時&#xff0c;某一時刻&#xff0c;0-Thread綁定了LockA鎖&#xff0c;1-Thread綁定了LockB鎖&#xff01;當0-Thread要去綁定LockB鎖時 和 1-Thread要去綁定LockA鎖時都不能綁…

下列關于html5表單的多樣輸入方式,IT兄弟連 HTML5教程 HTML5表單 多樣的輸入類型1...

原標題&#xff1a;IT兄弟連 HTML5教程 HTML5表單 多樣的輸入類型1HTML5擁有多個新的表單輸入類型&#xff0c;這些新特性提供了更好的輸入控制和驗證。并不是所有的主瀏覽器都支持新的input類型&#xff0c;不過我們可以在所有的主瀏覽器中使用它們&#xff0c;即使不被支持&a…