android SurfaceView绘制 重新学习--切图clipRect详解

解释都在代码注释中:

 1 public class SampleView extends View {
 2     private Paint mPaint;
 3     private Path mPath;
 4 
 5     public SampleView(Context context) {
 6         super(context);
 7         setFocusable(true);
 8 
 9         mPaint = new Paint();
10         mPaint.setAntiAlias(true);
11         mPaint.setStrokeWidth(6);
12         mPaint.setTextSize(16);
13         mPaint.setTextAlign(Paint.Align.RIGHT);
14 
15         mPath = new Path();
16     }
17 
18     private void drawScene(Canvas canvas) {
19         canvas.clipRect(0, 0, 100, 100);
20 
21         canvas.drawColor(Color.WHITE);
22 
23         mPaint.setColor(Color.RED);
24         canvas.drawLine(0, 0, 100, 100, mPaint);
25 
26         mPaint.setColor(Color.GREEN);
27         canvas.drawCircle(30, 70, 30, mPaint);
28 
29         mPaint.setColor(Color.BLUE);
30         canvas.drawText("Clipping", 100, 30, mPaint);
31     }
32 
33     @Override
34     protected void onDraw(Canvas canvas) {
35         canvas.drawColor(Color.GRAY);
36         canvas.save();
37         canvas.translate(10, 10);
38         drawScene(canvas);
39         canvas.restore();
40 
41         // Region.Op.DIFFERENCE B-A
42         canvas.save();
43         canvas.translate(160, 10);
44         canvas.clipRect(10, 10, 90, 90); // B
45         canvas.clipRect(30, 30, 70, 70, Region.Op.DIFFERENCE); // A
46         drawScene(canvas);
47         canvas.restore();
48         
49         // 这里因为在3.0以上的硬件上开启了硬件加速,会有问题.
50         // Region.Op.REPLACE 不论A和B的集合状况,B的范围将全部进行显示,如果和A有交集,则将覆盖A的交集范围
51 //        canvas.save();
52 //        canvas.translate(10, 160);
53 //        mPath.reset();
54 //        canvas.clipPath(mPath); // B
55 //        mPath.addCircle(50, 50, 50, Path.Direction.CCW);
56 //        canvas.clipPath(mPath, Region.Op.REPLACE);// A
57 //        drawScene(canvas);
58 //        canvas.restore();
59         
60         // Region.Op.UNION AB并集范围
61         canvas.save();
62         canvas.translate(160, 160);
63         canvas.clipRect(0, 0, 60, 60);// B
64         canvas.clipRect(40, 40, 100, 100, Region.Op.UNION);// A
65         drawScene(canvas);
66         canvas.restore();
67 
68         // Region.Op.XOR 异或,去掉AB相交的部分
69         canvas.save();
70         canvas.translate(10, 310);
71         canvas.clipRect(40, 40, 100, 100); // B
72         canvas.clipRect(0, 0, 60, 60, Region.Op.XOR); // A
73         drawScene(canvas);
74         canvas.restore();
75 
76         // Region.Op.REVERSE_DIFFERENCE A-B
77         canvas.save();
78         canvas.translate(160, 310);
79         canvas.clipRect(0, 0, 60, 60); // B
80         canvas.clipRect(40, 40, 100, 100, Region.Op.REVERSE_DIFFERENCE);// A
81         drawScene(canvas);
82         canvas.restore();
83     }
84 }

这个在游戏中还是很常用的。

关于硬件加速的问题,http://developer.android.com/guide/topics/graphics/hardware-accel.html#controlling

谷歌文档说的很清楚。

posted @ 2013-09-08 11:30  一只奋斗的猿  阅读(1016)  评论(0编辑  收藏  举报