1. 程式人生 > >android 開發 View _6_Canvas詳解

android 開發 View _6_Canvas詳解

安卓自定義View進階-Canvas之繪製圖形

在上一篇自定義View分類與流程中我們瞭解自定義View相關的基本知識,不過,這些東西依舊還是理論,並不能拿來(zhuang)用(B), 這一次我們就瞭解一些能(zhaung)用(B)的東西。

在本篇文章中,我們先了解Canvas的基本用法,最後用一個小示例來結束本次教程。

一.Canvas簡介

Canvas我們可以稱之為畫布,能夠在上面繪製各種東西,是安卓平臺2D圖形繪製的基礎,非常強大。

一般來說,比較基礎的東西有兩大特點:

  • 1.可操作性強:由於這些是構成上層的基礎,所以可操作性必然十分強大。
  • 2.比較難用:各種方法太過基礎,想要完美的將這些操作組合起來有一定難度。

不過不必擔心,本系列文章不僅會介紹到Canvas的操作方法,還會簡單介紹一些設計思路和技巧。

二.Canvas的常用操作速查表

操作型別相關API備註
繪製顏色drawColor, drawRGB, drawARGB使用單一顏色填充整個畫布
繪製基本形狀drawPoint, drawPoints, drawLine, drawLines, drawRect, drawRoundRect, drawOval, drawCircle, drawArc依次為 點、線、矩形、圓角矩形、橢圓、圓、圓弧
繪製圖片drawBitmap, drawPicture繪製點陣圖和圖片
繪製文字drawText, drawPosText, drawTextOnPath依次為 繪製文字、繪製文字時指定每個文字位置、根據路徑繪製文字
繪製路徑drawPath繪製路徑,繪製貝塞爾曲線時也需要用到該函式
頂點操作drawVertices, drawBitmapMesh通過對頂點操作可以使影象形變,drawVertices直接對畫布作用、 drawBitmapMesh只對繪製的Bitmap作用
畫布剪裁clipPath, clipRect設定畫布的顯示區域
畫布快照save, restore, saveLayerXxx, restoreToCount, getSaveCount依次為 儲存當前狀態、 回滾到上一次儲存的狀態、 儲存圖層狀態、 回滾到指定狀態、 獲取儲存次數
畫布變換translate, scale, rotate, skew依次為 位移、縮放、 旋轉、錯切
Matrix(矩陣)getMatrix, setMatrix, concat實際上畫布的位移,縮放等操作的都是影象矩陣Matrix, 只不過Matrix比較難以理解和使用,故封裝了一些常用的方法。

PS: Canvas常用方法在上面表格中已經全部列出了,當然還存在一些其他的方法未列出,具體可以參考官方文件 Canvas

三.Canvas詳解

本篇內容主要講解如何利用Canvas繪製基本圖形。

繪製顏色:

繪製顏色是填充整個畫布,常用於繪製底色。

canvas.drawColor(Color.BLUE); //繪製藍色

關於顏色的更多資料請參考基礎篇_顏色

建立畫筆:

要想繪製內容,首先需要先建立一個畫筆,如下:

// 1.建立一個畫筆
private Paint mPaint = new Paint();

// 2.初始化畫筆
privatevoidinitPaint(){
	mPaint.setColor(Color.BLACK);       //設定畫筆顏色
	mPaint.setStyle(Paint.Style.FILL);  //設定畫筆模式為填充
	mPaint.setStrokeWidth(10f);         //設定畫筆寬度為10px
}

// 3.在建構函式中初始化
publicSloopView(Contextcontext,AttributeSetattrs){
   super(context, attrs);
   initPaint();
}

在建立完畫筆之後,就可以在Canvas中繪製各種內容了。

繪製點:

可以繪製一個點,也可以繪製一組點,如下:

canvas.drawPoint(200, 200, mPaint);     //在座標(200,200)位置繪製一個點
canvas.drawPoints(new float[]{          //繪製一組點,座標位置由float陣列指定
      500,500,
      500,600,
      500,700
},mPaint);

關於座標原點預設在左上角,水平向右為x軸增大方向,豎直向下為y軸增大方向。

繪製直線:

繪製直線需要兩個點,初始點和結束點,同樣繪製直線也可以繪製一條或者繪製一組:

canvas.drawLine(300,300,500,600,mPaint);    // 在座標(300,300)(500,600)之間繪製一條直線
canvas.drawLines(new float[]{               // 繪製一組線 每四數字(兩個點的座標)確定一條線
    100,200,200,200,
    100,300,200,300
},mPaint);

繪製矩形:

確定確定一個矩形最少需要四個資料,就是對角線的兩個點的座標值,這裡一般採用左上角和右下角的兩個點的座標。

