日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

HenCoder Android 开发进阶: 自定义 View 1-1 绘制基础

發布時間:2023/12/10 Android 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HenCoder Android 开发进阶: 自定义 View 1-1 绘制基础 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

從今天開始,HenCoder 就正式開講知識技能了。按照我的計劃,第一季是 UI,UI 一共分為三部分:繪制、布局和觸摸反饋。本期是繪制部分的第一期。繪制大概會用 5~6 期的時間講完,整個 UI 的繪制、布局和觸摸反饋三部分大概會用十來期。更新頻率大約為每周一更(不承諾喲)。

如果你不知道 HenCoder 是什么,可以先看這里:

HenCoder:給高級 Android 工程師的進階手冊

自定義繪制概述

二話不說,我反手就是一個視頻:(視頻掛了,先直接點到優酷去看吧:優酷鏈接)

首先總結一下視頻中的關鍵點:

  • 自定義繪制的方式是重寫繪制方法,其中最常用的是 onDraw()
  • 繪制的關鍵是 Canvas 的使用
    • Canvas 的繪制類方法: drawXXX() (關鍵參數:Paint)
    • Canvas 的輔助類方法:范圍裁切和幾何變換
  • 可以使用不同的繪制方法來控制遮蓋關系

概念已經在視頻里全部講出來了,知識點并不多,但你可能也看出來了,我講得并不細。這是因為知識點雖然不多,但細節還是很多的,僅僅靠一節分享不可能講完。我按照順序把這些知識分成了 4 個級別,拆成幾節來講,你按照這 4 個級別的順序學習下來,就能夠平滑地逐步進階。

