亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

【Android】Paint的效果研究

系統(tǒng) 2334 0

在Paint中有很多的屬性可以設(shè)置,比如可以設(shè)置陰影,顏色過(guò)濾等等,這些會(huì)產(chǎn)生不同的奇妙效果,今天就對(duì)各種屬性探索一下。

方法一:

          
            1
          
          
            //
          
          
            設(shè)置繪制的顏色,a代表透明度,r,g,b代表顏色值。 
          
          
            2
          
           setARGB(
          
            int
          
           a,
          
            int
          
           r,
          
            int
          
           g,
          
            int
          
           b);  
        

這個(gè)不多說(shuō)了,還有兩個(gè)類似的方法,將設(shè)置alpha和rgb分割開(kāi)來(lái)了。注意的是這里的a值是0~255的范圍,不是小數(shù)。

方法二:

          
            //
          
          
            設(shè)置是否使用抗鋸齒功能,會(huì)消耗較大資源,繪制圖形速度會(huì)變慢。
          
          
setAntiAlias(
          
            boolean
          
           aa);  
        

也不多說(shuō),你可以試驗(yàn)一下效果,設(shè)置后會(huì)平滑一些;

方法三:

          
            1
          
          
            //
          
          
            設(shè)定是否使用圖像抖動(dòng)處理,會(huì)使繪制出來(lái)的圖片顏色更加平滑和飽滿,圖像更加清晰 
          
          
            2
          
           setDither(
          
            boolean
          
           dither);  
        

方法四:

          
            1
          
          
            //
          
          
            設(shè)置MaskFilter,可以用不同的MaskFilter實(shí)現(xiàn)濾鏡的效果,如濾化,立體等 
          
          
            2
          
           setMaskFilter(MaskFilter maskfilter);  
        

MaskFilter類可以為Paint分配邊緣效果。
對(duì)MaskFilter的擴(kuò)展可以對(duì)一個(gè)Paint邊緣的alpha通道應(yīng)用轉(zhuǎn)換。Android包含了下面幾種MaskFilter:
BlurMaskFilter???指定了一個(gè)模糊的樣式和半徑來(lái)處理Paint的邊緣。
EmbossMaskFilter??指定了光源的方向和環(huán)境光強(qiáng)度來(lái)添加浮雕效果。
要應(yīng)用一個(gè)MaskFilter,可以使用setMaskFilter方法,并傳遞給它一個(gè)MaskFilter對(duì)象。下面的例子是對(duì)一個(gè)已經(jīng)存在的Paint應(yīng)用一個(gè)EmbossMaskFilter:

          
             1
          
          
            //
          
          
             設(shè)置光源的方向
          
          
             2
          
          
            float
          
          [] direction = 
          
            new
          
          
            float
          
          []{ 1, 1, 1
          
             };

          
          
             3
          
          
             4
          
          
            //
          
          
            設(shè)置環(huán)境光亮度
          
          
             5
          
          
            float
          
           light = 0.4f
          
            ;

          
          
             6
          
          
             7
          
          
            //
          
          
             選擇要應(yīng)用的反射等級(jí)
          
          
             8
          
          
            float
          
           specular = 6
          
            ;

          
          
             9
          
          
            10
          
          
            //
          
          
             向mask應(yīng)用一定級(jí)別的模糊
          
          
            11
          
          
            float
          
           blur = 3.5f
          
            ;

          
          
            12
          
          
            13
          
           EmbossMaskFilter emboss=
          
            new
          
          
             EmbossMaskFilter(direction,light,specular,blur);

          
          
            14
          
          
            15
          
          
            //
          
          
             應(yīng)用mask 
          
          
            16
          
           myPaint.setMaskFilter(emboss);
        

可以看一下下面的圖,是不是有浮雕的效果??

【Android】Paint的效果研究

再看下面使用BlurMaskFilter:

          
            1
          
          
            //
          
          
            前面一個(gè)控制陰影的寬度,后面一個(gè)參數(shù)控制陰影效果
          
          
            2
          
           maskFilter = 
          
            new
          
           BlurMaskFilter(10, BlurMaskFilter.Blur.SOLID);
        

