本文介绍了如何利用android的绘图技术随机绘制彩色实心圆。效果如图1所示。
图1
这个程序的核心是画布,也就是canvas对象。要想在canvas上绘制图形,需要将canvas放在view上。因此,首先需要建立一个画布类,这个画布类是view的子类。当画布刷新时,会调用ondraw方法来重绘制画布,我们可以从ondraw方法的参数来获得要绘制图形的canvas对象。
由于画布重绘时会清空所有的内容,因此,要想绘制多个实心圆,需要使用一个list变量将曾经绘制的实心圆的相关信息(圆心坐标、半径、画笔颜色)保存起来,以便绘制下一个实心圆时重绘前面绘制的所有的实心圆。如果不用list对象保留绘制历史,则只能绘制最后一个实心圆。下面来看看这个画布类的代码。
package mobile.android.ch02.first;
import java.util.arraylist;
import java.util.list;
import android.content.context;
import android.graphics.canvas;
import android.graphics.paint;
import android.view.view;
public class circlecanvas extends view
{
// 保存绘制历史
public list<circleinfo> mcircleinfos = new arraylist<circlecanvas.circleinfo>();
// 保存实心圆相关信息的类
public static class circleinfo
{
private float x; // 圆心横坐标
private float y; // 圆心纵坐标
private float radius; // 半径
private int color; // 画笔的颜色
public float getx()
{
return x;
}
public void setx(float x)
{
this.x = x;
}
public float gety()
{
return y;
}
public void sety(float y)
{
this.y = y;
}
public float getradius()
{
return radius;
}
public void setradius(float radius)
{
this.radius = radius;
}
public int getcolor()
{
return color;
}
public void setcolor(int color)
{
this.color = color;
}
}
public circlecanvas(context context)
{
super(context);
}
// 当画布重绘时调用该方法,canvas表示画布对象,可以在该对象上绘制基本的图形
@override
protected void ondraw(canvas canvas)
{
super.ondraw(canvas);
// 根据保存的绘制历史重绘所有的实心圆
for (circleinfo circleinfo : mcircleinfos)
{
paint paint = new paint();
// 设置画笔颜色
paint.setcolor(circleinfo.getcolor());
// 绘制实心圆
canvas.drawcircle(circleinfo.getx(), circleinfo.gety(), circleinfo.getradius(), paint);
}
}
}
下面我们来编写主程序。在创建工程时会要求输入一个“create activity”,由于我们输入的是“main”,因此,生成的主类就是main.java。打开main.java文件,输入如下的代码。
package mobile.android.ch02.first;
import java.util.random;
import mobile.android.first.circlecanvas.circleinfo;
import android.app.activity;
import android.graphics.color;
import android.os.bundle;
import android.view.view;
import android.view.viewgroup;
import android.view.viewgroup.layoutparams;
public class main extends activity
{
private circlecanvas mcirclecanvas; // 定义一个画布类
@override
public void oncreate(bundle savedinstancestate)
{
super.oncreate(savedinstancestate);
// 装载布局文件(在2.2.3节配置的main.xml文件)
viewgroup viewgroup = (viewgroup)getlayoutinflater().inflate(r.layout.main, null);
mcirclecanvas = new circlecanvas(this); // 创建circlecanvas(画布类)对象
// 将circlecanvas对象添加到当前界面的视图中(两个按钮的下方)
viewgroup.addview(mcirclecanvas, new layoutparams(layoutparams.fill_parent, 350));
setcontentview(viewgroup);
}
// 开始随机绘制圆形(第一个按钮的单击事件)
public void onclick_drawrandomcircle(view view)
{
random random = new random();
float randomx =(float)( 100 random.nextint(100)); // 随机生成圆心横坐标(100至200)
float randomy =(float)( 100 random.nextint(100)); // 随机生成圆心纵坐标(100至200)
float randomradius =(float)( 20 random.nextint(40)); // 随机生成圆的半径(20至60)
int randomcolor = 0;
// 产生0至100的随机数,若产生的随机数大于50,则画笔颜色为蓝色
if(random.nextint(100) > 50)
{
randomcolor = color.blue;
}
else
{
// 产生0至100的随机数,若产生的随机数大于50,则画笔颜色为红色
if(random.nextint(100) > 50)
randomcolor = color.red;
// 否则,画笔颜色为绿色
else
randomcolor = color.green;
}
circleinfo circleinfo = new circleinfo();
circleinfo.setx(randomx);
circleinfo.sety(randomy);
circleinfo.setradius(randomradius);
circleinfo.setcolor(randomcolor);
mcirclecanvas.mcircleinfos.add(circleinfo); // 将当前绘制的实心圆信息加到list对象中
mcirclecanvas.invalidate(); // 使画布重绘
}
// 清空画布(第二个按钮的单击事件)
public void onclick_clear(view view)
{
mcirclecanvas.mcircleinfos.clear(); // 清除绘制历史
mcirclecanvas.invalidate(); // 使画布重绘
}
}
本文截选自,如需转载,请注明出处。
《android开发完全讲义(第2版)》(本书凯发k8网页登录的版权已输出到台湾)
《android高薪之路:android程序员面试宝典 》
新浪微博: 昵称:李宁_lining