private static class SampleView extends View {
private Bitmap mBitmap;
private Bitmap mBitmap2;
private Bitmap mBitmap3;
private Shader mShader;
private static void drawIntoBitmap(Bitmap bm) {
float x = bm.getWidth();
float y = bm.getHeight();
Canvas c = new Canvas(bm);
Paint p = new Paint();
/* Paint類的一個邊緣光滑的方法,true表示邊緣光滑*/
p.setAntiAlias(true);
p.setAlpha(0x80);/設置顏色透明度爲十六進制80(半透明),0x00全透明,0xFF不透明
/*在位圖矩陣區域內畫一個相切的圓*/
c.drawCircle(x/2, y/2, x/2, p);
p.setAlpha(0x30);
/*用指定的PorterDuff模型創建xformode,PorterDuff.Mode.SRC
* 表示下面要繪製的文本應在上面繪製的圓的上層
*/
p.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC));
p.setTextSize(60);
/*Paint.Align 是文本對齊方式的一個枚舉類
* CENTER表示文本居中
* LEFT 表示做對齊
* RIGHT 表示右對齊
*/
p.setTextAlign(Paint.Align.CENTER);
/*FontMetrics是字體度量的類描述了給定文本大小的各種各樣的字體度量。
* ascent 表示到基準線之上的距離
* bottom 表示到基準線之下的最大距離,它是最低的字體類型
* descent 表示到基準線之下的距離
* leading 空格字符到基準線的距離,爲0
* */
Paint.FontMetrics fm = p.getFontMetrics();
c.drawText("Alpha", x/2, (y-fm.ascent)/2, p);
}
public SampleView(Context context) {
super(context);
setFocusable(true);
/*取得資源文件的輸入流*/
InputStream is = context.getResources()
.openRawResource(R.drawable.app_sample_code);
/*BitmapFactory 是位圖的一個工廠類
* 從各種各樣的位圖對象中創建位圖對象,包括文件,流,字節數組。
* */
mBitmap = BitmapFactory.decodeStream(is);
/*extractAlpha()位圖的這個方法是通過提取
* 了原始位圖的透明通道值重建新的位圖*/
mBitmap2 = mBitmap.extractAlpha();
/*通過位圖的寬度和高度已經位圖的顏色配置來創建位圖
* Bitmap.Config是內部枚舉類表示位圖的顏色配置
* 它的顏色配置有ALPHA_8、ARGB_4444、ARGB_8888、RGB_565
* */
mBitmap3 = Bitmap.createBitmap(200, 200, Bitmap.Config.ALPHA_8);
drawIntoBitmap(mBitmap3);
/*LinearGradient類是Shader的一個子類,它實現的是一個線性梯度變化的一個
* 着色器,(0,0)到(100,70)的直線式顏色梯度變化線
* 這個梯度變化是在紅綠藍之間均勻變化的
* Shader.TileMode是超出梯度線的顏色變化模式
*CLAMP 固定shader繪畫時顏色超過原始邊界(梯度線)的部分顏色用邊界顏色繪製。
*REPEAT 在水平和垂直方向重複使用着色器的色相,但邊界分明
*MIRROR 在水平和垂直方向重複使用着色器的色相,交換的映像色相使得鄰
*近的色相總是一致;顏色關於梯度線鏡像
* */
mShader = new LinearGradient(0, 0, 100, 70,
new int[] {Color.RED, Color.GREEN, Color.BLUE },
null, Shader.TileMode.MIRROR);
}
@Override protected void onDraw(Canvas canvas) {
canvas.drawColor(Color.WHITE);
Paint p = new Paint();
float y = 10;
/*設置畫筆顏色爲紅色*/
p.setColor(Color.RED);
/*調用畫布的drawBitmap方法在指定的位置用指定的畫筆畫指定的位圖*/
canvas.drawBitmap(mBitmap, 10, y, p);
/*設置下一個位圖繪製的y座標值*/
y += mBitmap.getHeight() + 10;
canvas.drawBitmap(mBitmap2, 10, y, p);
y += mBitmap2.getHeight() + 10;
/*設置畫筆的着色器*/
p.setShader(mShader);
canvas.drawBitmap(mBitmap3, 10, y, p);
/*這個類主要裝載了繪製直線曲線等的幾何路徑。*/
Path path = new Path();
/*畫上面的梯度變化線*/
path.moveTo(0, 0);
path.lineTo(100,70);
p.setColor(Color.RED);
/*Paint.Style畫刷的樣式枚舉類
* STROKE 只繪製筆畫形狀
* Fill 填充
* FILL_AND_STROKE 既畫筆畫又填充
* */
p.setStyle(Paint.Style.STROKE);
/*用指定的路徑和指定的畫刷畫要求的路徑*/
canvas.drawPath(path, p);
}
}
}
1. Bitmap.extractAlpha()
位圖的這個方法是通過提取 了原始位圖的透明通道值重建新的位圖
2.Bitmap.Config是內部枚舉類表示位圖的顏色配置, 有ALPHA_8、ARGB_4444、ARGB_8888、RGB_565
3.LinearGradient類是Shader的一個子類,它實現的是一個線性梯度變化的一個着色器,
4.Shader.TileMode是超出梯度線的顏色變化模式
CLAMP--- 固定shader繪畫時顏色超過原始邊界(梯度線)的部分顏色用邊界顏色繪製。REPEAT---在水平和垂直方向重複使用着色器的色相,但邊界分明
MIRROR -----在水平和垂直方向重複使用着色器的色相,交換的映像色相使得鄰近的色相總是一致;顏色關於梯度線鏡像
5.canvas.drawBitmap()
6.Paint.Style畫刷的樣式枚舉類
STROKE--- 只繪製筆畫形狀
Fill ---填充
FILL_AND_STROKE---既畫筆畫又填充
7. p.setXfermode(new PorterDuffXfermode(Mode.SRC));
用指定的PorterDuff模型創建xformode,PorterDuff.Mode.SRC表示下面要繪製的文本應在上面繪製的圓的上層
8.Paint.Align 是文本對齊方式的一個枚舉類
CENTER---表示文本居中
LEFT ---表示做對齊
RIGHT ---表示右對齊
9.Paint.FontMetrics fm = p.getFontMetrics();
FontMetrics是字體度量的類描述了給定文本大小的各種各樣的字體度量。
ascent--- 表示到基準線之上的距離
bottom--表示到基準線之下的最大距離,它是最低的字體類型
descent ---表示到基準線之下的距離
leading--- 空格字符到基準線的距離,爲0
10.p.setAntiAlias(true);
在繪製一個新的Paint對象時,可以通過傳遞給它一些標記來影響它被渲染的方式。ANTI_ALIAS_FLAG是其中一種很有趣的標記,它可以保證在繪製斜線的時候使用抗鋸齒效果來平滑該斜線的外觀。
在繪製文本的時候,抗鋸齒效果尤爲重要,因爲經過抗鋸齒效果處理之後的文本非常容易閱讀。要創建更加平滑的文本效果,可以應用SUBPIXEL_TEXT_FLAG,它將會應用子像素抗鋸齒效果。也可以手工地使用setSubpixelText和setAntiAlias方法來設置這些標記
[color=red][/color]