(轉)Android Paint API總結和使用方法

轉自:http://blog.csdn.net/shell812/article/details/49781397?ref=myread

相關文章:
http://www.cnblogs.com/tianzhijiexian/p/4297170.html?utm_source=tuicool&utm_medium=referral
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2012/1212/703.html

Paint 操作函數 2015年5月15日 Android 4.4

// 重置Paint。
void reset();
void set(Paint src);
void setCompatibilityScaling(float factor);
void setBidiFlags(int flags);
void setFlags(int flags);
void setHinting(int mode);
// 是否抗鋸齒
void setAntiAlias(boolean aa);
// 設定是否使用圖像抖動處理,會使繪制出來的圖片顏色更加平滑和飽滿,圖像更加清晰  
void setDither(boolean dither);
// 設置線性文本
void setLinearText(boolean linearText);
// 設置該項為true,將有助于文本在LCD屏幕上的顯示效果  
void setSubpixelText(boolean subpixelText);
// 設置下劃線
void setUnderlineText(boolean underlineText);
// 設置帶有刪除線的效果 
void setStrikeThruText(boolean strikeThruText);
// 設置偽粗體文本,設置在小字體上效果會非常差  
void setFakeBoldText(boolean fakeBoldText);
// 如果該項設置為true,則圖像在動畫進行中會濾掉對Bitmap圖像的優化操作
// 加快顯示速度,本設置項依賴于dither和xfermode的設置  
void setFilterBitmap(boolean filter);
// 設置畫筆風格,空心或者實心 FILL,FILL_OR_STROKE,或STROKE
// Paint.Style.STROKE 表示當前只繪制圖形的輪廓,而Paint.Style.FILL表示填充圖形。  
void setStyle(Style style);
// 設置顏色值
void setColor(int color);
// 設置透明圖0~255,要在setColor后面設置才生效
void setAlpha(int a);   
// 設置RGB及透明度
void setARGB(int a, int r, int g, int b);  
// 當畫筆樣式為STROKE或FILL_OR_STROKE時,設置筆刷的粗細度  
void setStrokeWidth(float width);
void setStrokeMiter(float miter);
// 當畫筆樣式為STROKE或FILL_OR_STROKE時,設置筆刷末端的圖形樣式
// 如圓形樣式Cap.ROUND,或方形樣式Cap.SQUARE  
void setStrokeCap(Cap cap);
// 設置繪制時各圖形的結合方式,如平滑效果等  
void setStrokeJoin(Join join);
// 設置圖像效果,使用Shader可以繪制出各種漸變效果  
Shader setShader(Shader shader);
// 設置顏色過濾器,可以在繪制顏色時實現不用顏色的變換效果 
ColorFilter setColorFilter(ColorFilter filter);
// 設置圖形重疊時的處理方式,如合并,取交集或并集,經常用來制作橡皮的擦除效果 
Xfermode setXfermode(Xfermode xfermode);
// 設置繪制路徑的效果,如點畫線等 
PathEffect setPathEffect(PathEffect effect);
// 設置MaskFilter,可以用不同的MaskFilter實現濾鏡的效果,如濾化,立體等  
MaskFilter setMaskFilter(MaskFilter maskfilter);
// 設置Typeface對象,即字體風格,包括粗體,斜體以及襯線體,非襯線體等  
Typeface setTypeface(Typeface typeface);
// 設置光柵化
Rasterizer setRasterizer(Rasterizer rasterizer);
// 在圖形下面設置陰影層,產生陰影效果,radius為陰影的角度,dx和dy為陰影在x軸和y軸上的距離,color為陰影的顏色
// 注意:在Android4.0以上默認開啟硬件加速,有些圖形的陰影無法顯示。關閉View的硬件加速 view.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
void setShadowLayer(float radius, float dx, float dy, int color);
// 設置文本對齊
void setTextAlign(Align align);
// 設置字體大小
void setTextSize(float textSize);
// 設置文本縮放倍數,1.0f為原始
void setTextScaleX(float scaleX);
// 設置斜體文字,skewX為傾斜弧度  
void setTextSkewX(float skewX);

