Android开发(1):随机绘制彩色实心圆

Android开发(1):随机绘制彩色实心圆

本文介绍了如何利用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开发权威指南》,如需转载,请注明出处。
转发微博,赢取《Android开发权威指南》,截止到9月12日,机会难得!活动地址:http://event.weibo.com/208255《Android开发权威指南》答疑论坛:http://books.51happyblog.com

新浪微博:http://t.sina.com.cn/androidguy 昵称:李宁_Lining


华章培训网视频教程:实现Android版的多功能日历

《Android/OPhone开发完全讲义》(本书版权已输出到台湾)

样章和目录下载
互动网
当当网 卓越亚马逊


《人人都玩开心网:Ext JS+Android+SSH整合开发Web与移动SNS》

script.txt文件下载


样章下载
互动网


var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-16915591-1']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值