看看这本书 -《Android游戏编程之从零开始》
Day_3_2 2019/01/21
剪切区域
概念:剪切区域也称为可视区域,设置与画布。它指的是当在画布上设置一块区域时,除此区域以外,绘制的任何内容都看不到
可视区域可以为圆形、矩形等
代码如下所示:
public class ClipSurfaceView extends SurfaceView implements SurfaceHolder.Callback
{
private SurfaceHolder holder;
private Canvas canvas;
private Paint paint;
private Bitmap bitmap = BitmapFactory.decodeResource( this.getResources() , R.mipmap.ic_launcher );
public ClipSurfaceView( Context context )
{
super( context );
holder = this.getHolder();
holder.addCallback( this );
setFocusable( true );
paint = new Paint();
paint.setColor( Color.WHITE );
}
@Override
public void surfaceCreated( SurfaceHolder holder )
{
myDraw();
}
private void myDraw()
{
try
{
canvas = holder.lockCanvas();
if( canvas != null )
{
canvas.drawColor( Color.BLACK );
//基本方法
canvas.save();
canvas.clipRect( 0 , 0 , 200 , 200 );
canvas.drawRect( 0 , 0 , this.getWidth() , this.getHeight() , paint );
canvas.restore();
//设置可视区域的方法1
canvas.save();
Path path = new Path();
path.addCircle( 30 , 30 , 30 , Path.Direction.CCW );
canvas.clipPath( path );
canvas.drawBitmap( bitmap , 0 , 0 , paint );
canvas.restore();
//设置可视区域的方法2
//Region表示区域的集合 可以设置多个区域块
canvas.save();
Region region = new Region();
region.op( new Rect( 20 , 20 , 100 , 100 ) , Region.Op.UNION );
//canvas.clipRegion 这个方法已经被废除,可以用clipRect,clipPath代替
Path path1 = new Path();
path1.addRect( new RectF( 20 , 20 , 100 , 100 ) , Path.Direction.CCW );
canvas.clipPath( path1 );
//或者使用
/**
* 第一个第二个参数:之前裁剪的区域坐标
* 第二个第三个参数:当前要裁剪的区域坐标
* Op参数的含义:针对的对象是之前剪切的区域以及当前要剪切的区域
* Region.Op.DIFFERENCE :之前剪切过除去当前要剪切的区域
* Region.Op.INTERSECT :当前要剪切的区域在之前剪切过内部的部分
* Region.Op.UNION :当前要剪切的区域加上之前剪切过内部的部分
* Region.Op.XOR :异或,当前要剪切的区域与之前剪切过的进行异或
* Region.Op.REVERSE_DIFFERENCE :以当前要剪切的区域为参照物,当前要剪切的区域除去之前剪切过的区域
* Region.Op.REPLACE :用当前要剪切的区域代替之前剪切过的区域
* 没带Op参数效果与INTERSECT的效果一样,两个区域的交集
*/
canvas.clipRect( 40 , 40 , 100 , 100 , Region.Op.DIFFERENCE );
}
}
catch( Exception e )
{
e.printStackTrace();
}
finally
{
if( canvas != null )
{
holder.unlockCanvasAndPost( canvas );
}
}
}
@Override
public void surfaceChanged(
SurfaceHolder holder ,
int format ,
int width ,
int height )
{
}
@Override
public void surfaceDestroyed( SurfaceHolder holder )
{
}
}
167/406