【Android】Paint的效果研究

是不是有陰影效果呢??

方法五:

          
            1
          
          
            //
          
          
            設(shè)置顏色過(guò)濾器,可以在繪制顏色時(shí)實(shí)現(xiàn)不用顏色的變換效果
          
          
            2
          
           setColorFilter(ColorFilter colorfilter);  
        

這個(gè)方法也值得試驗(yàn)一下:

MaskFilter是對(duì)一個(gè)Paint的alpha通道的轉(zhuǎn)換,而ColorFilter則是對(duì)每一個(gè)RGB通道應(yīng)用轉(zhuǎn)換。所有由ColorFilter所派生的類在執(zhí)行它們的轉(zhuǎn)換時(shí),都會(huì)忽略alpha通道。

這個(gè)貌似比較麻煩,改天再說(shuō)。

方法六:

          
            1
          
          
            //
          
          
            設(shè)置繪制路徑的效果,如點(diǎn)畫線等
          
          
            2
          
           setPathEffect(PathEffect effect);  
        

又是一個(gè)很好玩的方法:

到目前為止,所有的效應(yīng)都會(huì)影響到Paint填充圖像的方式;PathEffect是用來(lái)控制繪制輪廓(線條)的方式。PathEffect對(duì)于繪制Path基本圖形特別有用,但是它們也可以應(yīng)用到任何Paint中從而影響線條繪制的方式。
使用PathEffect,可以改變一個(gè)形狀的邊角的外觀并且控制輪廓的外表。Android包含了多個(gè)PathEffect,包括:
1)CornerPathEffect??可以使用圓角來(lái)代替尖銳的角從而對(duì)基本圖形的形狀尖銳的邊角進(jìn)行平滑。

2)DashPathEffect??可以使用DashPathEffect來(lái)創(chuàng)建一個(gè)虛線的輪廓(短橫線/小圓點(diǎn)),而不是使用實(shí)線。你還可以指定任意的虛/實(shí)線段的重復(fù)模式。

3) DiscretePathEffect??與DashPathEffect相似,但是添加了隨機(jī)性。當(dāng)繪制它的時(shí)候,需要指定每一段的長(zhǎng)度和與原始路徑的偏離度。

4)PathDashPathEffect??這種效果可以定義一個(gè)新的形狀(路徑)并將其用作原始路徑的輪廓標(biāo)記。
下面的效果可以在一個(gè)Paint中組合使用多個(gè)Path Effect。
1)SumPathEffect??順序地在一條路徑中添加兩種效果,這樣每一種效果都可以應(yīng)用到原始路徑中,而且兩種結(jié)果可以結(jié)合起來(lái)。
2)ComposePathEffect??將兩種效果組合起來(lái)應(yīng)用,先使用第一種效果,然后在這種效果的基礎(chǔ)上應(yīng)用第二種效果。
對(duì)象形狀的PathEffect的改變會(huì)影響到形狀的區(qū)域。這就能夠保證應(yīng)用到相同形狀的填充效果將會(huì)繪制到新的邊界中。
使用setPathEffect方法可以把PathEffect應(yīng)用到Paint對(duì)象中,如下所示:

          
            1
          
           paint.setPathEffect(
          
            new
          
           CornerPathEffect(10));
        

其他效果懶得測(cè)試了,這個(gè)在模擬器上跑的時(shí)候效果也不明顯,但是真機(jī)上跑的時(shí)候的確圓滑了許多,看上去很舒服

方法七:

          
            1
          
          
            //
          
          
            設(shè)置圖形重疊時(shí)的處理方式,如合并,取交集或并集,經(jīng)常用來(lái)制作橡皮的擦除效果
          
          
            2
          
           setXfermode(Xfermode xfermode);   
        

橡皮擦,這是個(gè)好方法啊,看看。

