CanvasView
package com.sonzer.CanvasDemo;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.drawable.BitmapDrawable;
import android.view.View;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.view.animation.RotateAnimation;
import android.view.animation.ScaleAnimation;
import android.view.animation.TranslateAnimation;
/**
* 绘图常用方法演示
* @author sonzer
*
*/
public class CanvasView extends View {
private Paint mPaint1 = null;
private Bitmap mBitmap = null;
public CanvasView(Context context) {
super(context);
// 初始化画笔
mPaint1 = new Paint();
mPaint1.setColor(Color.RED);// 设置笔刷颜色
mPaint1.setStrokeWidth(2);// 设置笔刷粗细
mPaint1.setAntiAlias(true);// 设置抗锯齿
//初始化图片
mBitmap = ((BitmapDrawable) getResources().getDrawable(
R.drawable.sonzer_pic)).getBitmap();
mBitmap = rotate(mBitmap, 10, 0, 0);// 图像旋转
mBitmap = scale(mBitmap, 0.3f, 0.3f, 0, 0);// 图像缩放
mBitmap = dispose(mBitmap, mBitmap.getWidth(), mBitmap.getHeight());// 灰度处理
// 抗锯齿(感觉不明显)
// canvas.setDrawFilter(new PaintFlagsDrawFilter(0,
// Paint.ANTI_ALIAS_FLAG|Paint.FILTER_BITMAP_FLAG));
alphaAnimation();//透明度渐变动画
// translateAnimation();//平移动画
// scaleAnimation();//缩放动画
// rotateAnimation();//旋转动画
}
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
canvas.drawColor(Color.WHITE);// 设置画布背景颜色
canvas.clipRect(0, 0, 320, 480);// 设置画布范围
canvas.drawLine(20, 20, 100, 30, mPaint1);// 绘制线段
canvas.drawPoint(60, 50, mPaint1);// 绘制点
canvas.drawRect(new Rect(20, 70, 120, 100), mPaint1); // 绘制矩形
canvas.drawRoundRect(new RectF(140, 70, 230, 100), 10, 10, mPaint1); // 绘制圆角矩形
canvas.drawCircle(50, 140, 30, mPaint1);// 绘制圆形
canvas.drawArc(new RectF(140, 110, 230, 170), 180, 90, true, mPaint1);// 绘制圆弧
canvas.drawOval(new RectF(240, 110, 280, 170), mPaint1);// 绘制椭圆形
canvas.drawText("绘制文字", 20, 200, mPaint1);// 绘制文字
float[] points = new float[] { 35, 220, 20, 250, 20, 250, 50, 250, 35,
220, 50, 250 };
canvas.drawLines(points, mPaint1);// 绘制线段序列,相当3条线,6个坐标
canvas.drawBitmap(mBitmap, 20, 270, null);// 绘制图片
}
/**
* 图像旋转
*
* @param mBitmap
* @param angle
* @param px
* @param py
* @return
*/
public Bitmap rotate(Bitmap mBitmap, float angle, float px, float py) {
Matrix matrix = new Matrix();
matrix.reset();
matrix.setRotate(angle, px, py);
mBitmap = Bitmap.createBitmap(mBitmap, 0, 0, mBitmap.getWidth(),
mBitmap.getHeight(), matrix, true);
return mBitmap;
}
/**
* 图像缩放
*
* @param sx
* @param sy
* @param px
* @param py
* @return
*/
public Bitmap scale(Bitmap mBitmap, float sx, float sy, float px, float py) {
Matrix matrix = new Matrix();
matrix.reset();
matrix.setScale(sx, sy, px, py);
mBitmap = Bitmap.createBitmap(mBitmap, 0, 0, mBitmap.getWidth(),
mBitmap.getHeight(), matrix, true);
return mBitmap;
}
/**
* 灰度处理
*
* @param mBitmap
* @param width
* @param height
* @return
*/
public Bitmap dispose(Bitmap mBitmap, final int width, final int height) {
int bitmap[] = new int[width * height];
mBitmap.getPixels(bitmap, 0, width, 0, 0, width, height);
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
int index = i * width + j;
// 获取RGB值
int r = (bitmap[index] >> 16) & 0xff;
int g = (bitmap[index] >> 8) & 0xff;
int b = (bitmap[index]) & 0xff;
// 计算灰度值
double gray = r * 0.3 + g * 0.59 + b * 0.11;
// 0xff000000 | (R << 16) | (G << 8) | B
bitmap[index] = 0xff000000 | ((int) gray << 16)
| ((int) gray << 8) | (int) gray;
}
}
Bitmap bm = Bitmap.createBitmap(width, height, Config.ARGB_4444);
bm.setPixels(bitmap, 0, width, 0, 0, width, height);
mBitmap = bm;
bitmap = null;
return mBitmap;
}
/**
* 透明度渐变动画
*/
public void alphaAnimation() {
Animation alpha = new AlphaAnimation(0.0f, 1.0f);
alpha.setDuration(3000);
this.startAnimation(alpha);
}
/**
* 平移动画
*/
public void translateAnimation() {
Animation translate = new TranslateAnimation(10, 100, 10, 100);
translate.setDuration(3000);
this.startAnimation(translate);
}
/**
* 缩放动画
*/
public void scaleAnimation() {
Animation scale = new ScaleAnimation(0.0f, 1.0f, 0.0f, 1.0f,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
0.5f);
scale.setDuration(3000);
this.startAnimation(scale);
}
/**
* 旋转动画
*/
public void rotateAnimation() {
Animation rotate = new RotateAnimation(0.0f, 360.0f,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
0.5f);
rotate.setDuration(3000);
this.startAnimation(rotate);
}
}
CanvasDemoActivity
package com.sonzer.CanvasDemo;
import android.app.Activity;
import android.os.Bundle;
public class CanvasDemoActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
CanvasView view=new CanvasView(this);
setContentView(view);
}
}