圖像陰影效果setShadowLayer使用方法

Paint paint = new Paint();
paint.setStyle(Paint.Style.FILL);
paint.setColor(Color.BLACK);
// 設置透明度,要在setColor后面設置才生效
paint.setAlpha(80);

// 如果不關閉硬件加速,setShadowLayer無效
setLayerType(View.LAYER_TYPE_SOFTWARE, null);
// (陰影的半徑,X軸方向上相對主體的位移,Y軸相對位移)
paint.setShadowLayer(10, 10, 10, Color.BLACK);
paint.setTextSize(30);
canvas.drawText("畫一個很大的圓", 80, 50, paint);

// cx和cy為圓點的坐標
int radius = 80;
int offest = 40;
int startX = radius + offest;
int startY = radius + offest + 40;

canvas.drawCircle(startX, startY, radius, paint);

paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(5);
paint.setShadowLayer(20, -20, 10, Color.BLACK);
canvas.drawCircle(startX + radius * 2 + offest, startY, radius, paint);
Paste_Image.png

setXfermode使用方法

Xfer詞意為傳送,在里可以解釋為:第二次的圖像是通過何種模式傳送到第前一次圖像里的,說白了,就是兩個圖像如何疊加。
Paint的Xfermode有3種,都是繼承Xfermode:
1)AvoidXfermode 指定了一個顏色和容差,強制Paint避免在它上面繪圖(或者只在它上面繪圖)。
2)PixelXorXfermode 當覆蓋已有的顏色時,應用一個簡單的像素XOR操作。
3)PorterDuffXfermode 這是一個非常強大的轉換模式,使用它,可以使用圖像合成的16條Porter-Duff規則
在Android SDK自帶的ApiDemo里沒有前兩者的案例。可能是因為PorterDuffXfermode太強大了,這里也就只介紹PorterDuffXfermode了。

    private static final Xfermode[] sModes = {
        new PorterDuffXfermode(PorterDuff.Mode.CLEAR),      // 清空所有,要閉硬件加速,否則無效
        new PorterDuffXfermode(PorterDuff.Mode.SRC),        // 顯示前都圖像,不顯示后者
        new PorterDuffXfermode(PorterDuff.Mode.DST),        // 顯示后者圖像,不顯示前者
        new PorterDuffXfermode(PorterDuff.Mode.SRC_OVER),   // 后者疊于前者
        new PorterDuffXfermode(PorterDuff.Mode.DST_OVER),   // 前者疊于后者
        new PorterDuffXfermode(PorterDuff.Mode.SRC_IN),     // 顯示相交的區域,但圖像為后者
        new PorterDuffXfermode(PorterDuff.Mode.DST_IN),     // 顯示相交的區域,但圖像為前者
        new PorterDuffXfermode(PorterDuff.Mode.SRC_OUT),    // 顯示后者不重疊的圖像
        new PorterDuffXfermode(PorterDuff.Mode.DST_OUT),    // 顯示前者不重疊的圖像
        new PorterDuffXfermode(PorterDuff.Mode.SRC_ATOP),   // 顯示前者圖像,與后者重合的圖像
        new PorterDuffXfermode(PorterDuff.Mode.DST_ATOP),   // 顯示后者圖像,與前者重合的圖像
        new PorterDuffXfermode(PorterDuff.Mode.XOR),        // 顯示持有不重合的圖像
        new PorterDuffXfermode(PorterDuff.Mode.DARKEN),     // 后者疊于前者上,后者與前者重疊的部份透明。要閉硬件加速,否則無效
        new PorterDuffXfermode(PorterDuff.Mode.LIGHTEN),    // 前者疊于前者,前者與后者重疊部份透明。要閉硬件加速,否則無效
        new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY),   // 顯示重合的圖像,且顏色會合拼
        new PorterDuffXfermode(PorterDuff.Mode.SCREEN)    // 顯示持有圖像,重合的會變白
    };
