自定義View繪制基礎(chǔ)API

onDraw(Canvas canvas)

我們知道繪制是需要重寫(xiě)onDraw的家肯,但是具體實(shí)現(xiàn)是依靠涂料Paint以及畫(huà)布Canvas來(lái)實(shí)現(xiàn)的,看下官方文檔api

Paint:Paint類包含如何繪制幾何圖形、文本和位圖的樣式和顏色信息.
常用的方法:

  • Paint.setStyle(Style style)設(shè)置繪制模式

  • Paint.setColor(int color)設(shè)置顏色

  • Paint.setStrokeWidth(float width)設(shè)置線條寬度

  • Paint.setTextSize(float textSize) 設(shè)置文字大小

  • Paint.setAntiAlias(boolean aa) 設(shè)置抗鋸齒開(kāi)關(guān) 顯得平滑

  • paint.setStrokeCap設(shè)置線帽

        // 無(wú)線帽
        paint.setStrokeCap(Paint.Cap.BUTT);
        canvas.drawLine(100, 200, 400, 200, paint);

        // 方形線帽
        paint.setStrokeCap(Paint.Cap.SQUARE);
        canvas.drawLine(100, 400, 400, 400, paint);

        // 圓形線帽
        paint.setStrokeCap(Paint.Cap.ROUND);
        canvas.drawLine(100, 600, 400, 600, paint);
線帽效果.png
  • paint.setStrokeJoin 連接處外邊緣的連接方式
        Path path = new Path();
        path.moveTo(100, 100);
        path.lineTo(450, 100);
        path.lineTo(100, 300);
        paint.setStrokeJoin(Paint.Join.MITER);     //連接的外邊緣以銳角相交
        canvas.drawPath(path, paint);

        path.moveTo(100, 400);
        path.lineTo(450, 400);
        path.lineTo(100, 600);
        paint.setStrokeJoin(Paint.Join.BEVEL);   //連接的外邊緣以直線相遇。
        canvas.drawPath(path, paint);

        path.moveTo(100, 700);
        path.lineTo(450, 700);
        path.lineTo(100, 900);
        paint.setStrokeJoin(Paint.Join.ROUND);  //連接的外邊緣與圓弧相交
        canvas.drawPath(path, paint);
image.png
  • paint.setPathEffect(new CornerPathEffect("半徑"));
        canvas.drawPath(path, paint);
        paint.setColor(Color.RED);
        paint.setPathEffect(new CornerPathEffect(100));
        canvas.drawPath(path, paint);

        paint.setPathEffect(new CornerPathEffect(200));
        paint.setColor(Color.YELLOW);
        canvas.drawPath(path, paint);
image.png
  • Paint.setShader()設(shè)置著色器
        /**線性漸變
         * x0, y0, 起始點(diǎn)
         *  x1, y1, 結(jié)束點(diǎn)
         * int[]  mColors, 中間依次要出現(xiàn)的幾個(gè)顏色
         * float[] positions,數(shù)組大小跟colors數(shù)組一樣大福侈,
         * 中間依次擺放的幾個(gè)顏色分別放置在那個(gè)位置上(參考比例從左往右)
         */
    LinearGradient linearGradient =
                new LinearGradient( 0, 0,800, 800, mColors, null, Shader.TileMode.CLAMP);
     paint.setShader(linearGradient);
    canvas.drawRect(0, 0, 800, 800, mPaint);
image.png

圓形漸變RadialGradient

image.png

掃描漸變SweepGradient

image.png


