20190121

看看这本书 -《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

你可能感兴趣的:(20190121)