读书人

承继view的两种绘图方式

发布时间: 2012-07-24 17:47:58 作者: rapoo

继承view的两种绘图方式

import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Path;import android.graphics.Rect;import android.graphics.RectF;import android.view.KeyEvent;import android.view.MotionEvent;import android.view.View;public class GameView extends View implements Runnable{/* 声明Paint对象 */private Paint mPaint = null;private GameView2 mGameView2 = null;public GameView(Context context){super(context);/* 构建对象 */mPaint = new Paint();mGameView2 = new GameView2(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();}}}

?2、使用ShapeDrawable

import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Path;import android.graphics.Rect;import android.graphics.drawable.ShapeDrawable;import android.graphics.drawable.shapes.OvalShape;import android.graphics.drawable.shapes.PathShape;import android.graphics.drawable.shapes.RectShape;import android.view.View;//通过ShapeDrawable来绘制几何图形public class GameView2 extends View{/* 声明ShapeDrawable对象 */ShapeDrawablemShapeDrawable= null;public GameView2(Context context){super(context);}public void DrawShape(Canvas canvas){/* 实例化ShapeDrawable对象并说明是绘制一个矩形 */mShapeDrawable = new ShapeDrawable(new RectShape());//得到画笔paint对象并设置其颜色mShapeDrawable.getPaint().setColor(Color.RED);Rect bounds = new Rect(5, 250, 55, 280);/* 设置图像显示的区域 */mShapeDrawable.setBounds(bounds);/* 绘制图像 */mShapeDrawable.draw(canvas);/*=================================*//* 实例化ShapeDrawable对象并说明是绘制一个椭圆 */mShapeDrawable = new ShapeDrawable(new OvalShape());//得到画笔paint对象并设置其颜色mShapeDrawable.getPaint().setColor(Color.GREEN);/* 设置图像显示的区域 */mShapeDrawable.setBounds(70, 250, 150, 280);/* 绘制图像 */mShapeDrawable.draw(canvas);Path path1 = new Path();/*设置多边形的点*/path1.moveTo(150+5, 80+80-50);path1.lineTo(150+45, 80+80-50);path1.lineTo(150+30, 80+120-50);path1.lineTo(150+20, 80+120-50);/* 使这些点构成封闭的多边形 */path1.close();//PathShape后面两个参数分别是宽度和高度mShapeDrawable = new ShapeDrawable(new PathShape(path1,150,150));//得到画笔paint对象并设置其颜色mShapeDrawable.getPaint().setColor(Color.BLUE);/* 设置图像显示的区域 */mShapeDrawable.setBounds(100, 170, 200, 280);/* 绘制图像 */mShapeDrawable.draw(canvas);}}

?

?

如果你只想改变画布中的一个图形,而其它图形不变,需要用到canvas.save() 锁定画布,与canvas.restore()解除画布锁定

读书人网 >移动开发

热点推荐