轉自: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);
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) // 顯示持有圖像,重合的會變白
};
如果把第二層透明度設為160后效果如下:
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);
顏色漸變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中定義定義的顏色來話
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]);