自定義繪制知識的四個級別

  • Canvas 的 drawXXX() 系列方法及 Paint 最常見的使用

    Canvas.drawXXX() 是自定義繪制最基本的操作。掌握了這些方法,你才知道怎么繪制內容,例如怎么畫圓、怎么畫方、怎么畫圖像和文字。組合繪制這些內容,再配合上 Paint 的一些常見方法來對繪制內容的顏色和風格進行簡單的配置,就能夠應付大部分的繪制需求了。

    今天這篇分享我要講的就是這些內容。也就是說,你在看完這篇文章并做完練習之后,上面這幾幅圖你就會繪制出來了。從今以后,你也很少再需要假裝一本正經地對設計師說「不行這個圖技術上實現不了」,也不用心驚膽戰得等待設計師的那句「那 iOS 怎么可以」了。

  • Paint 的完全攻略

    Paint 可以做的事,不只是設置顏色,也不只是我在視頻里講的實心空心、線條粗細、有沒有陰影,它可以做的風格設置真的是非常多、非常細。例如:

    拐角要什么形狀?

    開不開雙線性過濾?

    加不加特效?

  • 可以調節的非常多,我就不一一列舉了。當你掌握到這個級別,就真的不會有什么東西會是 iOS 能做到但你做不到的了。就算設計師再設計出了很難做的東西,做不出來的也不再會是你們 Android 組了。

  • Canvas 對繪制的輔助——范圍裁切和幾何變換。

    范圍裁切:

    幾何變換:

    大多數時候,它們并不會被用到,但一旦用到,通常都是很炫酷的效果。范圍裁切和幾何變換都是用于輔助的,它們本身并不酷,讓它們變酷的是設計師們的想象力與創造力。而你要做的,是把他們的想象力與創造力變成現實。

  • 使用不同的繪制方法來控制繪制順序

    控制繪制順序解決的并不是「做不到」的問題,而是性能問題。同樣的一種效果,你不用繪制順序的控制往往也能做到,但需要用多個 View 甚至是多層 View 才能拼湊出來,因此代價是 UI 的性能;而使用繪制順序的控制的話,一個 View 就全部搞定了。

  • 自定義繪制的知識,大概就分為上面這四個級別。在你把這四個級別依次掌握了之后,你就是一個自定義繪制的高手了。它們具體的細節,我將分成幾篇來講。今天這篇就是第一篇: Canvas.drawXXX() 系列方法及 Paint 最基本的使用。我要正式開始嘍?

    一切的開始:onDraw()

    自定義繪制的上手非常容易:提前創建好 Paint 對象,重寫 onDraw(),把繪制代碼寫在 onDraw() 里面,就是自定義繪制最基本的實現。大概就像這樣:

    Paint paint = new Paint();@Override protected void onDraw(Canvas canvas) {super.onDraw(canvas);// 繪制一個圓canvas.drawCircle(300, 300, 200, paint); }復制代碼

    就這么簡單。所以關于 onDraw() 其實沒什么好說的,一個很普通的方法重寫,唯一需要注意的是別漏寫了 super.onDraw()。

    Canvas.drawXXX() 和 Paint 基礎

    drawXXX() 系列方法和 Paint 的基礎掌握了,就能夠應付簡單的繪制需求。它們主要包括:

  • Canvas 類下的所有 draw- 打頭的方法,例如 drawCircle() drawBitmap()。
  • Paint 類的幾個最常用的方法。具體是:
    • Paint.setStyle(Style style) 設置繪制模式
    • Paint.setColor(int color) 設置顏色
    • Paint.setStrokeWidth(float width) 設置線條寬度
    • Paint.setTextSize(float textSize) 設置文字大小
    • Paint.setAntiAlias(boolean aa) 設置抗鋸齒開關
  • 對于比較習慣于自學的人(我就是這樣的人),你看到這里就已經可以去 Google 的官方文檔里,打開 Canvas 和 Paint 的頁面,把上面的這兩類方法學習一下,然后今天的內容就算結束了。當然,這篇文章也可以關掉了。

    下面的內容就是展開講解上面的這兩類方法。

    Canvas.drawColor(@ColorInt int color) 顏色填充

    這是最基本的 drawXXX() 方法:在整個繪制區域統一涂上指定的顏色。

    例如 drawColor(Color.BLACK) 會把整個區域染成純黑色,覆蓋掉原有內容; drawColor(Color.parse("#88880000") 會在原有的繪制效果上加一層半透明的紅色遮罩。

    drawColor(Color.BLACK); // 純黑復制代碼

    drawColor(Color.parse("#88880000"); // 半透明紅色復制代碼

    類似的方法還有 drawRGB(int r, int g, int b) 和 drawARGB(int a, int r, int g, int b) ,它們和 drawColor(color) 只是使用方式不同,作用都是一樣的。

    canvas.drawRGB(100, 200, 100); canvas.drawARGB(100, 100, 200, 100);復制代碼

    這類顏色填充方法一般用于在繪制之前設置底色,或者在繪制之后為界面設置半透明蒙版。

    drawCircle(float centerX, float centerY, float radius, Paint paint) 畫圓

    前兩個參數 centerX centerY 是圓心的坐標,第三個參數 radius 是圓的半徑,單位都是像素,它們共同構成了這個圓的基本信息(即用這幾個信息可以構建出一個確定的圓);第四個參數 paint 我在視頻里面已經說過了,它提供基本信息之外的所有風格信息,例如顏色、線條粗細、陰影等。

    canvas.drawCircle(300, 300, 200, paint);復制代碼

    那位說:「你等會兒!先別往后講,你剛才說圓心的坐標,我想問坐標系在哪兒呢?沒坐標系你跟我聊什么坐標啊。」

    我想說:問得好(強行插入劇情)。在 Android 里,每個 View 都有一個自己的坐標系,彼此之間是不影響的。這個坐標系的原點是 View 左上角的那個點;水平方向是 x 軸,右正左負;豎直方向是 y 軸,下正上負(注意,是下正上負,不是上正下負,和上學時候學的坐標系方向不一樣)。也就是下面這個樣子。

    所以一個 View 的坐標 (x, y) 處,指的就是相對它的左上角那個點的水平方向 x 像素、豎直方向 y 像素的點。例如,(300, 300) 指的就是左上角的點向右 300 、向下 300 的位置; (100, -50) 指的就是左上角的點向右 100 、向上 50 的位置。

    也就是說, canvas.drawCircle(300, 300, 200, paint) 這行代碼繪制出的圓,在 View 中的位置和尺寸應該是這樣的:

    圓心坐標和半徑,這些都是圓的基本信息,也是它的獨有信息。什么叫獨有信息?就是只有它有,別人沒有的信息。你畫圓有圓心坐標和半徑,畫方有嗎?畫橢圓有嗎?這就叫獨有信息。獨有信息都是直接作為參數寫進 drawXXX() 方法里的(比如 drawCircle(centerX, centerY, radius, paint) 的前三個參數)。

    而除此之外,其他的都是公有信息。比如圖形的顏色、空心實心這些,你不管是畫圓還是畫方都有可能用到的,這些信息則是統一放在 paint 參數里的。

    插播一: Paint.setColor(int color)

    例如,你要畫一個紅色的圓,并不是寫成 canvas.drawCircle(300, 300, 200, RED, paint) 這樣,而是像下面這樣:

    paint.setColor(Color.RED); // 設置為紅色 canvas.drawCircle(300, 300, 200, paint);復制代碼

    Paint.setColor(int color) 是 Paint 最常用的方法之一,用來設置繪制內容的顏色。你不止可以用它畫紅色的圓,也可以用它來畫紅色的矩形、紅色的五角星、紅色的文字。

    插播二: Paint.setStyle(Paint.Style style)

    而如果你想畫的不是實心圓,而是空心圓(或者叫環形),也可以使用 paint.setStyle(Paint.Style.STROKE) 來把繪制模式改為畫線模式。

    paint.setStyle(Paint.Style.STROKE); // Style 修改為畫線模式 canvas.drawCircle(300, 300, 200, paint);復制代碼

    setStyle(Style style) 這個方法設置的是繪制的 Style 。Style 具體來說有三種: FILL, STROKE 和 FILL_AND_STROKE 。FILL 是填充模式,STROKE 是畫線模式(即勾邊模式),FILL_AND_STROKE 是兩種模式一并使用:既畫線又填充。它的默認值是 FILL,填充模式。

    插播三: Paint.setStrokeWidth(float width)

    在 STROKE 和 FILL_AND_STROKE 下,還可以使用 paint.setStrokeWidth(float width) 來設置線條的寬度:

    paint.setStyle(Paint.Style.STROKE); paint.setStrokeWidth(20); // 線條寬度為 20 像素 canvas.drawCircle(300, 300, 200, paint);復制代碼

    插播四: 抗鋸齒

    在繪制的時候,往往需要開啟抗鋸齒來讓圖形和文字的邊緣更加平滑。開啟抗鋸齒很簡單,只要在 new Paint() 的時候加上一個 ANTI_ALIAS_FLAG 參數就行:

    Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);復制代碼

    另外,你也可以使用 Paint.setAntiAlias(boolean aa) 來動態開關抗鋸齒。

    抗鋸齒的效果如下:

    可以看出,沒有開啟抗鋸齒的時候,圖形會有毛片現象,啊不,毛邊現象。所以一定記得要打開抗鋸齒喲!

    可以跳過的冷知識

    好奇的人可能會問:抗鋸齒既然這么有用,為什么不默認開啟,或者干脆把這個開關取消,自動讓所有繪制都開啟抗鋸齒?

    短答案:因為抗鋸齒并不一定適合所有場景。

    長答案:所謂的毛邊或者鋸齒,發生的原因并不是很多人所想象的「繪制太粗糙」「像素計算能力不足」;同樣,抗鋸齒的原理也并不是選擇了更精細的算法來算出了更平滑的圖形邊緣。
    實質上,鋸齒現象的發生,只是由于圖形分辨率過低,導致人眼察覺出了畫面中的像素顆粒而已。換句話說,就算不開啟抗鋸齒,圖形的邊緣也已經是最完美的了,而并不是一個粗略計算的粗糙版本。
    那么,為什么抗鋸齒開啟之后的圖形邊緣會更加平滑呢?因為抗鋸齒的原理是:修改圖形邊緣處的像素顏色,從而讓圖形在肉眼看來具有更加平滑的感覺。一圖勝千言,上圖:


    上面這個是把前面那兩個圓放大后的局部效果。看到沒有?未開啟抗鋸齒的圓,所有像素都是同樣的黑色,而開啟了抗鋸齒的圓,邊緣的顏色被略微改變了。這種改變可以讓人眼有邊緣平滑的感覺,但從某種角度講,它也造成了圖形的顏色失真。
    所以,抗鋸齒好不好?好,大多數情況下它都應該是開啟的;但在極少數的某些時候,你還真的需要把它關閉。「某些時候」是什么時候?到你用到的時候自然就知道了。

    除了圓,Canvas 還可以繪制一些別的簡單圖形。它們的使用方法和 drawCircle() 大同小異,我就只對它們的 API 做簡單的介紹,不再做詳細的講解。

    drawRect(float left, float top, float right, float bottom, Paint paint) 畫矩形

    left, top, right, bottom 是矩形四條邊的坐標。

    paint.setStyle(Style.FILL); canvas.drawRect(100, 100, 500, 500, paint);paint.setStyle(Style.STROKE); canvas.drawRect(700, 100, 1100, 500, paint);復制代碼

    另外,它還有兩個重載方法 drawRect(RectF rect, Paint paint) 和 drawRect(Rect rect, Paint paint) ,讓你可以直接填寫 RectF 或 Rect 對象來繪制矩形。

    drawPoint(float x, float y, Paint paint) 畫點

    x 和 y 是點的坐標。點的大小可以通過 paint.setStrokeWidth(width) 來設置;點的形狀可以通過 paint.setStrokeCap(cap) 來設置:ROUND 畫出來是圓形的點,SQUARE 或 BUTT 畫出來是方形的點。(點還有形狀?是的,反正 Google 是這么說的,你要問問 Google 去,我也很懵逼。)

    注:Paint.setStrokeCap(cap) 可以設置點的形狀,但這個方法并不是專門用來設置點的形狀的,而是一個設置線條端點形狀的方法。端點有圓頭 (ROUND)、平頭 (BUTT) 和方頭 (SQUARE) 三種,具體會在下一節里面講。

    paint.setStrokeWidth(20); paint.setStrokeCap(Paint.Cap.ROUND); canvas.drawPoint(50, 50, paint);復制代碼

    paint.setStrokeWidth(20); paint.setStrokeCap(Paint.Cap.SQUARE; canvas.drawPoint(50, 50, paint);復制代碼

    好像有點像 FILL 模式下的 drawCircle() 和 drawRect() ?事實上確實是這樣的,它們和 drawPoint() 的繪制效果沒有區別。各位在使用的時候按個人習慣和實際場景來吧,哪個方便和順手用哪個。

    drawPoints(float[] pts, int offset, int count, Paint paint) / drawPoints(float[] pts, Paint paint) 畫點(批量)

    同樣是畫點,它和 drawPoint() 的區別是可以畫多個點。pts 這個數組是點的坐標,每兩個成一對;offset 表示跳過數組的前幾個數再開始記坐標;count 表示一共要繪制幾個點。說這么多你可能越讀越暈,你還是自己試試吧,這是個看著復雜用著簡單的方法。

    float[] points = {0, 0, 50, 50, 50, 100, 100, 50, 100, 100, 150, 50, 150, 100}; // 繪制四個點:(50, 50) (50, 100) (100, 50) (100, 100) canvas.drawPoints(points, 2 /* 跳過兩個數,即前兩個 0 */,8 /* 一共繪制 8 個數(4 個點)*/, paint);復制代碼

    drawOval(float left, float top, float right, float bottom, Paint paint) 畫橢圓

    只能繪制橫著的或者豎著的橢圓,不能繪制斜的(斜的倒是也可以,但不是直接使用 drawOval(),而是配合幾何變換,后面會講到)。left, top, right, bottom 是這個橢圓的左、上、右、下四個邊界點的坐標。

    paint.setStyle(Style.FILL); canvas.drawOval(50, 50, 350, 200, paint);paint.setStyle(Style.STROKE); canvas.drawOval(400, 50, 700, 200, paint);復制代碼

    另外,它還有一個重載方法 drawOval(RectF rect, Paint paint),讓你可以直接填寫 RectF 來繪制橢圓。

    drawLine(float startX, float startY, float stopX, float stopY, Paint paint) 畫線

    startX, startY, stopX, stopY 分別是線的起點和終點坐標。

    canvas.drawLine(200, 200, 800, 500, paint);復制代碼

    由于直線不是封閉圖形,所以 setStyle(style) 對直線沒有影響。

    drawLines(float[] pts, int offset, int count, Paint paint) / drawLines(float[] pts, Paint paint) 畫線(批量)

    drawLines() 是 drawLine() 的復數版。

    float[] points = {20, 20, 120, 20, 70, 20, 70, 120, 20, 120, 120, 120, 150, 20, 250, 20, 150, 20, 150, 120, 250, 20, 250, 120, 150, 120, 250, 120}; canvas.drawLines(points, paint);復制代碼

    咦,不小心打出兩個漢字。——是漢字吧?

    drawRoundRect(float left, float top, float right, float bottom, float rx, float ry, Paint paint) 畫圓角矩形

    left, top, right, bottom 是四條邊的坐標,rx 和 ry 是圓角的橫向半徑和縱向半徑。

    canvas.drawRoundRect(100, 100, 500, 300, 50, 50, paint);復制代碼

    另外,它還有一個重載方法 drawRoundRect(RectF rect, float rx, float ry, Paint paint),讓你可以直接填寫 RectF 來繪制圓角矩形。

    drawArc(float left, float top, float right, float bottom, float startAngle, float sweepAngle, boolean useCenter, Paint paint) 繪制弧形或扇形

    drawArc() 是使用一個橢圓來描述弧形的。left, top, right, bottom 描述的是這個弧形所在的橢圓;startAngle 是弧形的起始角度(x 軸的正向,即正右的方向,是 0 度的位置;順時針為正角度,逆時針為負角度),sweepAngle 是弧形劃過的角度;useCenter 表示是否連接到圓心,如果不連接到圓心,就是弧形,如果連接到圓心,就是扇形。

    paint.setStyle(Paint.Style.FILL); // 填充模式 canvas.drawArc(200, 100, 800, 500, -110, 100, true, paint); // 繪制扇形 canvas.drawArc(200, 100, 800, 500, 20, 140, false, paint); // 繪制弧形 paint.setStyle(Paint.Style.STROKE); // 畫線模式 canvas.drawArc(200, 100, 800, 500, 180, 60, false, paint); // 繪制不封口的弧形復制代碼

    到此為止,以上就是 Canvas 所有的簡單圖形的繪制。除了簡單圖形的繪制, Canvas 還可以使用 drawPath(Path path) 來繪制自定義圖形。

    drawPath(Path path, Paint paint) 畫自定義圖形

    這個方法有點復雜,需要展開說一下。

    前面的這些方法,都是繪制某個給定的圖形,而 drawPath() 可以繪制自定義圖形。當你要繪制的圖形比較特殊,使用前面的那些方法做不到的時候,就可以使用 drawPath() 來繪制。

    drawPath(path) 這個方法是通過描述路徑的方式來繪制圖形的,它的 path 參數就是用來描述圖形路徑的對象。path 的類型是 Path ,使用方法大概像下面這樣:

    public class PathView extends View {Paint paint = new Paint();Path path = new Path(); // 初始化 Path 對象......{// 使用 path 對圖形進行描述(這段描述代碼不必看懂)path.addArc(200, 200, 400, 400, -225, 225);path.arcTo(400, 200, 600, 400, -180, 225, false);path.lineTo(400, 542);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);canvas.drawPath(path, paint); // 繪制出 path 描述的圖形(心形),大功告成} }復制代碼

    Path 可以描述直線、二次曲線、三次曲線、圓、橢圓、弧形、矩形、圓角矩形。把這些圖形結合起來,就可以描述出很多復雜的圖形。下面我就說一下具體的怎么把這些圖形描述出來。

    Path 有兩類方法,一類是直接描述路徑的,另一類是輔助的設置或計算。

    Path 方法第一類:直接描述路徑。

    這一類方法還可以細分為兩組:添加子圖形和畫線(直線或曲線)

    第一組: addXxx() ——添加子圖形
    addCircle(float x, float y, float radius, Direction dir) 添加圓

    x, y, radius 這三個參數是圓的基本信息,最后一個參數 dir 是畫圓的路徑的方向。

    路徑方向有兩種:順時針 (CW clockwise) 和逆時針 (CCW counter-clockwise) 。對于普通情況,這個參數填 CW 還是填 CCW 沒有影響。它只是在需要填充圖形 (Paint.Style 為 FILL 或 FILL_AND_STROKE) ,并且圖形出現自相交時,用于判斷填充范圍的。比如下面這個圖形:

    是應該填充成這樣呢:

    還是應該填充成這樣呢:

    想用哪種方式來填充,都可以由你來決定。具體怎么做,下面在講 Path.setFillType() 的時候我會詳細介紹,而在這里你可以先忽略 dir 這個參數。

    在用 addCircle() 為 Path 中新增一個圓之后,調用 canvas.drawPath(path, paint) ,就能畫一個圓出來。就像這樣:

    path.addCircle(300, 300, 200, Path.Direction.CW);...canvas.drawPath(path, paint);復制代碼

    可以看出,path.AddCircle(x, y, radius, dir) + canvas.drawPath(path, paint) 這種寫法,和直接使用 canvas.drawCircle(x, y, radius, paint) 的效果是一樣的,區別只是它的寫法更復雜。所以如果只畫一個圓,沒必要用 Path,直接用 drawCircle() 就行了。drawPath() 一般是在繪制組合圖形時才會用到的。

    其他的 Path.add-() 方法和這類似,例如:

    addOval(float left, float top, float right, float bottom, Direction dir) / addOval(RectF oval, Direction dir) 添加橢圓
    addRect(float left, float top, float right, float bottom, Direction dir) / addRect(RectF rect, Direction dir) 添加矩形
    addRoundRect(RectF rect, float rx, float ry, Direction dir) / addRoundRect(float left, float top, float right, float bottom, float rx, float ry, Direction dir) / addRoundRect(RectF rect, float[] radii, Direction dir) / addRoundRect(float left, float top, float right, float bottom, float[] radii, Direction dir) 添加圓角矩形
    addPath(Path path) 添加另一個 Path

    上面這幾個方法和 addCircle() 的使用都差不多,不再做過多介紹。

    第二組:xxxTo() ——畫線(直線或曲線)

    這一組和第一組 addXxx() 方法的區別在于,第一組是添加的完整封閉圖形(除了 addPath() ),而這一組添加的只是一條線。

    lineTo(float x, float y) / rLineTo(float x, float y) 畫直線

    當前位置向目標位置畫一條直線, x 和 y 是目標位置的坐標。這兩個方法的區別是,lineTo(x, y) 的參數是絕對坐標,而 rLineTo(x, y) 的參數是相對當前位置的相對坐標 (前綴 r 指的就是 relatively 「相對地」)。

    當前位置:所謂當前位置,即最后一次調用畫 Path 的方法的終點位置。初始值為原點 (0, 0)。

    paint.setStyle(Style.STROKE); path.lineTo(100, 100); // 由當前位置 (0, 0) 向 (100, 100) 畫一條直線 path.rLineTo(100, 0); // 由當前位置 (100, 100) 向正右方 100 像素的位置畫一條直線復制代碼

    quadTo(float x1, float y1, float x2, float y2) / rQuadTo(float dx1, float dy1, float dx2, float dy2) 畫二次貝塞爾曲線

    這條二次貝塞爾曲線的起點就是當前位置,而參數中的 x1, y1 和 x2, y2 則分別是控制點和終點的坐標。和 rLineTo(x, y) 同理,rQuadTo(dx1, dy1, dx2, dy2) 的參數也是相對坐標

    貝塞爾曲線:貝塞爾曲線是幾何上的一種曲線。它通過起點、控制點和終點來描述一條曲線,主要用于計算機圖形學。概念總是說著容易聽著難,總之使用它可以繪制很多圓潤又好看的圖形,但要把它熟練掌握、靈活使用卻是不容易的。不過還好的是,一般情況下,貝塞爾曲線并沒有什么用處,只在少數場景下繪制一些特殊圖形的時候才會用到,所以如果你還沒掌握自定義繪制,可以先把貝塞爾曲線放一放,稍后再學也完全沒問題。至于怎么學,貝塞爾曲線的知識網上一搜一大把,我這里就不講了。

    cubicTo(float x1, float y1, float x2, float y2, float x3, float y3) / rCubicTo(float x1, float y1, float x2, float y2, float x3, float y3) 畫三次貝塞爾曲線

    和上面這個 quadTo() rQuadTo() 的二次貝塞爾曲線同理,cubicTo() 和 rCubicTo() 是三次貝塞爾曲線,不再解釋。

    moveTo(float x, float y) / rMoveTo(float x, float y) 移動到目標位置

    不論是直線還是貝塞爾曲線,都是以當前位置作為起點,而不能指定起點。但你可以通過 moveTo(x, y) 或 rMoveTo() 來改變當前位置,從而間接地設置這些方法的起點。

    paint.setStyle(Style.STROKE); path.lineTo(100, 100); // 畫斜線 path.moveTo(200, 100); // 我移~~ path.lineTo(200, 0); // 畫豎線復制代碼

    moveTo(x, y) 雖然不添加圖形,但它會設置圖形的起點,所以它是非常重要的一個輔助方法。

    另外,第二組還有兩個特殊的方法: arcTo() 和 addArc()。它們也是用來畫線的,但并不使用當前位置作為弧線的起點。

    arcTo(RectF oval, float startAngle, float sweepAngle, boolean forceMoveTo) / arcTo(float left, float top, float right, float bottom, float startAngle, float sweepAngle, boolean forceMoveTo) / arcTo(RectF oval, float startAngle, float sweepAngle) 畫弧形

    這個方法和 Canvas.drawArc() 比起來,少了一個參數 useCenter,而多了一個參數 forceMoveTo 。

    少了 useCenter ,是因為 arcTo() 只用來畫弧形而不畫扇形,所以不再需要 useCenter 參數;而多出來的這個 forceMoveTo 參數的意思是,繪制是要「抬一下筆移動過去」,還是「直接拖著筆過去」,區別在于是否留下移動的痕跡。

    paint.setStyle(Style.STROKE); path.lineTo(100, 100); path.arcTo(100, 100, 300, 300, -90, 90, true); // 強制移動到弧形起點(無痕跡)復制代碼

    paint.setStyle(Style.STROKE); path.lineTo(100, 100); path.arcTo(100, 100, 300, 300, -90, 90, false); // 直接連線連到弧形起點(有痕跡)復制代碼

    addArc(float left, float top, float right, float bottom, float startAngle, float sweepAngle) / addArc(RectF oval, float startAngle, float sweepAngle)

    又是一個弧形的方法。一個叫 arcTo ,一個叫 addArc(),都是弧形,區別在哪里?其實很簡單: addArc() 只是一個直接使用了 forceMoveTo = true 的簡化版 arcTo() 。

    paint.setStyle(Style.STROKE); path.lineTo(100, 100); path.addArc(100, 100, 300, 300, -90, 90);復制代碼

    close() 封閉當前子圖形

    它的作用是把當前的子圖形封閉,即由當前位置向當前子圖形的起點繪制一條直線。

    paint.setStyle(Style.STROKE); path.moveTo(100, 100); path.lineTo(200, 100); path.lineTo(150, 150); // 子圖形未封閉復制代碼

    paint.setStyle(Style.STROKE); path.moveTo(100, 100); path.lineTo(200, 100); path.lineTo(150, 150); path.close(); // 使用 close() 封閉子圖形。等價于 path.lineTo(100, 100)復制代碼

    close() 和 lineTo(起點坐標) 是完全等價的。

    「子圖形」:官方文檔里叫做 contour 。但由于在這個場景下我找不到這個詞合適的中文翻譯(直譯的話叫做「輪廓」),所以我換了個便于中國人理解的詞:「子圖形」。前面說到,第一組方法是「添加子圖形」,所謂「子圖形」,指的就是一次不間斷的連線。一個 Path 可以包含多個子圖形。當使用第一組方法,即 addCircle() addRect() 等方法的時候,每一次方法調用都是新增了一個獨立的子圖形;而如果使用第二組方法,即 lineTo() arcTo() 等方法的時候,則是每一次斷線(即每一次「抬筆」),都標志著一個子圖形的結束,以及一個新的子圖形的開始。

    另外,不是所有的子圖形都需要使用 close() 來封閉。當需要填充圖形時(即 Paint.Style 為 FILL 或 FILL_AND_STROKE),Path 會自動封閉子圖形。

    paint.setStyle(Style.FILL); path.moveTo(100, 100); path.lineTo(200, 100); path.lineTo(150, 150); // 這里只繪制了兩條邊,但由于 Style 是 FILL ,所以繪制時會自動封口復制代碼

    以上就是 Path 的第一類方法:直接描述路徑的。

    Path 方法第二類:輔助的設置或計算

    這類方法的使用場景比較少,我在這里就不多講了,只講其中一個方法: setFillType(FillType fillType)。

    Path.setFillType(Path.FillType ft) 設置填充方式

    前面在說 dir 參數的時候提到, Path.setFillType(fillType) 是用來設置圖形自相交時的填充算法的:

    方法中填入不同的 FillType 值,就會有不同的填充效果。FillType 的取值有四個:

    • EVEN_ODD
    • WINDING (默認值)
    • INVERSE_EVEN_ODD
    • INVERSE_WINDING

    其中后面的兩個帶有 INVERSE_ 前綴的,只是前兩個的反色版本,所以只要把前兩個,即 EVEN_ODD 和 WINDING,搞明白就可以了。

    EVEN_ODD 和 WINDING 的原理有點復雜,直接講出來的話信息量太大,所以我先給一個簡單粗暴版的總結,你感受一下: WINDING 是「全填充」,而 EVEN_ODD 是「交叉填充」:

    之所以叫「簡單粗暴版」,是因為這些只是通常情形下的效果;而如果要準確了解它們在所有情況下的效果,就得先知道它們的原理,即它們的具體算法。

    EVEN_ODD 和 WINDING 的原理

    EVEN_ODD

    即 even-odd rule (奇偶原則):對于平面中的任意一點,向任意方向射出一條射線,這條射線和圖形相交的次數(相交才算,相切不算哦)如果是奇數,則這個點被認為在圖形內部,是要被涂色的區域;如果是偶數,則這個點被認為在圖形外部,是不被涂色的區域。還以左右相交的雙圓為例:

    射線的方向無所謂,同一個點射向任何方向的射線,結果都是一樣的,不信你可以試試。

    從上圖可以看出,射線每穿過圖形中的一條線,內外狀態就發生一次切換,這就是為什么 EVEN_ODD 是一個「交叉填充」的模式。

    WINDING

    即 non-zero winding rule (非零環繞數原則):首先,它需要你圖形中的所有線條都是有繪制方向的:

    然后,同樣是從平面中的點向任意方向射出一條射線,但計算規則不一樣:以 0 為初始值,對于射線和圖形的所有交點,遇到每個順時針的交點(圖形從射線的左邊向右穿過)把結果加 1,遇到每個逆時針的交點(圖形從射線的右邊向左穿過)把結果減 1,最終把所有的交點都算上,得到的結果如果不是 0,則認為這個點在圖形內部,是要被涂色的區域;如果是 0,則認為這個點在圖形外部,是不被涂色的區域。

    和 EVEN_ODD 相同,射線的方向并不影響結果。

    所以,我前面的那個「簡單粗暴」的總結,對于 WINDING 來說并不完全正確:如果你所有的圖形都用相同的方向來繪制,那么 WINDING 確實是一個「全填充」的規則;但如果使用不同的方向來繪制圖形,結果就不一樣了。

    圖形的方向:對于添加子圖形類方法(如 Path.addCircle() Path.addRect())的方向,由方法的 dir 參數來控制,這個在前面已經講過了;而對于畫線類的方法(如 Path.lineTo() Path.arcTo())就更簡單了,線的方向就是圖形的方向。

    所以,完整版的 EVEN_ODD 和 WINDING 的效果應該是這樣的:

    而 INVERSE_EVEN_ODD 和 INVERSE_WINDING ,只是把這兩種效果進行反轉而已,你懂了 EVEN_ODD 和 WINDING ,自然也就懂 INVERSE_EVEN_ODD 和 INVERSE_WINDING 了,我就不講了。

    好,花了好長的篇幅來講 drawPath(path) 和 Path,終于講完了。同時, Canvas 對圖形的繪制就也講完了。圖形簡單時,使用 drawCircle() drawRect() 等方法來直接繪制;圖形復雜時,使用 drawPath() 來繪制自定義圖形。

    除此之外, Canvas 還可以繪制 Bitmap 和文字。

    drawBitmap(Bitmap bitmap, float left, float top, Paint paint) 畫 Bitmap

    繪制 Bitmap 對象,也就是把這個 Bitmap 中的像素內容貼過來。其中 left 和 top 是要把 bitmap 繪制到的位置坐標。它的使用非常簡單。

    drawBitmap(bitmap, 200, 100, paint);復制代碼

    它的重載方法:

    drawBitmap(Bitmap bitmap, Rect src, RectF dst, Paint paint) /
    drawBitmap(Bitmap bitmap, Rect src, Rect dst, Paint paint) /
    drawBitmap(Bitmap bitmap, Matrix matrix, Paint paint)

    drawBitmap 還有一個兄弟方法 drawBitmapMesh(),可以繪制具有網格拉伸效果的 Bitmap。 drawBitmapMesh() 的使用場景較少,所以不講了,如果有興趣你可以自己研究一下。

    drawText(String text, float x, float y, Paint paint) 繪制文字

    界面里所有的顯示內容,都是繪制出來的,包括文字。 drawText() 這個方法就是用來繪制文字的。參數 text 是用來繪制的字符串,x 和 y 是繪制的起點坐標。

    canvas.drawText(text, 200, 100, paint);復制代碼

    插播五: Paint.setTextSize(float textSize)

    通過 Paint.setTextSize(textSize),可以設置文字的大小。

    paint.setTextSize(18); canvas.drawText(text, 100, 25, paint); paint.setTextSize(36); canvas.drawText(text, 100, 70, paint); paint.setTextSize(60); canvas.drawText(text, 100, 145, paint); paint.setTextSize(84); canvas.drawText(text, 100, 240, paint);復制代碼

    設置文字的位置和尺寸,這些只是繪制文字最基本的操作。文字的繪制具有極高的定制性,不過由于它的定制性實在太高了,所以我會在后面專門用一期來講文字的繪制。這一期就不多講了。

    嗯……就這樣吧。繪制部分第一節, Canvas 的 drawXXX() 系列方法和 Paint 的基本使用,就到這里。

    練習項目

    為了避免轉頭就忘,強烈建議你趁熱打鐵,做一下這個練習項目:HenCoderPracticeDraw1

    下期預告

    下期是 Paint 的全面介紹,內容會比這期難,但也會更有趣,各位做好準備吧。最后再貼一次下節內容的部分圖片作為預告:

    感謝

    感謝參與這期預發布內測的讀者:

    jiahuaAndroid、huajinyuan、quhuainan、Van Gogh、停停走走、JK森、街 景、Tiger、意琦行_、MadisonRong、AaronYi、czwathou、別對生活說抱歉、hml、四葉花

    贊賞

    你給不給我錢,我都會認真做、全心做。所以給錢之前請慎重考慮,確定你是要贊賞,而不是購買服務。

    總結

    以上是生活随笔為你收集整理的HenCoder Android 开发进阶: 自定义 View 1-1 绘制基础的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    www.久久成人| 久久久国产网站 | 不卡国产在线 | 91片在线观看 | 97av视频在线观看 | 免费在线观看不卡av | 伊人热| 色插综合 | 久久免费一级片 | 国产色影院 | 在线天堂中文在线资源网 | www.少妇| 在线岛国av | 很黄很色很污的网站 | 日韩午夜电影网 | 国产人免费人成免费视频 | 最新国产精品拍自在线播放 | 国产精品视频免费在线观看 | 日韩精品久久久久 | 99精品在线视频播放 | 91成熟丰满女人少妇 | 中文字幕大全 | 久久伊人八月婷婷综合激情 | 国产精品成人久久久 | 久草在线免费看视频 | 热久久国产精品 | 国产69久久精品成人看 | 最近日本中文字幕 | 国产视频精品久久 | 91精品久久久久久综合乱菊 | 草莓视频在线观看免费观看 | 国产中文字幕91 | 久久观看最新视频 | 九九精品视频在线观看 | 成人黄色在线观看视频 | 亚洲精品中文字幕在线观看 | 免费日韩一级片 | 成人av久久| 欧美精品首页 | www夜夜| 欧美一区中文字幕 | 亚洲国产免费网站 | 国产精品久久久久久婷婷天堂 | 麻豆高清免费国产一区 | 久久久黄视频 | 日韩在线字幕 | 在线免费观看的av网站 | 午夜精品久久一牛影视 | 狠狠色噜噜狠狠狠狠 | 在线观看免费视频你懂的 | 欧美日韩高清一区二区 国产亚洲免费看 | 黄色片亚洲 | 99热精品在线观看 | 91av国产视频 | 午夜av电影院 | 六月丁香婷婷在线 | 日韩久久久久久久久久 | av大全在线免费观看 | 黄色小说视频在线 | 麻豆视频免费在线观看 | 五月综合婷 | 亚洲欧美综合 | 99精品在线播放 | 国产亚洲午夜高清国产拍精品 | 久久综合成人 | 婷婷成人综合 | 成人国产在线 | 久久人人爽人人爽人人片av免费 | 97成人精品视频在线播放 | 日韩v在线| 四虎在线永久免费观看 | 国产99久久久国产精品免费二区 | 久久免费视频在线观看30 | 97在线免费 | 国产二级视频 | 91影视成人| 在线观看成人一级片 | 免费看片黄色 | 国产毛片在线 | 天天射天天干 | 嫩小bbbb摸bbb摸bbb | 欧美xxxxx在线视频 | 色综合天天综合网国产成人网 | 91精品蜜桃 | 精品亚洲视频在线 | 久久久久免费精品 | 国产精品九九九九九九 | 欧洲精品码一区二区三区免费看 | 国产黄免费在线观看 | 91pony九色丨交换 | 国产在线观看你懂得 | 啪啪免费观看网站 | 91在线看 | 伊人射 | 日日夜夜人人天天 | 成年人免费观看在线视频 | 亚洲精品麻豆视频 | 欧美大码xxxx | 日韩欧美国产成人 | 亚洲成人av在线 | 国内丰满少妇猛烈精品播放 | 午夜婷婷综合 | 欧美精品在线一区二区 | 综合天堂av久久久久久久 | 一级黄色免费网站 | 色婷婷激婷婷情综天天 | 国产在线观看黄 | 日韩免费播放 | 中文字幕在线观看2018 | 天天草网站 | 九色91av | 亚洲手机av | 我要看黄色一级片 | 亚洲国内精品在线 | 国产午夜精品av一区二区 | 精品中文字幕在线观看 | 精品久久久免费视频 | 久久国产精品久久久久 | 欧美在线视频一区二区三区 | 天天天色| 国产精品免费在线 | av先锋中文字幕 | 久久天天躁狠狠躁亚洲综合公司 | 中文字幕av影院 | 97免费视频在线 | 天天操狠狠干 | 成人国产电影在线观看 | 亚洲国内精品在线 | 黄色app网站在线观看 | 国产中文在线字幕 | 久久精品久久精品久久39 | 国产精品久久久久久久久久ktv | 日韩动漫免费观看高清完整版在线观看 | 97视频人人免费看 | 99这里只有精品视频 | 亚洲午夜av电影 | 色婷婷免费视频 | 99国产精品 | 毛片一区二区 | 日韩专区在线 | 国产日本在线播放 | 亚洲每日更新 | 天天射夜夜爽 | 丁香五月缴情综合网 | 日韩免费视频线观看 | 青青河边草手机免费 | 91一区啪爱嗯打偷拍欧美 | 国产免费亚洲 | 国产偷国产偷亚洲清高 | 亚洲国产精品99久久久久久久久 | 久久亚洲在线 | 午夜黄网 | www91在线观看 | 国产精品久久视频 | av在线亚洲天堂 | 国产成人区 | 91精品国产99久久久久久久 | 一区二区精品视频 | 国产精品永久免费视频 | 国产精品永久免费视频 | 久草av在线播放 | 91av在线视频播放 | 久久免费99精品久久久久久 | 久草视频在线播放 | 国产91在线看 | 在线观看91久久久久久 | 九九视频网站 | 亚洲国产成人精品在线观看 | 国产精品亚洲a | 视频在线观看入口黄最新永久免费国产 | 欧美性生交大片免网 | 成人性生爱a∨ | 日韩有码在线观看视频 | 免费精品在线视频 | 天天操天天添 | 久久久久久久影院 | 天天干天天射天天操 | 免费看三级网站 | 天天鲁天天干天天射 | 色综合久久久久久久 | 免费在线91| 久久久久久蜜桃一区二区 | 亚洲第一香蕉视频 | 亚洲一区二区视频在线 | 韩国av免费在线 | 欧美日韩后 | 国产一区二区三区午夜 | 欧美午夜a | 亚洲精品在线资源 | 在线观看视频免费播放 | 国产色影院 | 免费日韩一区二区 | 久久乱码卡一卡2卡三卡四 五月婷婷久 | 久久精品牌麻豆国产大山 | 国产精品1区 | 久久精品视频免费观看 | 国产美女精品视频 | www.福利 | 久久精品国产亚洲精品2020 | 91免费观看视频网站 | 色狠狠综合天天综合综合 | 国产亚洲精品久久 | 久久精品美女视频网站 | 中文字幕在线看视频国产中文版 | 午夜视频在线观看一区二区 | 成人宗合网 | 免费日韩 精品中文字幕视频在线 | 国产一区二区不卡视频 | 国产97在线观看 | 人人射人人爽 | 免费在线一区二区 | 久久一区二区三区超碰国产精品 | 91福利视频网站 | 在线观看黄色 | 欧美精品免费在线观看 | 国产九九热视频 | 欧美日韩在线网站 | 欧美日韩高清一区二区 国产亚洲免费看 | 欧亚久久| 久久久精品网站 | 国产日产av | 国产夫妻性生活自拍 | 久久这里只精品 | 主播av在线 | 国产成人精品在线 | 国产精品视频线看 | 婷婷久久一区 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 97在线免费视频观看 | 精品二区久久 | 国产精品午夜久久 | 日韩视频一区二区三区在线播放免费观看 | 深夜国产福利 | 成人精品一区二区三区电影免费 | 丁香婷婷激情啪啪 | 色综合综合 | 国产欧美精品一区二区三区 | 欧洲精品亚洲精品 | 五月综合激情婷婷 | 九九九九九精品 | 免费中文字幕在线观看 | 狠狠狠色 | 亚洲免费在线看 | 69亚洲乱 | 国产亚洲精品久久久久久移动网络 | 中文字幕高清在线播放 | 综合网在线视频 | 五月天婷婷在线视频 | 色婷婷六月| 欧美在线视频一区二区三区 | 久久久久成人精品 | 在线观看久草 | 日本三级久久久 | 91麻豆文化传媒在线观看 | 欧美色黄 | 欧美日韩在线视频观看 | 日韩午夜电影网 | 激情婷婷综合网 | 在线观看网站黄 | 国产99久久精品一区二区300 | 国产视频久久久久 | 99热只有精品在线观看 | 亚洲国产视频在线 | 操操操夜夜操 | 中文高清av | 亚洲午夜激情网 | 日韩欧美久久 | 亚洲综合网站在线观看 | 国产精品久久久久久久免费大片 | 91av视频在线观看免费 | 日韩午夜三级 | 男女免费视频观看 | 韩国一区二区在线观看 | 精品国产免费av | 国产精品毛片一区视频播不卡 | 国产黄色片免费在线观看 | 成人资源在线播放 | 亚洲.www| 国产精品久久99综合免费观看尤物 | av蜜桃在线 | 色插综合 | 免费网站看av片 | av黄网站 | 91理论电影 | 免费在线观看av | 久草在在线 | 国产精品6 | 欧美一区中文字幕 | 又黄又爽又色无遮挡免费 | 欧美成人h版电影 | 亚洲日本va午夜在线影院 | 操操操av| 免费日韩 精品中文字幕视频在线 | 欧美激情精品久久 | 手机在线小视频 | 久久一区国产 | 国产高清av免费在线观看 | 久久精品免费播放 | av电影在线观看完整版一区二区 | 日韩免费av片 | 99精品视频在线免费观看 | 亚洲免费专区 | 在线免费观看亚洲视频 | 久久公开免费视频 | 看片网站黄色 | 久章草在线观看 | 亚洲天天做 | 99热亚洲精品 | 天天射天天爱天天干 | 九七人人干 | 国产淫片免费看 | 欧美一级黄大片 | 日日夜色| 中文字幕在线观看av | 天天干天天操天天操 | www色av| 久久精品国产免费看久久精品 | av电影亚洲 | 欧美成人黄色 | 国产视频欧美视频 | 国产一级二级在线观看 | 国产精品久久综合 | 国产丝袜美腿在线 | 午夜美女wwww | 91在线蜜桃臀 | 九九三级毛片 | 久久久午夜剧场 | 国产日产精品一区二区三区四区的观看方式 | 国产精品久久久久久久久久久久午夜片 | 久久久久久国产精品免费 | 日韩高清一区二区 | 狠狠操狠狠干天天操 | 亚洲国产精品日韩 | 成年人av在线播放 | 日韩精品一区二区三区外面 | 中文字幕在线观看视频一区二区三区 | 蜜桃av久久久亚洲精品 | 特级大胆西西4444www | av怡红院 | 在线蜜桃视频 | 激情网五月 | 午夜av色 | 麻豆免费观看视频 | 国产精品麻豆一区二区三区 | 国产一级不卡毛片 | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 国产精品久久久一区二区三区网站 | 免费观看国产精品视频 | 中文字幕91视频 | 国产在线国偷精品产拍免费yy | wwxxxx日本 | 欧美一级视频一区 | 最近免费观看的电影完整版 | www久久久久 | 中文字幕免费高清在线 | 欧美性生活小视频 | 亚洲伊人成综合网 | 91网址在线看 | 午夜精品av在线 | 97福利| 婷婷六月丁香激情 | 国产免费作爱视频 | 亚洲精品午夜aaa久久久 | 丁香资源影视免费观看 | 又黄又爽又无遮挡的视频 | 18性欧美xxxⅹ性满足 | 国产精品日韩久久久久 | 婷婷看片 | 亚州精品在线视频 | 在线免费观看视频一区 | 99精品福利 | 亚洲精区二区三区四区麻豆 | 国产成人一区二区三区免费看 | 久久永久视频 | 丁香六月婷婷综合 | 天天操天天舔天天干 | 婷婷五月情 | 亚洲成免费 | 色片网站在线观看 | 色综合色综合久久综合频道88 | 日韩午夜电影 | 亚洲aⅴ乱码精品成人区 | 色综合久久久久综合体桃花网 | av免费观看高清 | www国产一区 | 一区二区三区电影在线播 | 成年人在线视频观看 | 亚洲成人精品在线 | 96久久欧美麻豆网站 | 天天色棕合合合合合合 | 成人午夜剧场在线观看 | 97电影在线看视频 | 国产精品久久久久久吹潮天美传媒 | 国产精品毛片一区视频 | 18国产精品白浆在线观看免费 | 精品国内自产拍在线观看视频 | 欧美先锋影音 | 国产视频首页 | 在线蜜桃视频 | 99热手机在线 | 97超碰国产在线 | 免费福利在线视频 | 亚洲精品国产成人av在线 | 国产成人一区二区三区电影 | a在线观看免费视频 | 激情丁香综合五月 | www免费| 久久久综合九色合综国产精品 | 一区二区三区免费播放 | 久久中文网| 人人爽人人乐 | 99r在线播放 | 国产69精品久久久久9999apgf | 丁香婷婷综合激情五月色 | 欧美巨大荫蒂茸毛毛人妖 | 国产精品岛国久久久久久久久红粉 | 黄色字幕网 | 国产一区二区精品久久 | 成人毛片在线视频 | 国产一区高清在线观看 | 中文日韩在线视频 | 国产做aⅴ在线视频播放 | 国产中文字幕av | 在线播放亚洲 | 久久久国产精品人人片99精片欧美一 | 在线观看国产91 | 国产喷水在线 | 天天干夜夜夜操天 | 中文字幕久久网 | av大全在线 | 日韩av资源在线观看 | 免费电影一区二区三区 | 午夜精品视频一区 | 亚洲一区二区三区四区在线视频 | 精品国产三级a∨在线欧美 免费一级片在线观看 | 久久av观看| 久久久久免费精品国产 | 日韩天天操 | 天天天综合 | 夜夜夜夜爽 | 一区二区三区免费看 | 亚洲精品视频免费观看 | 久久久免费精品国产一区二区 | 五月婷婷伊人网 | 亚洲国产午夜 | 美女黄视频免费看 | 伊人久在线 | 中文字幕xxxx | 麻豆国产精品永久免费视频 | 日韩av免费在线电影 | 久久久av免费 | 日韩91在线 | 精品免费99久久 | 极品国产91在线网站 | 国产一级免费视频 | 国产精品久久视频 | 亚洲免费永久精品国产 | 国产亚洲小视频 | 日韩av手机在线观看 | 久久三级视频 | 欧美日韩18 | www.五月婷婷.com | 久久综合久色欧美综合狠狠 | 超碰免费在线公开 | 国产精品久久艹 | 丁香婷婷基地 | 欧美成人视 | 国产乱老熟视频网88av | 99久久国产免费,99久久国产免费大片 | 午夜久久网站 | 日韩免费播放 | 久久国产精品一二三区 | 日本中文字幕网 | 97视频免费在线观看 | 91爱爱电影 | 三级av网| 在线成人中文字幕 | 欧美激情操 | 伊香蕉大综综综合久久啪 | 综合精品在线 | 国产美女在线精品免费观看 | 色婷婷狠狠五月综合天色拍 | 日韩在线观看视频在线 | 亚洲国产一区二区精品专区 | 五月婷婷综合激情 | 国产精品久久久一区二区三区网站 | 成人久久精品 | 亚洲人成人在线 | 国产专区第一页 | 最近中文字幕久久 | www.亚洲激情.com | 日日爱网址 | 韩国精品在线 | 成人av高清在线观看 | 国产精品av久久久久久无 | 国产精品网在线观看 | 激情久久久久 | 午夜久久福利 | 欧美日韩高清 | 高清av影院 | 色综合久久久久久久久五月 | 国产中年夫妇高潮精品视频 | 日本性生活免费看 | 黄a网| 国产精品va在线 | 美女黄频在线观看 | 99久久精品国产一区二区成人 | 天天综合操 | 久草免费在线观看视频 | 天天干天天操av | 国产馆在线播放 | 黄色av高清 | 8090yy亚洲精品久久 | 五月开心婷婷 | 欧美福利视频一区 | 日韩在线免费不卡 | 色综合久久综合中文综合网 | 日日躁夜夜躁aaaaxxxx | 一区二区视频免费在线观看 | 午夜在线观看影院 | 日本爱爱片 | 99亚洲国产精品 | aaa免费毛片 | 久久中文字幕视频 | 中文字幕有码在线播放 | 色福利网站 | 国产精品久久久久久69 | 五月天伊人 | 激情图片qvod | 一区二区免费不卡在线 | 国产手机在线播放 | 亚洲人成在线观看 | 久久成人精品视频 | 久久久免费看视频 | 国产精品理论片 | 一区二区精品在线 | 亚洲 综合 精品 | 国产亚洲va综合人人澡精品 | 91大神精品视频在线观看 | 黄色精品网站 | 2019天天干天天色 | 激情电影在线观看 | 人人玩人人添人人澡超碰 | 激情综合啪 | 久久久蜜桃一区二区 | 麻豆国产精品视频 | 日韩一级理论片 | 欧美日韩成人一区 | 成人黄色在线观看视频 | 欧美福利精品 | 五月婷婷激情综合 | 在线久久 | 久久狠狠婷婷 | 九九九热| 天天精品视频 | 337p欧美| 亚洲成a人片综合在线 | 特级毛片网 | 欧美最猛性xxxxx(亚洲精品) | 中文字幕在线免费97 | 美女av在线免费 | av黄色一级片 | 18岁免费看片 | 天天在线视频色 | 欧美日韩一区二区在线 | 涩涩资源网 | 日日草视频 | 91精品久久久久久久91蜜桃 | 激情视频区 | 国产精品99久久久久久小说 | 免费视频a | 在线观看精品一区 | 视频福利在线 | www.狠狠色.com | 久热av | 奇米网777 | 久久国产精品视频 | 国产欧美精品xxxx另类 | 天天干天天干天天干 | 在线黄色国产电影 | 欧美久久久久 | 国产成人精品亚洲a | 在线一级片| 狠狠久久婷婷 | 91亚洲精品在线观看 | 久久综合久久久久88 | 日韩中文字幕免费视频 | 国产97视频在线 | 91亚·色 | 中文字幕一区二区三区四区久久 | 热久久视久久精品18亚洲精品 | 国产精品毛片一区二区在线看 | 亚洲成人av影片 | 97在线视频免费播放 | 精品女同一区二区三区在线观看 | 天天操天天干天天综合网 | 国产美腿白丝袜足在线av | 狠狠干狠狠操 | 999久久久久久久久6666 | 国产精品永久免费观看 | 久久久免费精品国产一区二区 | 99久久99久久综合 | 成x99人av在线www | 国产精品一二三 | 国产精品21区 | 久久久久久久av麻豆果冻 | 亚洲午夜久久久久久久久电影网 | 国色天香在线观看 | 亚洲精选在线 | 99久久久免费视频 | 午夜视频色 | 中日韩欧美精彩视频 | 69av视频在线观看 | 国内精品视频免费 | 日韩中文字幕免费在线播放 | 欧美性生交大片免网 | 国产成人一区二区三区电影 | 欧美淫视频 | 亚洲欧美国产精品 | 欧美日韩视频免费看 | 91麻豆精品国产91久久久久久 | 久久精品久久99精品久久 | 一区二区三区日韩在线观看 | 日本大片免费观看在线 | 亚洲午夜精品一区 | 国产精品情侣视频 | 久久久夜色 | 久久婷婷一区 | 国产视频综合在线 | 超碰97在线人人 | 久久首页| 精品久久1| 亚洲人成免费 | av观看在线观看 | 日韩精品 在线视频 | 国产区精品区 | 亚洲黄色在线免费观看 | 亚洲 成人 一区 | 9999在线观看 | 99在线免费视频观看 | 成人免费色 | 毛片网站免费在线观看 | 午夜av在线免费 | 国产一区二区在线观看免费 | 免费看精品久久片 | 亚洲综合视频在线 | 成人黄色在线 | 夜色在线资源 | 成人一级影视 | 免费观看完整版无人区 | 国产乱对白刺激视频不卡 | 日韩婷婷 | 亚洲一区网| 日韩动漫免费观看高清完整版在线观看 | 欧美日韩在线视频一区二区 | 免费在线国产精品 | 久久精品电影院 | 久久久久久久久久久高潮一区二区 | 狠狠色狠狠色 | 色综合久久中文字幕综合网 | 久久久久综合视频 | 午夜视频在线观看一区二区三区 | 国产精品麻豆99久久久久久 | 操高跟美女 | 91在线一区| 成人理论电影 | 天天色天天操综合网 | 日本久久精品视频 | 欧美激情精品久久久久久变态 | 中文亚洲欧美日韩 | 9在线观看免费高清完整版在线观看明 | 伊人天天操| 国产精品大片免费观看 | 96久久精品 | 久久一区二区免费视频 | 天天干天天干天天干 | 国产精品久久人 | 麻豆91精品91久久久 | 国产原创在线视频 | 99在线热播| 99这里只有精品视频 | 欧美精品一区二区在线播放 | 又色又爽又黄 | 久久99国产精品久久99 | 在线观看国产区 | 97人人爽 | 日韩视频在线不卡 | 在线观看视频一区二区三区 | 色九九影院 | 国产精品久久久精品 | 精品视频99 | 麻豆国产精品视频 | 欧美日韩另类在线 | 免费国产一区二区视频 | 色婷婷激情四射 | 国产69熟 | 免费合欢视频成人app | 99热999 | 五月婷综合网 | 一区二区亚洲精品 | 激情电影影院 | 亚洲精品日韩在线观看 | 色就色,综合激情 | 岛国av在线不卡 | 国产精品成人免费一区久久羞羞 | 色狠狠一区二区 | 国产视频导航 | 久久天天躁狠狠躁夜夜不卡公司 | 激情综合交 | 五月天激情在线 | 国产一区私人高清影院 | 日韩中文字幕视频在线观看 | 人人插人人爱 | 久久影院午夜论 | 在线观看中文字幕dvd播放 | 999男人的天堂 | 色婷婷骚婷婷 | 一区 在线观看 | 国产在线毛片 | 免费av视屏| 韩日电影在线免费看 | 中文久草 | 四虎成人网 | 99精品视频精品精品视频 | 国产成人在线观看 | 国产精品日韩在线播放 | 色视频网址 | 狠狠操影视 | 丁香综合五月 | 国产精品美女999 | 最新在线你懂的 | 黄色小说18| av综合av| 天天色棕合合合合合合 | 国产精品久久久久9999吃药 | 欧美日韩3p | 免费看一级一片 | 欧美一区二区日韩一区二区 | 亚洲人成影院在线 | 日本99精品 | 日韩理论| 精品国产一区二 | 成人a毛片 | 国产精品久久久久久久久蜜臀 | 欧美少妇xx| 免费观看91视频大全 | 免费91在线 | 超碰97免费观看 | 999视频精品 | 久久久久久久久久久黄色 | 一级一级一片免费 | 99精品在线| 日本 在线 视频 中文 有码 | 伊人欧美 | 综合色播 | 亚洲高清视频在线 | 美女视频黄的免费的 | 日韩理论电影在线观看 | 色狠狠狠| 日本精品中文字幕在线观看 | 久操伊人| 麻豆影视在线观看 | 99精品乱码国产在线观看 | 九九视频精品免费 | 日韩精品在线观看视频 | 亚洲国产精品影院 | 亚洲国产网站 | 国产精品理论视频 | 黄色电影在线免费观看 | 在线亚洲小视频 | 欧美精品亚洲精品日韩精品 | 久久综合狠狠综合久久综合88 | 91精选在线观看 | 久久免费电影网 | 免费看片色 | 四虎影视www | 99re视频在线观看 | 国产亚洲精品久久久久久移动网络 | 9999在线| 免费视频色 | 日韩高清精品一区二区 | 婷婷丁香五 | 99在线视频免费观看 | 国产亚洲视频中文字幕视频 | 欧美一区二区三区免费观看 | 韩国av一区二区三区 | 五月天综合婷婷 | 国产在线精品一区二区三区 | 国产麻豆成人传媒免费观看 | 91在线操| 亚洲一级影院 | 日韩精品大片 | 人人爽爽人人 | 国产免费成人 | 亚洲日本欧美在线 | av网址最新 | 天天综合入口 | 五月天婷婷免费视频 | 久久草av | 欧美另类美少妇69xxxx | 97成人精品区在线播放 | 狠狠干中文字幕 | 97超碰站 | 国产专区视频在线 | 色综合久久66| 久草视频网 | 久草在线手机观看 | 91免费高清视频 | 少妇bbw搡bbbb搡bbb | 久草在线视频精品 | 亚洲视频精品在线 | 日韩精品在线播放 | 99精品久久只有精品 | 免费看的黄网站 | 懂色av一区二区三区蜜臀 | 色操插 | 婷婷色亚洲 | 国产精品免费麻豆入口 | 亚洲一区二区黄色 | 国产亚洲一区二区三区 | 欧美日韩69| 日本成人中文字幕在线观看 | 欧美日韩国产精品一区二区亚洲 | 国产一区在线不卡 | 人人爱在线视频 | 亚洲一二区视频 | av永久网址 | 五月婷婷综合激情网 | 国产精品1区2区3区在线观看 | 色在线国产| 深夜免费小视频 | 日韩精品一区二区在线视频 | 国产黄色免费看 | 五月婷婷综合久久 | 三级动态视频在线观看 | 日韩精品欧美专区 | 在线观看精品国产 | 国产精品国产三级国产aⅴ9色 | 亚洲精品国产拍在线 | 激情久久小说 | 亚洲成a人片77777kkkk1在线观看 | 天天射天天 | 看片一区二区三区 | 国产免费一区二区三区网站免费 | 91视频专区| 91探花国产综合在线精品 | 97天天干 | 亚洲免费不卡 | 国产一区二区三区在线免费观看 | 开心婷婷色 | 丁香六月国产 | 免费在线观看av网站 | 天堂av在线免费观看 | 国产女人免费看a级丨片 | 天天爽天天爽 | 伊人狠狠色丁香婷婷综合 | 国产色女 | 在线韩国电影免费观影完整版 | 香蕉视频免费在线播放 | 中文字幕日韩无 | www激情com | 在线免费观看的av | 国产精品久免费的黄网站 | 国产黄色片网站 | 亚洲区视频在线观看 | 亚洲视频一区二区三区在线观看 | 国产高清福利在线 | 久久精品国产第一区二区三区 | 欧美一级大片在线观看 | 国产高清久久久久 | 日韩av视屏 | 成人影音av | 五月婷婷六月丁香 | 国产精品视频全国免费观看 | 免费a网站 | 国产黄色片在线 | 在线免费黄网站 | 人人干天天射 | 日日夜夜操操操操 | 在线免费观看的av网站 | 国产精品久久久久久久久久久久午 | 又黄又爽又刺激视频 | av免费在线观 | 中文字幕亚洲高清 | 国产精品福利在线观看 | 成年人在线免费看视频 | a级国产乱理伦片在线观看 亚洲3级 | 在线综合 亚洲 欧美在线视频 | 国产精品久久久久久麻豆一区 | 久久婷婷丁香 | www视频在线播放 | 91香蕉亚洲精品 | 69热国产视频| www狠狠| 最近最新mv字幕免费观看 | 日韩精品一区二区三区免费观看 | 国产亚洲精品日韩在线tv黄 | 成年人视频在线免费 | 久久精品99精品国产香蕉 | 91在线麻豆 | 在线观看免费色 | 国产电影黄色av | av在线播放网址 | 亚洲国产高清在线 | 免费国产在线精品 | 精品国产电影一区 | 日日爽日日操 | 天天天天爱天天躁 | 97视频资源| 国产精品久久久网站 | 免费网址你懂的 | 日韩高清免费电影 | 2020天天干夜夜爽 | 国产乱对白刺激视频在线观看女王 | 国产免费一区二区三区最新 | 久久精品视频免费观看 | 国产成人精品亚洲精品 | 777久久久 | 超碰97免费 | 国产激情小视频在线观看 | 国产精品区二区三区日本 | 黄色小说视频在线 | 精品久久久免费视频 | 人人看人人艹 | 日韩一级电影网站 | 成人免费视频视频在线观看 免费 | 欧美少妇影院 | 免费网站污 | 日韩xxxbbb| 精品伦理一区二区三区 | 精品一区二区综合 | 精品久久久久久久久中文字幕 | 久久影院精品 | 国产精品久久久久9999吃药 | 日韩精品久久中文字幕 | 在线播放一区二区三区 | 国产福利中文字幕 | 亚洲香蕉视频 | 成人不用播放器 | 国产美女精品视频免费观看 | 深爱五月网 | 男女拍拍免费视频 | 日韩在线播放欧美字幕 | 日韩无在线 | 久久中文精品视频 | 日韩成人不卡 | 精品亚洲免费视频 | 97电影网手机版 | 97小视频 | 伊人久久在线观看 | 亚洲免费精品视频 | 日韩欧美在线免费观看 | 激情视频免费观看 | 97在线精品国自产拍中文 | 中文字幕欧美三区 | 不卡电影一区二区三区 | 久草精品视频在线观看 | www.香蕉视频 | 欧美日韩1区2区 | 国产精品久久久久久久久软件 | 手机色站 | 天天色天天操综合网 | 亚洲免费在线看 | 4438全国亚洲精品在线观看视频 | 久草影视在线观看 | 午夜av大片 | 91中文字幕 | 国产在线观看污片 | 男女视频91 | 在线观看视频一区二区三区 | 欧美精品一区在线 | 久久视频在线观看 | 国产精品白浆视频 | 伊人婷婷激情 | www国产亚洲精品久久网站 | 久久久国产视频 | 日本最新高清不卡中文字幕 | 中文字幕欧美三区 | 国产麻豆电影在线观看 | av中文天堂| 97超碰人人澡人人爱学生 | www麻豆视频| 中文字幕人成一区 | 成人免费观看完整版电影 | 精品免费久久久久久 | 91福利试看 | 亚洲日本va在线观看 | www.狠狠干 | 在线观看香蕉视频 | 成人免费xxx在线观看 | av一本久道久久波多野结衣 | 成人a级黄色片 | 久久夜视频| 色婷婷88av视频一二三区 | 成人黄色电影视频 | 中文字幕视频一区 | 丁香在线观看完整电影视频 | 狠狠操在线 |