20151111144041929.png

如果把第二層透明度設為160后效果如下:

20151111144107126.png

Paint類setMaskFilter函數的使用

setMaskFilter的參數MaskFilter有兩個子類:EmbossMaskFilter和BlurMaskFilter。
BlurMaskFilter 指定了一個模糊的樣式和半徑來處理Paint的邊緣。
EmbossMaskFilter 指定了光源的方向和環境光強度來添加浮雕效果。

// 設置光源的方向
float[] direction = new float[] { 1, 1, 1 };
//設置環境光亮度
float light = 0.4f;
// 選擇要應用的反射等級
float specular = 6;
// 向mask應用一定級別的模糊
float blur = 3.5f;
EmbossMaskFilter emboss = new EmbossMaskFilter(direction, light, specular, blur);
// 應用mask
myPaint.setMaskFilter(emboss);

mBlur = new BlurMaskFilter(10, BlurMaskFilter.Blur.SOLID);
mPaint.setMaskFilter(mBlur);
20151111144136816.jpg
20151111144154252.png

顏色漸變setShader的使用

LinearGradient設置顏色沒變的屬性

/* 
 * LinearGradient shader = new LinearGradient(0, 0, endX, endY, new 
 * int[]{startColor, midleColor, endColor},new float[]{0 , 0.5f, 
 * 1.0f}, TileMode.MIRROR); 
 * 參數一為漸變起初點坐標x位置,參數二為y軸位置,參數三和四分辨對應漸變終點 
 * 其中參數new int[]{startColor, midleColor,endColor}是參與漸變效果的顏色集合,  
 * 其中參數new float[]{0 , 0.5f, 1.0f}是定義每個顏色處于的漸變相對位置,這個參數可以為null,如果為null表示所有的顏色按順序均勻的分布 
 */  
Shader mShader = new LinearGradient(0, 0, 100, 100, new int[] { Color.RED, Color.GREEN, Color.BLUE, Color.YELLOW }, null, Shader.TileMode.REPEAT);  
paint.setShadowLayer(20, -20, 10, Color.BLACK);  // 設置陰影

// Shader.TileMode三種模式  
// REPEAT:沿著漸變方向循環重復  
// CLAMP:如果在預先定義的范圍外畫的話,就重復邊界的顏色  
// MIRROR:與REPEAT一樣都是循環重復,但這個會對稱重復  
paint.setShader(mShader);// 用Shader中定義定義的顏色來話  
20151111144218196.jpg

PathEffect 類的使用:

e[0] = null;     // no effect
// CornerPathEffect(角度)
e[1] = new CornerPathEffect(10);  // 線帶角度的地方會變成弧形
// ({線長度,間隔大小},與上一次的偏移量)
e[2] = new DashPathEffect(new float[] {10, 5, 5, 5}, phase);
e[3] = new PathDashPathEffect(makePathDash(), 12, phase, PathDashPathEffect.Style.ROTATE);
// 兩種效果全拼,先使用第一種,再使用第二種
e[4] = new ComposePathEffect(e[2], e[1]);
e[5] = new ComposePathEffect(e[3], e[1]);
20151111144251962.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,098評論 25 708
  • 在Paint中有很多的屬性可以設置,比如可以設置陰影,顏色過濾等等,這些會產生不同的奇妙效果,今天就對各種屬性探索...
    Jwennnnnnnnnn閱讀 2,418評論 0 2
  • 在上篇說道BitmapShader的使用關于Shader.TileMode這個參數在說明一下Shader.Tile...
    大大大寒閱讀 1,568評論 3 1
  • Sooner thirty threeOh, my God, what are you doing? I real...
    鹿晗是我閱讀 146評論 0 0
  • 還記得孩童時代的我們期盼過節,尤其是春節,它有著傳統文化深深地烙印, 還承接著人與人之間最柔軟最隱秘的情感...
    JH素年錦時閱讀 441評論 0 3