package com.android.image.demo;
import java.io.InputStream;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.LinearGradient;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PorterDuffXfermode;
import android.graphics.Shader;
import android.graphics.Typeface;
import android.os.Bundle;
import android.view.View;
public class AlphaBitmap extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new SampleView(this));
}
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(android.graphics.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.qq);
/*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);
}
}
}