可以通過(guò)修改Paint的Xfermode來(lái)影響在Canvas已有的圖像上面繪制新的顏色的方式。
在正常的情況下,在已有的圖像上繪圖將會(huì)在其上面添加一層新的形狀。如果新的Paint是完全不透明的,那么它將完全遮擋住下面的Paint;如果它是部分透明的,那么它將會(huì)被染上下面的顏色。下面的Xfermode子類可以改變這種行為:
1)AvoidXfermode??指定了一個(gè)顏色和容差,強(qiáng)制Paint避免在它上面繪圖(或者只在它上面繪圖)。
2)PixelXorXfermode??當(dāng)覆蓋已有的顏色時(shí),應(yīng)用一個(gè)簡(jiǎn)單的像素XOR操作。
3)PorterDuffXfermode??這是一個(gè)非常強(qiáng)大的轉(zhuǎn)換模式,使用它,可以使用圖像合成的16條Porter-Duff規(guī)則的任意一條來(lái)控制Paint如何與已有的Canvas圖像進(jìn)行交互。
要應(yīng)用轉(zhuǎn)換模式,可以使用setXferMode方法,如下所示: ?

          
            1
          
           AvoidXfermode avoid = 
          
            new
          
           AvoidXfermode(Color.BLUE, 10
          
            , AvoidXfermode.Mode. AVOID); 

          
          
            2
          
           borderPen.setXfermode(avoid);
        

這里可以實(shí)現(xiàn)完美的橡皮擦功能!代碼異常簡(jiǎn)單:

          
            1
          
           Xfermode xFermode = 
          
            new
          
          
             PorterDuffXfermode(PorterDuff.Mode.CLEAR);

          
          
            2
          
           paint.setXfermode(xFermode);
        

這是使用的最后一個(gè)子類,關(guān)于16條Porter-Duff規(guī)則,如下:

          
             1
          
          
            private
          
          
            static
          
          
            final
          
           Xfermode[] sModes =
          
             {

          
          
             2
          
          
            new
          
          
             PorterDuffXfermode(PorterDuff.Mode.CLEAR),

          
          
             3
          
          
            new
          
          
             PorterDuffXfermode(PorterDuff.Mode.SRC),

          
          
             4
          
          
            new
          
          
             PorterDuffXfermode(PorterDuff.Mode.DST),

          
          
             5
          
          
            new
          
          
             PorterDuffXfermode(PorterDuff.Mode.SRC_OVER),

          
          
             6
          
          
            new
          
          
             PorterDuffXfermode(PorterDuff.Mode.DST_OVER),

          
          
             7
          
          
            new
          
          
             PorterDuffXfermode(PorterDuff.Mode.SRC_IN),

          
          
             8
          
          
            new
          
          
             PorterDuffXfermode(PorterDuff.Mode.DST_IN),

          
          
             9
          
          
            new
          
          
             PorterDuffXfermode(PorterDuff.Mode.SRC_OUT),

          
          
            10
          
          
            new
          
          
             PorterDuffXfermode(PorterDuff.Mode.DST_OUT),

          
          
            11
          
          
            new
          
          
             PorterDuffXfermode(PorterDuff.Mode.SRC_ATOP),

          
          
            12
          
          
            new
          
          
             PorterDuffXfermode(PorterDuff.Mode.DST_ATOP),

          
          
            13
          
          
            new
          
          
             PorterDuffXfermode(PorterDuff.Mode.XOR),

          
          
            14
          
          
            new
          
          
             PorterDuffXfermode(PorterDuff.Mode.DARKEN),

          
          
            15
          
          
            new
          
          
             PorterDuffXfermode(PorterDuff.Mode.LIGHTEN),

          
          
            16
          
          
            new
          
          
             PorterDuffXfermode(PorterDuff.Mode.MULTIPLY),

          
          
            17
          
          
            new
          
          
             PorterDuffXfermode(PorterDuff.Mode.SCREEN)

          
          
            18
          
                   };
        

它們每個(gè)顯示的效果具體如下:

【Android】Paint的效果研究

第一個(gè)就是Clear效果!

