Android Paint高級運(yùn)用

介紹

Paint:畫筆

方法

paint.setColor(Color.RED);// 設(shè)置顏色
paint.setARGB(255, 255, 255, 0); // 設(shè)置 Paint對象顏色,范圍為0~255
paint.setAlpha(200); // 設(shè)置alpha不透明度,范圍為0~255
paint.setAntiAlias(true); // 抗鋸齒
paint.setStyle(Paint.Style.FILL); //描邊效果
paint.setStrokeWidth(4);//描邊寬度
paint.setStrokeCap(Paint.Cap.ROUND); //圓角效果
paint.setStrokeJoin(Paint.Join.MITER);//拐角風(fēng)格
paint.setShader(new SweepGradient(200, 200, Color.BLUE, Color.RED)); //設(shè)置環(huán)形渲染器
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DARKEN)); //設(shè)置圖層混合模式
paint.setColorFilter(new LightingColorFilter(0x00ffff, 0x000000)); //設(shè)置顏色過濾器

Paint.Style

分為三種:

paint.setStyle(Paint.Style.FILL); //填充所有
paint.setStyle(Paint.Style.STROKE); //描邊效果,只畫出線條
paint.setStyle(Paint.Style.FILL_AND_STROKE); //填充內(nèi)部和描邊

Paint.cap

paint.setStrokeCap(Paint.Cap.BUTT); //默認(rèn)效果,如繪制的正方形,就是正方行
paint.setStrokeCap(Paint.Cap.ROUND); //繪制的圖形兩邊會有圓角效果粗截,兩邊的圓角是在SQUARE 的基礎(chǔ)上延申出一部分形成圓角
paint.setStrokeCap(Paint.Cap.SQUARE); //BUTT 的基礎(chǔ)上凰锡,兩邊延申出去一部分
image.png

Paint.Join

paint.setStrokeJoin(Paint.Join.MITER);//拐角風(fēng)格,直角
paint.setStrokeJoin(Paint.Join.BEVEL);//拐角風(fēng)格昼牛,切割
paint.setStrokeJoin(Paint.Join.ROUND);//拐角風(fēng)格统台,圓角
image.png

測量字體的高度

String text = "測試文本的高度";
      canvas.drawText(text,0,100,paint);
        //創(chuàng)建一個空的矩陣
        Rect rect = new Rect();
        paint.getTextBounds(text,0,text.length(), rect);
        int width = rect.width();
        int height = rect.height();
        Log.i("打印","通過rect獲取到的寬度 ====  "+width);
        Log.i("打印","通過rect獲取到的高度 ====  "+height);

//        FontMetrics
        Paint.FontMetrics fontMetrics = paint.getFontMetrics();
        int top = (int) fontMetrics.top;
        int ascent = (int) fontMetrics.ascent;
        int bottom = (int) fontMetrics.bottom;
        int descent = (int) fontMetrics.descent;
        int leading = (int) fontMetrics.leading;
        Log.i("打印","FontMetrics  top ====  "+top);
        Log.i("打印","FontMetrics  ascent ====  "+ascent);
        Log.i("打印","FontMetrics  bottom ====  "+bottom);
        Log.i("打印","FontMetrics  descent ====  "+descent);
        Log.i("打印","FontMetrics  leading ====  "+leading);
        int FontMetricsHeight = descent + Math.abs(ascent);
        Log.i("打印","通過FontMetrics獲取到的高度奄容,真實的高度  ====  "+FontMetricsHeight);

paint.setShader 設(shè)置渲染器

線性渲染