Canvas畫(huà)布類包含“繪制”調(diào)用。要畫(huà)一些東西卢未,你需要4個(gè)基本的組件:一個(gè)位圖來(lái)保存像素癌刽,一個(gè)畫(huà)布來(lái)容納繪制調(diào)用(寫(xiě)入位圖),一個(gè)繪圖原語(yǔ)(例如尝丐,矩形,路徑衡奥,文本爹袁,位圖),以及一個(gè)油漆(用來(lái)描述繪圖的顏色和樣式)矮固。
常用方法:Canvas提供一系列drawXXX方法

        paint.setColor(Color.RED);
        //設(shè)置畫(huà)筆的風(fēng)格  填滿 描邊
        paint.setStyle(Paint.Style.FILL_AND_STROKE);
        paint.setStrokeWidth(20);
        //設(shè)置抗鋸齒 true 表面看著平滑
        paint.setAntiAlias(true);
        //畫(huà)圓
        canvas.drawCircle(150, 900, 80, paint);
        //畫(huà)線
        canvas.drawLine(50, 50, 200, 50, paint);
        //畫(huà)矩形
        canvas.drawRect(50, 100, 200, 400, paint);
        //畫(huà)橢圓
        canvas.drawOval(50, 450, 300, 600, paint);
        //畫(huà)圓角矩形
        /**
         * @param rx The x-radius of the oval used to round the corners
         * @param ry The y-radius of the oval used to round the corners
         */
        canvas.drawRoundRect(50, 650, 300, 800, 20, 20, paint);

        paint.setColor(Color.BLACK);
        paint.setStyle(Paint.Style.FILL);
        // 繪制扇形
        canvas.drawArc(300, 100, 900, 500, -110, 100, true, paint);    //前四個(gè)參數(shù)是矩形的左上角以及右下角坐標(biāo)失息,
                                                                       //第五個(gè)第六個(gè)是起始角度  第七個(gè)是是否封口
        
        // 繪制弧形
        canvas.drawArc(300, 100, 900, 500, 20, 140, false, paint);
        
        paint.setStyle(Paint.Style.STROKE);
        // 繪制不封口的弧形
        canvas.drawArc(300, 100, 900, 500, 180, 60, false, paint);
    }
image.png

Path類

        Paint paint = new Paint();
        paint.setColor(Color.GREEN);
        paint.setAntiAlias(true);
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeWidth(15);
        Path path = new Path();
        // 畫(huà)斜線  //默認(rèn)起始點(diǎn)0
        path.lineTo(200, 200);

        //移動(dòng)起始點(diǎn)
        path.moveTo(300, 400);
        //畫(huà)豎線
        path.lineTo(300, 770);
        //相對(duì)當(dāng)前的位置(300, 770) 在x,y移動(dòng)
        path.rLineTo(500,220);
        canvas.drawPath(path,paint);
image.png

上面在添加一句path.close();效果和 lineTo(起點(diǎn)坐標(biāo)) 是一樣的

image.png


以上為Paint档址,Path盹兢,Canvas常見(jiàn)用法

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市守伸,隨后出現(xiàn)的幾起案子绎秒,更是在濱河造成了極大的恐慌,老刑警劉巖尼摹,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件见芹,死亡現(xiàn)場(chǎng)離奇詭異剂娄,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)玄呛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)阅懦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人徘铝,你說(shuō)我怎么就攤上這事耳胎。” “怎么了惕它?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵怕午,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我怠缸,道長(zhǎng)诗轻,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任揭北,我火速辦了婚禮扳炬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘搔体。我一直安慰自己恨樟,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布疚俱。 她就那樣靜靜地躺著劝术,像睡著了一般。 火紅的嫁衣襯著肌膚如雪呆奕。 梳的紋絲不亂的頭發(fā)上养晋,一...
    開(kāi)封第一講書(shū)人閱讀 51,182評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音梁钾,去河邊找鬼绳泉。 笑死,一個(gè)胖子當(dāng)著我的面吹牛姆泻,可吹牛的內(nèi)容都是我干的零酪。 我是一名探鬼主播,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼拇勃,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼四苇!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起方咆,我...
    開(kāi)封第一講書(shū)人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤月腋,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體罗售,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡辜窑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了寨躁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片穆碎。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖职恳,靈堂內(nèi)的尸體忽然破棺而出所禀,到底是詐尸還是另有隱情,我是刑警寧澤放钦,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布色徘,位于F島的核電站,受9級(jí)特大地震影響操禀,放射性物質(zhì)發(fā)生泄漏褂策。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一颓屑、第九天 我趴在偏房一處隱蔽的房頂上張望斤寂。 院中可真熱鬧,春花似錦揪惦、人聲如沸遍搞。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)溪猿。三九已至,卻和暖如春纫塌,著一層夾襖步出監(jiān)牢的瞬間诊县,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工措左, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留翎冲,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓媳荒,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親驹饺。 傳聞我的和親對(duì)象是個(gè)殘疾皇子钳枕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容