上面很多的圖都是由SDK APIDemos運(yùn)行所得~~有時(shí)間仔細(xì)研究一下Graphics中的每個(gè)Activity。

?

?

        /**  
     * Paint類介紹  
     *   
     * Paint即畫筆,在繪圖過(guò)程中起到了極其重要的作用,畫筆主要保存了顏色,  
     * 樣式等繪制信息,指定了如何繪制文本和圖形,畫筆對(duì)象有很多設(shè)置方法,  
     * 大體上可以分為兩類,一類與圖形繪制相關(guān),一類與文本繪制相關(guān)。         
     *   
     * 1.圖形繪制  
     * setARGB(int a,int r,int g,int b);  
     * 設(shè)置繪制的顏色,a代表透明度,r,g,b代表顏色值。  
     *   
     * setAlpha(int a);  
     * 設(shè)置繪制圖形的透明度。  
     *   
     * setColor(int color);  
     * 設(shè)置繪制的顏色,使用顏色值來(lái)表示,該顏色值包括透明度和RGB顏色。  
     *   
    * setAntiAlias(boolean aa);  
     * 設(shè)置是否使用抗鋸齒功能,會(huì)消耗較大資源,繪制圖形速度會(huì)變慢。  
     *   
     * setDither(boolean dither);  
     * 設(shè)定是否使用圖像抖動(dòng)處理,會(huì)使繪制出來(lái)的圖片顏色更加平滑和飽滿,圖像更加清晰  
     *   
     * setFilterBitmap(boolean filter);  
     * 如果該項(xiàng)設(shè)置為true,則圖像在動(dòng)畫進(jìn)行中會(huì)濾掉對(duì)Bitmap圖像的優(yōu)化操作,加快顯示  
     * 速度,本設(shè)置項(xiàng)依賴于dither和xfermode的設(shè)置  
     *   
     * setMaskFilter(MaskFilter maskfilter);  
     * 設(shè)置MaskFilter,可以用不同的MaskFilter實(shí)現(xiàn)濾鏡的效果,如濾化,立體等       *   
     * setColorFilter(ColorFilter colorfilter);  
     * 設(shè)置顏色過(guò)濾器,可以在繪制顏色時(shí)實(shí)現(xiàn)不用顏色的變換效果  
     *   
     * setPathEffect(PathEffect effect);  
     * 設(shè)置繪制路徑的效果,如點(diǎn)畫線等  
     *   
     * setShader(Shader shader);  
     * 設(shè)置圖像效果,使用Shader可以繪制出各種漸變效果  
     *  
     * setShadowLayer(float radius ,float dx,float dy,int color);  
     * 在圖形下面設(shè)置陰影層,產(chǎn)生陰影效果,radius為陰影的角度,dx和dy為陰影在x軸和y軸上的距離,color為陰影的顏色  
     *   
     * setStyle(Paint.Style style);  
     * 設(shè)置畫筆的樣式,為FILL,F(xiàn)ILL_OR_STROKE,或STROKE  
     *   
     * setStrokeCap(Paint.Cap cap);  
     * 當(dāng)畫筆樣式為STROKE或FILL_OR_STROKE時(shí),設(shè)置筆刷的圖形樣式,如圓形樣式  
     * Cap.ROUND,或方形樣式Cap.SQUARE  
     *   
     * setSrokeJoin(Paint.Join join);  
     * 設(shè)置繪制時(shí)各圖形的結(jié)合方式,如平滑效果等  
     *   
     * setStrokeWidth(float width);  
     * 當(dāng)畫筆樣式為STROKE或FILL_OR_STROKE時(shí),設(shè)置筆刷的粗細(xì)度  
     *   
     * setXfermode(Xfermode xfermode);  
     * 設(shè)置圖形重疊時(shí)的處理方式,如合并,取交集或并集,經(jīng)常用來(lái)制作橡皮的擦除效果  
     *   
     * 2.文本繪制  
     * setFakeBoldText(boolean fakeBoldText);  
     * 模擬實(shí)現(xiàn)粗體文字,設(shè)置在小字體上效果會(huì)非常差  
     *   
     * setSubpixelText(boolean subpixelText);  
     * 設(shè)置該項(xiàng)為true,將有助于文本在LCD屏幕上的顯示效果  
     *   
     * setTextAlign(Paint.Align align);  
     * 設(shè)置繪制文字的對(duì)齊方向  
     *   
   * setTextScaleX(float scaleX);  
    * 設(shè)置繪制文字x軸的縮放比例,可以實(shí)現(xiàn)文字的拉伸的效果  
     *   
     * setTextSize(float textSize);  
     * 設(shè)置繪制文字的字號(hào)大小  
     *   
     * setTextSkewX(float skewX);  
     * 設(shè)置斜體文字,skewX為傾斜弧度  
     *   
     * setTypeface(Typeface typeface);  
     * 設(shè)置Typeface對(duì)象,即字體風(fēng)格,包括粗體,斜體以及襯線體,非襯線體等  
     *   
     * setUnderlineText(boolean underlineText);  
     * 設(shè)置帶有下劃線的文字效果  
     *   
     * setStrikeThruText(boolean strikeThruText);  
     * 設(shè)置帶有刪除線的效果  
     *   
     */
      

