0 Comments

编写代码

发布于:2012-11-17  |   作者:广州网站建设  |   已聚集:人围观
编写代码

这个程序的核心是画布,也就是Canvas对象。要想在Canvas上绘制图形,需要将Canvas放在View上。因此,首先需要建立一个画布类,这个画布类是View的子类。当画布刷新时,会调用onDraw方法来重新绘制画布,我们可以从onDraw方法的参数来获得要绘制图形的Canvas对象。广州网站设计

由于画布重绘时会清空所有的内容,因此,要想绘制多个实心圆,需要使用一个List变量将曾经绘制的实心圆的相关信息(圆心坐标、半径、画笔颜色)保存起来,以便绘制下一个实心圆时重绘前面绘制的所有的实心圆。如果不用List对象保留绘制历史,则只能绘制最后一个实心圆。下面来看看这个画布类的代码。广州网站设计


  1. package mobile.android.ch02.first;  
  2.  
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5. import android.content.Context;  
  6. import android.graphics.Canvas;  
  7. import android.graphics.Paint;  
  8. import android.view.View;  
  9.  
  10. public class CircleCanvas extends View  
  11. {  
  12.     //  保存绘制历史  
  13.     public List<CircleInfo> mCircleInfos = new  ArrayList<CircleCanvas.CircleInfo>();  
  14.       
  15.     // 保存实心圆相关信息的类  
  16.     public static class CircleInfo  
  17.     {  
  18.         private float x;                //  圆心横坐标  
  19.         private float y;                //  圆心纵坐标  
  20.         private float radius;       //  半径  
  21.         private int color;          //  画笔的颜色  
  22.  
  23.         public float getX()  
  24.         {  
  25.             return x;  
  26.         }  
  27.         public void setX(float x)  
  28.         {  
  29.             this.x = x;  
  30.         }  
  31.         public float getY()  
  32.         {  
  33.             return y;  
  34.         }  
  35.         public void setY(float y)  
  36.         {  
  37.             this.y = y;  
  38.         }  
  39.         public float getRadius()  
  40.         {  
  41.             return radius;  
  42.         }  
  43.         public void setRadius(float radius)  
  44.         {  
  45.             this.radius = radius;  
  46.         }  
  47.         public int getColor()  
  48.         {  
  49.             return color;  
  50.         }  
  51.         public void setColor(int color)  
  52.         {  
  53.             this.color = color;  
  54.         }  
  55.     }  
  56.     public CircleCanvas(Context context)  
  57.     {  
  58.         super(context);  
  59.     }  
  60.         //  当画布重绘时调用该方法,Canvas表示画布对象,可以在该对象上绘制基本的图形  
  61.     @Override  
  62.     protected void onDraw(Canvas canvas)  
  63.     {  
  64.         super.onDraw(canvas);  
  65.         //  根据保存的绘制历史重绘所有的实心圆  
  66.         for (CircleInfo circleInfo : mCircleInfos)  
  67.         {  
  68.             Paint paint = new Paint();  
  69.             //  设置画笔颜色  
  70.             paint.setColor(circleInfo.getColor());  
  71.             //  绘制实心圆  
  72.             canvas.drawCircle(circleInfo.getX(),  circleInfo.getY(), circleInfo.getRadius(),   
  73.             paint);  
  74.         }  
  75.     }  
  76. }  

下面我们来编写主程序。在创建工程时会要求输入一个"Create Activity",由于我们输入的是"Main",因此,生成的主类就是Main.java。打开Main.java文件,输入如下的代码。广州网站建设


  1. package mobile.android.ch02.first;  
  2.  
  3. import java.util.Random;  
  4. import mobile.android.first.CircleCanvas.CircleInfo;  
  5. import android.app.Activity;  
  6. import android.graphics.Color;  
  7. import android.os.Bundle;  
  8. import android.view.View;  
  9. import android.view.ViewGroup;  
  10. import android.view.ViewGroup.LayoutParams;  
  11.  
  12. public class Main extends Activity  
  13. {  
  14.     private CircleCanvas mCircleCanvas;         //  定义一个画布类  
  15.  
  16.     @Override  
  17.     public void onCreate(Bundle savedInstanceState)  
  18.     {  
  19.         super.onCreate(savedInstanceState);  
  20.         //  装载布局文件(在2.2.3节配置的main.xml文件)  
  21.         ViewGroup viewGroup = (ViewGroup) getLayoutInflater().inflate(R.layout.main, null);  
  22.         mCircleCanvas = new CircleCanvas(this);  //  创建CircleCanvas(画布类)对象  
  23.         //  将CircleCanvas对象添加到当前界面的视图中(两个按钮的下方)  
  24.         viewGroup.addView(mCircleCanvas, new  LayoutParams(LayoutParams.FILL_PARENT, 350));  
  25.         setContentView(viewGroup);  
  26.     }  
  27.     //  开始随机绘制圆形(第一个按钮的单击事件)  
  28.     public void onClick_DrawRandomCircle(View view)  
  29.     {  
  30.         Random random = new Random();  
  31.         float randomX =(float)( 100 + random.nextInt (100)); //  随机生成圆心横坐标(100至200)  
  32.         float randomY =(float)( 100 + random.nextInt (100));     //  随机生成圆心纵坐标(100至200)  
  33.         float randomRadius =(float)( 20 + random. nextInt(40));  //  随机生成圆的半径(20至60)  
  34.         int randomColor = 0;  
  35.         //  产生0至100的随机数,若产生的随机数大于50,则画笔颜色为蓝色  
  36.         if(random.nextInt(100) > 50)  
  37.         {  
  38.             randomColor = Color.BLUE;  
  39.         }  
  40.         else  
  41.         {  
  42.             //  产生0至100的随机数,若产生的随机数大于50,则画笔颜色为红色  
  43.             if(random.nextInt(100) > 50)  
  44.                 randomColor = Color.RED;  
  45.             //  否则,画笔颜色为绿色  
  46.             else  
  47.                 randomColor = Color.GREEN;  
  48.         }  
  49.         CircleInfo circleInfo = new CircleInfo();  
  50.         circleInfo.setX(randomX);  
  51.         circleInfo.setY(randomY);  
  52.         circleInfo.setRadius(randomRadius);  
  53.         circleInfo.setColor(randomColor);  
  54.         mCircleCanvas.mCircleInfos.add(circleInfo);  //  将当前绘制的实心圆信息加到List对象中  
  55.         mCircleCanvas.invalidate();             //  使画布重绘  
  56.     }  
  57.     //  清空画布(第二个按钮的单击事件)  
  58.     public void onClick_Clear(View view)  
  59.     {  
  60.         mCircleCanvas.mCircleInfos.clear();         //  清除绘制历史  
  61.         mCircleCanvas.invalidate();             //  使画布重绘  
  62.     }  
  63. }  

下面来运行程序,并不断用鼠标单击第一个按钮,会在画布中绘制多个不同颜色、不同半径、不同位置的实心圆,如图2.19所示。当单击第二个按钮后,会将当前绘制的所有实心圆清空。广州网站建设

图2.19  随机绘制实心圆
飞机