當我們調整好畫筆之後,現在需要繪製到畫布上,這就得用Canvas類了。在Android中既然把Canvas當做畫布,那麼就可以在畫布上繪製我們想要的任何東西。除了在畫布上繪製之外,還需要設置一些關於畫布的屬性,比如,畫布的顏色、尺寸等。下面來分析Android中Canvas有哪些功能,Canvas提供瞭如下一些方法:
Canvas(): 創建一個空的畫布,可以使用setBitmap()方法來設置繪製具體的畫布。
Canvas(Bitmap bitmap): 以bitmap對象創建一個畫布,則將內容都繪製在bitmap上,因此bitmap不得爲null。
Canvas(GL gl): 在繪製3D效果時使用,與OpenGL相關。
drawColor: 設置Canvas的背景顏色。
setBitmap: 設置具體畫布。
clipRect: 設置顯示區域,即設置裁剪區。
isOpaque:檢測是否支持透明。
rotate: 旋轉畫布
setViewport: 設置畫布中顯示窗口。
skew: 設置偏移量。
一、xml文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="30dp"
android:layout_marginTop="100dp"
>
<TextView
android:id="@+id/textView1"
android:layout_width="300dp"
android:layout_height="150dp"
android:textSize="40dp"
android:gravity="center_vertical|center_horizontal"
android:text="謝謝惠顧"
android:background="@android:color/holo_red_dark"
/>
<com.example.guale.EraseView
android:id="@+id/eraseView1"
android:layout_width="300dp"
android:layout_height="150dp"/>
</RelativeLayout>
</LinearLayout>
二、EraseView.java
package com.example.guale;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PorterDuff.Mode;
import android.graphics.PorterDuffXfermode;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
public class EraseView extends View {
private boolean isMove = false;
private Bitmap bitmap = null;
private Bitmap frontBitmap = null;
private Path path;
private Canvas mCanvas;
private Paint paint;
public EraseView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onDraw(Canvas canvas) {
if (mCanvas == null) {
EraseBitmp();
}
canvas.drawBitmap(bitmap, 0, 0, null);
mCanvas.drawPath(path,paint);//繪製一個路徑
super.onDraw(canvas);
}
public void EraseBitmp() {
bitmap = Bitmap.createBitmap(getWidth(),getHeight(), Bitmap.Config.ARGB_4444);
frontBitmap = CreateBitmap(Color.GRAY,getWidth(),getHeight());//生產灰色圖片
//設置畫筆的樣式
paint = new Paint();
paint.setStyle(Paint.Style.STROKE);//設置畫筆的風格:空心
paint.setXfermode(new PorterDuffXfermode(Mode.CLEAR));//設置圖片交叉時的顯示模式
paint.setAntiAlias(true);//防據齒
paint.setDither(true);//防抖動
paint.setStrokeJoin(Paint.Join.ROUND);//設置結合處的樣子,ROUND爲圓弧
paint.setStrokeCap(Paint.Cap.ROUND);
paint.setStrokeWidth(20);//設置描邊寬度
path = new Path();
mCanvas = new Canvas(bitmap);//設置一個帶圖片的畫布
mCanvas.drawBitmap(frontBitmap, 0, 0,null);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
float ax = event.getX();
float ay = event.getY();
if (event.getAction() == MotionEvent.ACTION_DOWN) {
isMove = false;
path.reset();
path.moveTo(ax, ay);
invalidate();
return true;
} else if (event.getAction() == MotionEvent.ACTION_MOVE) {
isMove = true;
path.lineTo(ax,ay);
invalidate();
return true;
}
return super.onTouchEvent(event);
}
public Bitmap CreateBitmap(int color,int width, int height) {
int[] rgb = new int [width * height];
for (int i=0;i<rgb.length;i++) {
rgb[i] = color;
}
return Bitmap.createBitmap(rgb, width, height,Config.ARGB_8888);
}
}
三、效果圖