?

        private class MyView2 extends View {

        public MyView2(Context context) {

            super(context);

        }

        @Override
        protected void onDraw(Canvas canvas)

        {

            super.onDraw(canvas);

            canvas.drawColor(Color.WHITE);

            Paint paint = new Paint();

            paint.setAntiAlias(true);

            paint.setColor(Color.RED);

            paint.setStyle(Paint.Style.STROKE);//設(shè)置為空心

            paint.setStrokeWidth(3);

            canvas.drawCircle(40, 40, 30, paint);

            canvas.drawRect(10, 90, 70, 150, paint);

            canvas.drawRect(10, 170, 70, 200, paint);

            canvas.drawOval(new RectF(10, 220, 70, 250), paint);

            Path path = new Path();//三角形

            path.moveTo(10, 330);

            path.lineTo(70, 330);

            path.lineTo(40, 270);

            path.close();

            canvas.drawPath(path, paint);

            Path path1 = new Path();//梯形

            path1.moveTo(10, 410);//繪畫基點(diǎn)

            path1.lineTo(70, 410);

            path1.lineTo(55, 350);

            path1.lineTo(25, 350);

            path1.close();//把開(kāi)始的點(diǎn)和最后的點(diǎn)連接在一起,構(gòu)成一個(gè)封閉圖形
            /*
             * 最重要的就是movtTo和close,如果是Style.FILL的話,不設(shè)置close,也沒(méi)有區(qū)別,可是如果是STROKE模式,
             * 如果不設(shè)置close,圖形不封閉。
             * 
             * 當(dāng)然,你也可以不設(shè)置close,再添加一條線,效果一樣。
             */
            canvas.drawPath(path1, paint);
            
            
            
            
            ///////////////////////////////////////第二列

            paint.setColor(Color.BLUE);

            paint.setStyle(Paint.Style.FILL);//設(shè)置實(shí)心

            canvas.drawCircle(120, 40, 30, paint);

            canvas.drawRect(90, 90, 150, 150, paint);

            canvas.drawRect(90, 170, 150, 200, paint);

            RectF re2 = new RectF(90, 220, 150, 250);

            canvas.drawOval(re2, paint);

            Path path2 = new Path();

            path2.moveTo(90, 330);

            path2.lineTo(150, 330);

            path2.lineTo(120, 270);

            path2.close();

            canvas.drawPath(path2, paint);

            Path path3 = new Path();

            path3.moveTo(90, 410);

            path3.lineTo(150, 410);

            path3.lineTo(135, 350);

            path3.lineTo(105, 350);

            path3.close();

            canvas.drawPath(path3, paint);
            
            
            ////////////////////////////////////////////////////第三列
            
            /*
             * LinearGradient shader = new LinearGradient(0, 0, endX, endY, new
             * int[]{startColor, midleColor, endColor},new float[]{0 , 0.5f,
             * 1.0f}, TileMode.MIRROR);
             * 參數(shù)一為漸變起初點(diǎn)坐標(biāo)x位置,參數(shù)二為y軸位置,參數(shù)三和四分辨對(duì)應(yīng)漸變終點(diǎn)
             * 其中參數(shù)new int[]{startColor, midleColor,endColor}是參與漸變效果的顏色集合, 
             * 其中參數(shù)new float[]{0 , 0.5f, 1.0f}是定義每個(gè)顏色處于的漸變相對(duì)位置, 這個(gè)參數(shù)可以為null,如果為null表示所有的顏色按順序均勻的分布
             */
            Shader mShader = new LinearGradient(0, 0, 100, 100,

            new int[] { Color.RED, Color.GREEN, Color.BLUE, Color.YELLOW },

            null, Shader.TileMode.REPEAT);

            // Shader.TileMode三種模式

            // REPEAT:沿著漸變方向循環(huán)重復(fù)

            // CLAMP:如果在預(yù)先定義的范圍外畫的話,就重復(fù)邊界的顏色

            // MIRROR:與REPEAT一樣都是循環(huán)重復(fù),但這個(gè)會(huì)對(duì)稱重復(fù)

            paint.setShader(mShader);// 用Shader中定義定義的顏色來(lái)話

            canvas.drawCircle(200, 40, 30, paint);

            canvas.drawRect(170, 90, 230, 150, paint);

            canvas.drawRect(170, 170, 230, 200, paint);

            RectF re3 = new RectF(170, 220, 230, 250);

            canvas.drawOval(re3, paint);

            Path path4 = new Path();

            path4.moveTo(170, 330);

            path4.lineTo(230, 330);

            path4.lineTo(200, 270);

            path4.close();

            canvas.drawPath(path4, paint);

            Path path5 = new Path();

            path5.moveTo(170, 410);

            path5.lineTo(230, 410);

            path5.lineTo(215, 350);

            path5.lineTo(185, 350);

            path5.close();

            canvas.drawPath(path5, paint);
            
            //////////////////////////////////第4列

            paint.setTextSize(24);

            canvas.drawText("圓形", 240, 50, paint);

            canvas.drawText("正方形", 240, 120, paint);

            canvas.drawText("長(zhǎng)方形", 240, 190, paint);

            canvas.drawText("橢圓形", 240, 250, paint);

            canvas.drawText("三角形", 240, 320, paint);

            canvas.drawText("梯形", 240, 390, paint);

        }

    }
      