關於繪製矩形,Canvas提供了三種過載方法,第一種就是提供四個數值(矩形左上角和右下角兩個點的座標)來確定一個矩形進行繪製。 其餘兩種是先將矩形封裝為Rect或RectF(實際上仍然是用兩個座標點來確定的矩形),然後傳遞給Canvas繪製,如下:

// 第一種
canvas.drawRect(100,100,800,400,mPaint);

// 第二種
Rect rect = new Rect(100,100,800,400);
canvas.drawRect(rect,mPaint);

// 第三種
RectF rectF = new RectF(100,100,800,400);
canvas.drawRect(rectF,mPaint);

以上三種方法所繪製出來的結果是完全一樣的。

看到這裡,相信很多觀眾會產生一個疑問,為什麼會有Rect和RectF兩種?兩者有什麼區別嗎?

答案當然是存在區別的,兩者最大的區別就是精度不同,Rect是int(整形)的,而RectF是float(單精度浮點型)的。除了精度不同,兩種提供的方法也稍微存在差別,在這裡我們暫時無需關注,想了解更多參見官方文件 Rect 和 RectF

繪製圓角矩形:

繪製圓角矩形也提供了兩種過載方式,如下:

// 第一種
RectF rectF = new RectF(100,100,800,400);
canvas.drawRoundRect(rectF,30,30,mPaint);

// 第二種
canvas.drawRoundRect(100,100,800,400,30,30,mPaint);

上面兩種方法繪製效果也是一樣的,但鑑於第二種方法在API21的時候才新增上,所以我們一般使用的都是第一種。

下面簡單解析一下圓角矩形的幾個必要的引數的意思。

很明顯可以看出,第二種方法前四個引數和第一種方法的RectF作用是一樣的,都是為了確定一個矩形,最後一個引數Paint是畫筆,無需多說,與矩形相比,圓角矩形多出來了兩個引數rx 和 ry,這兩個引數是幹什麼的呢?

稍微分析一下,既然是圓角矩形,他的角肯定是圓弧(圓形的一部分),我們一般用什麼確定一個圓形呢?

答案是圓心 和 半徑,其中圓心用於確定位置,而半徑用於確定大小

由於矩形位置已經確定,所以其邊角位置也是確定的,那麼確定位置的引數就可以省略,只需要用半徑就能描述一個圓弧了。

但是,半徑只需要一個引數,但這裡怎麼會有兩個呢?

好吧,讓你發現了,這裡圓角矩形的角實際上不是一個正圓的圓弧,而是橢圓的圓弧,這裡的兩個引數實際上是橢圓的兩個半徑,他們看起來個如下圖:

紅線標註的 rx 與 ry 就是兩個半徑,也就是相比繪製矩形多出來的那兩個引數。

我們瞭解到原理後,就可以為所欲為了,通過計算可知我們上次繪製的矩形寬度為700,高度為300,當你讓 rx大於350(寬度的一半), ry大於150(高度的一半) 時奇蹟就出現了, 你會發現圓角矩形變成了一個橢圓, 他們畫出來是這樣的 ( 為了方便確認我更改了畫筆顏色, 同時繪製出了矩形和圓角矩形 ):

// 矩形
RectF rectF = new RectF(100,100,800,400);  