/**
         * 1.線性渲染,LinearGradient(float x0, float y0, float x1, float y1, @NonNull @ColorInt int colors[], @Nullable float positions[], @NonNull TileMode tile)
         * (x0,y0):漸變起始點坐標(biāo)
         * (x1,y1):漸變結(jié)束點坐標(biāo)
         * color0:漸變開始點顏色,16進(jìn)制的顏色表示冰更,必須要帶有透明度
         * color1:漸變結(jié)束顏色
         * colors:漸變數(shù)組
         * positions:位置數(shù)組,position的取值范圍[0,1],作用是指定某個位置的顏色值昂勒,如果傳null蜀细,漸變就線性變化。
         * tile:用于指定控件區(qū)域大于指定的漸變區(qū)域時戈盈,空白區(qū)域的顏色填充方法,分為三種:CLAMP(最后1像素拉伸) REPEAT(重復(fù)) MIRROR(鏡影)
         */
        //渲染一個x和y的坐標(biāo)點是250的奠衔,顏色是從綠色到紅色漸變,在0.6f(60%)的時候開始漸變成紅色奕谭,1 最后是藍(lán)色 涣觉,繪制區(qū)域大于渲染器指定區(qū)域的填充是1像素拉伸
        Shader lineShader = new LinearGradient(0, 0, 250, 250, new int[]{Color.GREEN, Color.RED,Color.BLUE}, new float[]{0, 0.6f, 1}, Shader.TileMode.REPEAT);
        paint.setShader(lineShader);

畫圓效果

//drawCircle(float cx, float cy, float radius, @NonNull Paint paint)
//cx:要畫的圓的中心點x坐標(biāo),cy:要畫的圓的中心點y坐標(biāo)血柳,radius:畫的圓的半徑
canvas.drawCircle(125,125,125,paint);
image.png

畫矩形效果

//drawRect(float left, float top, float right, float bottom, @NonNull Paint paint)
//left:畫的巨型的左邊起始位置官册,top:上邊其實位置 right:右側(cè)位置 bottom:底部位置
canvas.drawRect(0,0,500,500,paint);
image.png

環(huán)形渲染

/**
         * 環(huán)形渲染抄淑,RadialGradient(float centerX, float centerY, float radius, @ColorInt int colors[], @Nullable float stops[], TileMode tileMode)
         * centerX ,centerY:shader的中心坐標(biāo)农曲,開始漸變的坐標(biāo)
         * radius:漸變的半徑
         * centerColor,edgeColor:中心點漸變顏色,邊界的漸變顏色
         * colors:漸變顏色數(shù)組
         * stoops:漸變位置數(shù)組欧聘,類似掃描漸變的positions數(shù)組根吁,取值[0,1],中心點為0员淫,半徑到達(dá)位置為1.0f
         * tileMode:shader未覆蓋以外的填充模式。
         */
        Shader shader = new RadialGradient(250, 250, 250, new int[]{Color.GREEN, Color.YELLOW, Color.RED}, null, Shader.TileMode.REPEAT);
        paint.setShader(shader);
        canvas.drawCircle(250, 250, 250, paint);
image.png

矩形

canvas.drawRect(0,0,500,500,paint);

畫布的大小是500击敌,生于部分重復(fù)填充


image.png

掃描渲染

//掃描渲染,順時針方向逐漸漸變渲染
        /**SweepGradient(float cx, float cy, @ColorInt int color0,int color1)
         * cx,cy 漸變中心坐標(biāo)
         * color0,color1:漸變開始結(jié)束顏色
         * colors介返,positions:類似LinearGradient,用于多顏色漸變,positions為null時,根據(jù)顏色線性漸變
         */
        Shader shader  = new SweepGradient(250, 250, Color.RED, Color.GREEN);
        paint.setShader(shader);
        canvas.drawCircle(250, 250, 250, paint);
image.png

位圖渲染

/** 位圖渲染沃斤,BitmapShader(@NonNull Bitmap bitmap, @NonNull TileMode tileX, @NonNull TileMode tileY)
         * Bitmap:構(gòu)造shader使用的bitmap
         * tileX:X軸方向的TileMode
         * tileY:Y軸方向的TileMode
         REPEAT, 繪制區(qū)域超過渲染區(qū)域的部分圣蝎,重復(fù)排版
         CLAMP, 繪制區(qū)域超過渲染區(qū)域的部分衡瓶,會以最后一個像素拉伸排版
         MIRROR, 繪制區(qū)域超過渲染區(qū)域的部分徘公,鏡像翻轉(zhuǎn)排版
         */
        Bitmap mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.timg);
        Shader mShader = new BitmapShader(mBitmap, Shader.TileMode.REPEAT, Shader.TileMode.MIRROR);
        paint.setShader(mShader);
        canvas.drawRect(0, 0, 500, 500, paint);