? 【Android】Paint的效果研究

【Android】Paint的效果研究


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 国产欧美日韩精品第三区 | 免费久久精品国产片香蕉 | 亚洲欧美国产高清va在线播放 | 成人精品一区久久久久 | 青青草免费视频在线播放 | 亚洲最大视频网站 | 国产一区亚洲二区 | 夜夜嘿视频免费看 | 日本一级毛片片在线播放 | 免费观看日本特色做爰视频在线 | 亚洲不卡在线 | 精品国产综合 | 5060网一级毛片免费观看 | 综合网激情 | 欧美亚洲国产激情一区二区 | 四虎综合九九色九九综合色 | 久久这里只有精品23 | 欧美洲精品亚洲精品中文字幕 | 久久久欧美综合久久久久 | 国产福利91精品一区二区三区 | 欧美专区在线播放 | 成人精品国产亚洲欧洲 | 久久久亚洲欧洲日产国码二区 | 免费观看一区二区 | 久久99九九 | 一级激情视频 | 欧美在线视频一区二区 | 热99在线 | 国偷盗摄自产福利一区在线 | 26uuu欧美| 国产一区视频在线 | 黄色成人毛片 | 青青久久99久久99久久999 | 五月婷婷狠狠 | 2021久久精品99精品久久 | 精品国产96亚洲一区二区三区 | 欧美大屁股精品毛片视频 | 亚洲精品亚洲九十七页 | 国产福利视精品永久免费 | 激情综合网五月 | 人人澡 人人澡 人人看欧美 |