刮刮樂實現效果

當我們調整好畫筆之後,現在需要繪製到畫布上,這就得用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);
	}
	
}

三、效果圖



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章