image.png

為徒渲染圓形效果

canvas.drawCircle(250, 250, 250, paint);
image.png

組合渲染

/**
         * 組合渲染,
         * ComposeShader(@NonNull Shader shaderA, @NonNull Shader shaderB, Xfermode mode)
         * ComposeShader(@NonNull Shader shaderA, @NonNull Shader shaderB, PorterDuff.Mode mode)
         * shaderA,shaderB:要混合的兩種shader
         * Xfermode mode: 組合兩種shader顏色的模式
         * PorterDuff.Mode mode: 組合兩種shader顏色的模式
         * PorterDuff.Mode.MULTIPLY :
         */
        Bitmap mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.timg);
        BitmapShader bitmapShader = new BitmapShader(mBitmap, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);
        LinearGradient linearGradient = new LinearGradient(0, 0, 1000, 1600, new int[]{Color.RED, Color.GREEN, Color.BLUE}, null, Shader.TileMode.CLAMP);
        Shader shader = new ComposeShader(bitmapShader, linearGradient, PorterDuff.Mode.MULTIPLY);
        paint.setShader(shader);
        canvas.drawCircle(250, 250, 250, paint);
image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末哮针,一起剝皮案震驚了整個濱河市关面,隨后出現(xiàn)的幾起案子坦袍,更是在濱河造成了極大的恐慌,老刑警劉巖等太,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件捂齐,死亡現(xiàn)場離奇詭異,居然都是意外死亡缩抡,警方通過查閱死者的電腦和手機(jī)辛燥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來缝其,“玉大人,你說我怎么就攤上這事徘六∧诒撸” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵待锈,是天一觀的道長漠其。 經(jīng)常有香客問我,道長竿音,這世上最難降的妖魔是什么和屎? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮春瞬,結(jié)果婚禮上柴信,老公的妹妹穿的比我還像新娘。我一直安慰自己宽气,他們只是感情好随常,可當(dāng)我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著萄涯,像睡著了一般绪氛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上涝影,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天枣察,我揣著相機(jī)與錄音,去河邊找鬼燃逻。 笑死序目,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的唆樊。 我是一名探鬼主播宛琅,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼逗旁!你這毒婦竟也來了嘿辟?” 一聲冷哼從身側(cè)響起舆瘪,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎红伦,沒想到半個月后英古,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡昙读,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年召调,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蛮浑。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡唠叛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出沮稚,到底是詐尸還是另有隱情艺沼,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布蕴掏,位于F島的核電站障般,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏盛杰。R本人自食惡果不足惜挽荡,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望即供。 院中可真熱鬧定拟,春花似錦、人聲如沸募狂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽祸穷。三九已至性穿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間雷滚,已是汗流浹背需曾。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留祈远,地道東北人呆万。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像车份,于是被迫代替她去往敵國和親谋减。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,435評論 2 359

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

  • Paint類 setAlpha(int a) 透明度 setColor(int color)設(shè)置顏色值 setAn...
    wdply閱讀 1,047評論 0 0
  • Paint 類持有繪制圖形扫沼、文本出爹、圖像的樣式和色彩信息庄吼,并且對外提供了一系列方法來設(shè)置這些信息。 一严就、畫筆基本操作...
    秀花123閱讀 4,317評論 1 7
  • 導(dǎo)航 Android Paint之顏色過濾器 Paint之shader(圖像渲染) Paint之PathEffec...
    侯蛋蛋_閱讀 4,591評論 0 5
  • 從自卑的陰影中走出來 文:我是素顏 母親的教育對我們的印象很深总寻,母親總是自謙地說:嗨,他們不行梢为。這個記憶在我們兄妹...
    我是素顏閱讀 425評論 0 0
  • 今天是個好日子渐行,風(fēng)和日麗萬里無云 風(fēng)兒吹著小曲親吻你 樹葉跳著華爾茲撲向大地 一如反顧的就像你 走向著骯臟的世界 ...
    洛璃閱讀 208評論 0 0