private static final int WIDTH = 50;
private static final int HEIGHT = 50;
private static final int STRIDE = 64; // must be >= WIDTH
/**
* 創建顏色數組,ARGB8888,每一個顏色值都介於(0,255)之間
* @return
*/
private static int[] createColors() {
int[] colors = new int[STRIDE * HEIGHT];
for (int y = 0; y < HEIGHT; y++) {
for (int x = 0; x < WIDTH; x++) {
int r = x * 255 / (WIDTH - 1);
int g = y * 255 / (HEIGHT - 1);
int b = 255 - Math.min(r, g);
int a = Math.max(r, g);
colors[y * STRIDE + x] = (a << 24) | (r << 16) | (g << 8) | b;
}
}
return colors;
}
private static class SampleView extends View {
private Bitmap[] mBitmaps;
private Bitmap[] mJPEG;
private Bitmap[] mPNG;
private int[] mColors;
private Paint mPaint;
/**
* 將bitmap轉話爲PNG,或者JPG格式
* @param src 原始bitmap
* @param format bitmap的壓縮格式
* @param quality 質量介於(0,100之間),png的時候,基本不考慮這個值,爲0
* @return
*/
private static Bitmap codec(Bitmap src, Bitmap.CompressFormat format,
int quality) {
ByteArrayOutputStream os = new ByteArrayOutputStream();
src.compress(format, quality, os);
byte[] array = os.toByteArray();//將bitmap轉化爲2進制流數組
return BitmapFactory.decodeByteArray(array, 0, array.length);
}
public SampleView(Context context) {
super(context);
setFocusable(true);
mColors = createColors();
int[] colors = mColors;
mBitmaps = new Bitmap[6];
// these three are initialized with colors[]
mBitmaps[0] = Bitmap.createBitmap(colors, 0, STRIDE, WIDTH, HEIGHT,
Bitmap.Config.ARGB_8888);
mBitmaps[1] = Bitmap.createBitmap(colors, 0, STRIDE, WIDTH, HEIGHT,
Bitmap.Config.RGB_565);
mBitmaps[2] = Bitmap.createBitmap(colors, 0, STRIDE, WIDTH, HEIGHT,
Bitmap.Config.ARGB_4444);
// these three will have their colors set later
mBitmaps[3] = Bitmap.createBitmap(WIDTH, HEIGHT,
Bitmap.Config.ARGB_8888);
mBitmaps[4] = Bitmap.createBitmap(WIDTH, HEIGHT,
Bitmap.Config.RGB_565);
mBitmaps[5] = Bitmap.createBitmap(WIDTH, HEIGHT,
Bitmap.Config.ARGB_4444);
for (int i = 3; i <= 5; i++) {
mBitmaps[i].setPixels(colors, 0, STRIDE, 0, 0, WIDTH, HEIGHT);
}
mPaint = new Paint();
//設定是否使用圖像抖動處理,會使繪製出來的圖片顏色更加平滑和飽滿,
//圖像更加清晰
mPaint.setDither(true);
// now encode/decode using JPEG and PNG
mJPEG = new Bitmap[mBitmaps.length];
mPNG = new Bitmap[mBitmaps.length];
for (int i = 0; i < mBitmaps.length; i++) {
mJPEG[i] = codec(mBitmaps[i], Bitmap.CompressFormat.JPEG, 80);
mPNG[i] = codec(mBitmaps[i], Bitmap.CompressFormat.PNG, 0);
}
}
@Override protected void onDraw(Canvas canvas) {
canvas.drawColor(Color.WHITE);//繪製白色背景
for (int i = 0; i < mBitmaps.length; i++) {
canvas.drawBitmap(mBitmaps[i], 0, 0, null);
canvas.drawBitmap(mJPEG[i], 80, 0, null);
canvas.drawBitmap(mPNG[i], 160, 0, null);
canvas.translate(0, mBitmaps[i].getHeight());//移動原點座標
}
// draw the color array directly, w/o craeting a bitmap object
canvas.drawBitmap(mColors, 0, STRIDE, 0, 0, WIDTH, HEIGHT,
true, null);
canvas.translate(0, HEIGHT);
canvas.drawBitmap(mColors, 0, STRIDE, 0, 0, WIDTH, HEIGHT,
false, mPaint);
}
}
/**
*
* Paint即畫筆,在繪圖過程中起到了極其重要的作用,畫筆主要保存了顏色,
* 樣式等繪製信息,指定了如何繪製文本和圖形,畫筆對象有很多設置方法,
* 大體上可以分爲兩類,一類與圖形繪製相關,一類與文本繪製相關。
*
* 1.圖形繪製
* setARGB(int a,int r,int g,int b);
* 設置繪製的顏色,a代表透明度,r,g,b代表顏色值。
*
* setAlpha(int a);
* 設置繪製圖形的透明度。
*
* setColor(int color);
* 設置繪製的顏色,使用顏色值來表示,該顏色值包括透明度和RGB顏色。
*
* setAntiAlias(boolean aa);
* 設置是否使用抗鋸齒功能,會消耗較大資源,繪製圖形速度會變慢。
*
* setDither(boolean dither);
* 設定是否使用圖像抖動處理,會使繪製出來的圖片顏色更加平滑和飽滿,圖像更加清晰
*
* setFilterBitmap(boolean filter);
* 如果該項設置爲true,則圖像在動畫進行中會濾掉對Bitmap圖像的優化操作,加快顯示
* 速度,本設置項依賴於dither和xfermode的設置
*
* setMaskFilter(MaskFilter maskfilter);
* 設置MaskFilter,可以用不同的MaskFilter實現濾鏡的效果,如濾化,立體等 *
* setColorFilter(ColorFilter colorfilter);
* 設置顏色過濾器,可以在繪製顏色時實現不用顏色的變換效果
*
* setPathEffect(PathEffect effect);
* 設置繪製路徑的效果,如點畫線等
*
* setShader(Shader shader);
* 設置圖像效果,使用Shader可以繪製出各種漸變效果
*
* setShadowLayer(float radius ,float dx,float dy,int color);
* 在圖形下面設置陰影層,產生陰影效果,radius爲陰影的角度,dx和dy爲陰影在x軸和y軸上的距離,color爲陰影的顏色
*
* setStyle(Paint.Style style);
* 設置畫筆的樣式,爲FILL,FILL_OR_STROKE,或STROKE
*
* setStrokeCap(Paint.Cap cap);
* 當畫筆樣式爲STROKE或FILL_OR_STROKE時,設置筆刷的圖形樣式,如圓形樣式
* Cap.ROUND,或方形樣式Cap.SQUARE
*
* setSrokeJoin(Paint.Join join);
* 設置繪製時各圖形的結合方式,如平滑效果等
*
* setStrokeWidth(float width);
* 當畫筆樣式爲STROKE或FILL_OR_STROKE時,設置筆刷的粗細度
*
* setXfermode(Xfermode xfermode);
* 設置圖形重疊時的處理方式,如合併,取交集或並集,經常用來製作橡皮的擦除效果
*
* 2.文本繪製
* setFakeBoldText(boolean fakeBoldText);
* 模擬實現粗體文字,設置在小字體上效果會非常差
*
* setSubpixelText(boolean subpixelText);
* 設置該項爲true,將有助於文本在LCD屏幕上的顯示效果
*
* setTextAlign(Paint.Align align);
* 設置繪製文字的對齊方向
*
* setTextScaleX(float scaleX);
* 設置繪製文字x軸的縮放比例,可以實現文字的拉伸的效果
*
* setTextSize(float textSize);
* 設置繪製文字的字號大小
*
* setTextSkewX(float skewX);
* 設置斜體文字,skewX爲傾斜弧度
*
* setTypeface(Typeface typeface);
* 設置Typeface對象,即字體風格,包括粗體,斜體以及襯線體,非襯線體等
*
* setUnderlineText(boolean underlineText);
* 設置帶有下劃線的文字效果
*
* setStrikeThruText(boolean strikeThruText);
* 設置帶有刪除線的效果
*
*/