public class ClipCanvas extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(new ClipCanvasView(this));
}
}
class ClipCanvasView extends SurfaceView implements Callback,Runnable{
private Thread mThread;
private Canvas mCanvas;
private boolean mFlag;
private Paint mPaint;
private SurfaceHolder mSurfaceHolder;
private Bitmap mBitmap;
public ClipCanvasView(Context context) {
super(context);
mSurfaceHolder=this.getHolder();
mSurfaceHolder.addCallback(this);
mPaint=new Paint();
mPaint.setColor(Color.WHITE);
mPaint.setAntiAlias(true);
mBitmap=BitmapFactory.decodeResource(getResources(), R.drawable.image);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
mFlag=true;
mThread=new Thread(this,"My Thread");
mThread.start();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
mFlag=false;
}
@Override
public void run() {
while (mFlag) {
long start=System.currentTimeMillis();
myDraw();
logic();
long end=System.currentTimeMillis();
if ((end-start)<50) {
try {
Thread.sleep(50-(end-start));
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
private void logic() {
// TODO Auto-generated method stub
}
private void myDraw() {
try {
mCanvas=mSurfaceHolder.lockCanvas();
if (mCanvas != null) {
mCanvas.drawColor(Color.WHITE);
//Draw a rectangular viewing area
//Use save() restore() when use clipRect() function
/*mCanvas.save();
mCanvas.clipRect(0, 0, 120, 120);
mCanvas.drawBitmap(mBitmap, 10, 10, mPaint);
mCanvas.restore();
//Use path to set visible region
mCanvas.save();
Path path=new Path();
path.addCircle(150, 200, 60, Direction.CCW);
mCanvas.clipPath(path);
mCanvas.drawBitmap(mBitmap, 0, 0, mPaint);
mCanvas.restore();*/
//Use region to set visibe region
mCanvas.save();
Region region=new Region();
region.op(new Rect(20,20,100,100), Region.Op.UNION);
region.op(new Rect(40,20,80,150), Region.Op.XOR);//XOR same as 0 different as 1
mCanvas.clipRegion(region);
mCanvas.drawBitmap(mBitmap, 0, 0, mPaint);
mCanvas.restore();
}
} catch (Exception e) {
// TODO: handle exception
}finally{
if (mCanvas != null) {
mSurfaceHolder.unlockCanvasAndPost(mCanvas);
}
}
}
}
问题一:
不管是 mCanvas.clipRect(0, 0, 120, 120);mCanvas.clipPath(path);还是mCanvas.clipRegion(region);都用save()和restore()