上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
4.5 使用矩形类Rect
类Rect的完整形式是Android.Graphics.Rect,功能是绘制矩形区域。Rect除了能够表示一个矩形区域的位置描述,还可以帮助计算图形之间是否碰撞(具有包含关系),对于Android游戏开发比较有用。在类Rect的主要成员中包含了如下3种重载方法来判断包含关系。
· boolean contains(int left, int top, int right, int bottom)
· boolean contains(int x, int y)
· boolean contains(Rect r)
实例4-4 在Android中使用Rect类(daima\4\RectCH)。
本实例实现文件RectCH.java的主要代码如下所示。
/* 声明Paint对象 */ private Paint mPaint = null; private RectCH_1 mGameView2 = null; public RectCH(Context context) { super(context); /* 构建对象 */ mPaint = new Paint(); mGameView2 = new RectCH_1(context); /* 开启线程 */ new Thread(this).start(); } public void onDraw(Canvas canvas) { super.onDraw(canvas); /* 设置画布为黑色背景 */ canvas.drawColor(Color.BLACK); /* 取消锯齿 */ mPaint.setAntiAlias(true); mPaint.setStyle(Paint.Style.STROKE); { /* 定义矩形对象 */ Rect rect1 = new Rect(); /* 设置矩形大小 */ rect1.left = 5; rect1.top = 5; rect1.bottom = 25; rect1.right = 45; mPaint.setColor(Color.BLUE); /* 绘制矩形 */ canvas.drawRect(rect1, mPaint); mPaint.setColor(Color.RED); /* 绘制矩形 */ canvas.drawRect(50, 5, 90, 25, mPaint); mPaint.setColor(Color.YELLOW); /* 绘制圆形(圆心x,圆心y,半径r,p) */ canvas.drawCircle(40, 70, 30, mPaint); /* 定义椭圆对象 */ RectF rectf1 = new RectF(); /* 设置椭圆大小 */ rectf1.left = 80; rectf1.top = 30; rectf1.right = 120; rectf1.bottom = 70; mPaint.setColor(Color.LTGRAY); /* 绘制椭圆 */ canvas.drawOval(rectf1, mPaint); /* 绘制多边形 */ Path path1 = new Path(); /*设置多边形的点*/ path1.moveTo(150+5, 80-50); path1.lineTo(150+45, 80-50); path1.lineTo(150+30, 120-50); path1.lineTo(150+20, 120-50); /* 使这些点构成封闭的多边形 */ path1.close(); mPaint.setColor(Color.GRAY); /* 绘制这个多边形 */ canvas.drawPath(path1, mPaint); mPaint.setColor(Color.RED); mPaint.setStrokeWidth(3); /* 绘制直线 */ canvas.drawLine(5, 110, 315, 110, mPaint); } // //下面绘制实心几何体 // mPaint.setStyle(Paint.Style.FILL); { /* 定义矩形对象 */ Rect rect1 = new Rect(); /* 设置矩形大小 */ rect1.left = 5; rect1.top = 130+5; rect1.bottom = 130+25; rect1.right = 45; mPaint.setColor(Color.BLUE); /* 绘制矩形 */ canvas.drawRect(rect1, mPaint); mPaint.setColor(Color.RED); /* 绘制矩形 */ canvas.drawRect(50, 130+5, 90, 130+25, mPaint); mPaint.setColor(Color.YELLOW); /* 绘制圆形(圆心x,圆心y,半径r,p) */ canvas.drawCircle(40, 130+70, 30, mPaint); /* 定义椭圆对象 */ RectF rectf1 = new RectF(); /* 设置椭圆大小 */ rectf1.left = 80; rectf1.top = 130+30; rectf1.right = 120; rectf1.bottom = 130+70; mPaint.setColor(Color.LTGRAY); /* 绘制椭圆 */ canvas.drawOval(rectf1, mPaint); /* 绘制多边形 */ Path path1 = new Path(); /*设置多边形的点*/ path1.moveTo(150+5, 130+80-50); path1.lineTo(150+45, 130+80-50); path1.lineTo(150+30, 130+120-50); path1.lineTo(150+20, 130+120-50); /* 使这些点构成封闭的多边形 */ path1.close(); mPaint.setColor(Color.GRAY); /* 绘制这个多边形 */ canvas.drawPath(path1, mPaint); mPaint.setColor(Color.RED); mPaint.setStrokeWidth(3); /* 绘制直线 */ canvas.drawLine(5, 130+110, 315, 130+110, mPaint); } /* 通过ShapeDrawable来绘制几何图形 */ mGameView2.DrawShape(canvas); } //触笔事件 public boolean onTouchEvent(MotionEvent event) { return true; } //按键按下事件 public boolean onKeyDown(int keyCode, KeyEvent event) { return true; } //按键弹起事件 public boolean onKeyUp(int keyCode, KeyEvent event) { return false; } public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event) { return true; } public void run() { while (!Thread.currentThread().isInterrupted()) { try { Thread.sleep(100); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } //使用postInvalidate可以直接在线程中更新界面 postInvalidate(); } } }
执行后的效果如图4-4所示。
图4-4 执行效果
注意:在Android系统中,还有另外一个类和Rect的功能相似,即Region。类Region的完整写法是Android. Graphics.Region,此类在Android平台中表示的区域和Rect表示的不同。Region类表示的是一个不规则的样式,可以是椭圆、多边形,等等,而Rect类表示的仅仅是矩形。同样,Region的boolean contains(int x, int y)成员可以判断一个点是否在该区域内。