// 繪製背景矩形
mPaint.setColor(Color
            
           

相關推薦

android 開發 View _6_Canvas

安卓自定義View進階-Canvas之繪製圖形在上一篇自定義View分類與流程中我們瞭解自定義View相關的基本知識,不過,這些東西依舊還是理論,並不能拿來(zhuang)用(B), 這一次我們就瞭解一些能(zhaung)用(B)的東西。在本篇文章中,我們先了解Canvas的

Android開發之SharedPreferences

一、概述 利用SharedPreferences儲存資料是Android本地儲存資料的方式之一。SharedPreferences主要用於儲存基本型別的資料,例如int、long、string、Boo

ANDROID開發之SQLite

SQLite簡介 Google為Andriod的較大的資料處理提供了SQLite,他在資料儲存、管理、維護等各方面都相當出色,功能也非常的強大。SQLite具備下列特點: 1.輕量級 使用 SQLite 只需要帶一個動態庫,就可以享受它的全部功能

Android開發——DiskLruCache用法以及工作原理深度解析

     初探       相信所有人都知道,網易新聞中的資料都是從網路上獲取的,包括了很多的新聞內容和新聞圖片,如下圖所示:       但是不知道大家有沒有發現,這些內容和圖片在從網路上獲取到之後都會存入到本地快取中,因此即使手機在沒有網路的情況下依然能夠加載出以前瀏覽過的新聞。而使用的快取技術不

Android開發圖示尺寸

一、開發中的實際情況(促進理解):Android開發中一個很重要的組成,就是開發者和UI設計師的配合,這關乎到APP介面部分——吸引使用者的直接手段,那麼在實際開發中,開發者和設計師是如何配合的呢?第一步:產品經理和UI設計師制定好UI規範,然後開始做圖示做顏色做尺寸等一系列

Android開發儲存方式之SQLite使用例項

使用SQL語句完成SQLite資料庫的建立、插入和查詢:import android.app.Activity; import android.database.Cursor; import andr

Android開發——View動畫、幀動畫和屬性動畫

0. 前言Android動畫是面試的時候經常被問到的話題。我們都知道Android動畫分為三類:View動畫、幀動畫和屬性動畫。先對這三種動畫做一個概述:View動畫是一種漸進式動畫,定義動畫開始和結束

android 開發 View _14 MotionEvent和事件處理,與實踐自定義滑動條View

MotionEvent MotionEvent物件是與使用者觸控相關的時間序列,該序列從使用者首次觸控式螢幕幕開始,經歷手指在螢幕表面的任何移動,直到手指離開螢幕時結束。手指的初次觸控(ACTION_DOWN操作),滑動(ACTION_MOVE操作)和擡起(ACTION

Android View座標系(getTop()、getX、getTranslationX...)

View 提供瞭如下 5 種方法獲取 View 的座標: 1. View.getTop()、View.getLeft()、View.getBottom()、View.getRight();//相對父容器 2. View.getX()、View.getY();//getX()=

Android 註解開發 ButterKnife使用及教程

**俗話說:“不會偷懶的程式設計師不是好的程式設計師!”。作為一名Android開發,是不是經常厭煩了大量的findViewById以及setOnClickListener程式碼,而ButterKnife是一個專注於Android系統的View注入框架,讓你從此

View的事件體系之三 android事件分發機制(下)

  接著上一篇來分析事件分發機制,在看了各位大牛的關於事件分發機制的分析後茅塞頓開,之前看過好幾遍郭霖,弘揚以及玉剛大神關於事件體系的講解,一直看不懂,比較模糊,最近複習時,看到一篇博文,寫的相當精彩,看完後,再回看各位大神的博文,收穫頗豐,記錄一下自己的理解和

Android Studio開發jni例項 (呼叫C程式碼例項)

FATAL EXCEPTION: main Process: com.example.jni.jnitest, PID: 30152 java.lang.UnsatisfiedLinkError: com.android.tools.fd.runtime.IncrementalClassLoader$Dele

Android 動畫】View Animation(一)

安卓平臺目前提供了兩大類動畫,在Android 3.0之前,一大類是View Animation,包括Tween animation(補間動畫),Frame animation(幀動畫),在android3.0中又引入了一個新的動畫系統:property ani

Android獲取View的寬高與View.measure

在oncreate()中無論利用view.getWidth()或是view.getHeiht()還是view.getMeasuredHeight或view.getMeasuredWidth()來獲取view的寬和高,看似沒有問題,其實他們取得值是0,並不是你

android View(以及View的事件分發)(一)

 關於View,我會通過幾篇部落格來進行講解,通過查閱書籍幫助大家抽取常用的知識 1.1什麼是View? View是android中所有空間的基類, View是一種介面層空間的一種抽象,它代表了一個控制元件,除了View還有ViewGroup,內部 包涵了許多控制元件,

Android 應用開發】BluetoothDevice

一. BluetoothDevice簡介1. 繼承關係public static Class BluetoothDevice extends Object implement Parcelable該類實

Android View api -LocationInWindow,getLocationOnScreen,getGlobalVisibleRect,getLocalVisibleRect

概述 View 是很多控制元件的父類,因此掌握了 View api 有助於掌握其它控制元件。 掌握LocationInWindow,getLocationOnScreen,getGlobalVisibleRect,getLocalVisibleRect的關鍵

Android WebView Video完全(第一篇)-Android開發人員

背景 最近公司某項功能需要WebView載入H5的Video,搜尋很多資料後發現很多問題,都是關鍵程式碼片段,因為每個專案每個人產生的問題不同,Video在webview中載入不出來原因很多,可能是客戶端少了引數,也可能是前端出了問題,經

Android事件傳遞機制(巢狀自定義View示例)

一、概述   自定義View如果嵌套了自定義View,可能簡單寫一個onTouchEvent處理事件已經不能解決你的需要。簡單舉個例子: 你自定義了一個容器View,簡稱為父View,在這裡監聽點選事件,做事情A,監聽滑動做事情B 然後你又自定了一個View,放入該容器

百鳥商城系統開發模式設計

png 團隊 收入 出現 積分 完全 會員 .cn 更多 百鳥商城系統開發(李想.185.6504.8478)鳥類通常是帶羽、卵生的動物,有極高的新陳代謝速率,長骨多是中空的,所以大部分的鳥類都可以飛。鳥類由爬行動物進化而來,世界上現存的鳥類共有9000多種,它們都有翅膀和