转自:http://blog.sina.com.cn/s/blog_61ef49250100qw9x.html
主要是Canvas类(android.graphics.Canvas)。Canvas类就是表示一块画布,你可以在上面画你想画的东西。当然,你还可以设置画布的属性,如画布的颜色/尺寸等。Canvas提供了如下一些方法:
Canvas():创建一个空的画布,可以使用setBitmap()方法来设置绘制的具体画布;
Canvas(Bitmap bitmap):以bitmap对象创建一个画布,则将内容都绘制在bitmap上,bitmap不得为null;
Canvas(GL gl):在绘制3D效果时使用,与OpenGL有关;
drawColor:设置画布的背景色;
setBitmap:设置具体的画布;
clipRect:设置显示区域,即设置裁剪区;
isOpaque:检测是否支持透明;
rotate:旋转画布;
下面我们就用Canvas来画一个机器人——android,oh my love!一看就知道,机器人的外形是由矩形/圆/圆弧/线条组成的,因此要知道怎么用Canvas画矩形/圆/圆弧和线条。可惜阿,上面几个方法基本都没用上。
canvas.drawRect(RectF,Paint)方法用于画矩形,第一个参数为图形显示区域,第二个参数为画笔,设置好图形显示区域Rect和画笔Paint后,即可画图;
canvas.drawRoundRect(RectF, float, float, Paint) 方法用于画圆角矩形,第一个参数为图形显示区域,第二个参数和第三个参数分别是水平圆角半径和垂直圆角半径。
canvas.drawLine(startX, startY, stopX, stopY, paint):前四个参数的类型均为float,最后一个参数类型为Paint。表示用画笔paint从点(startX,startY)到点(stopX,stopY)画一条直线;
canvas.drawArc(oval, startAngle, sweepAngle, useCenter, paint):第一个参数oval为RectF类型,即圆弧显示区域,startAngle和sweepAngle均为float类型,分别表示圆弧起始角度和圆弧度数,3点钟方向为0度,useCenter设置是否显示圆心,boolean类型,paint为画笔;
canvas.drawCircle(float,float, float, Paint)方法用于画圆,前两个参数代表圆心坐标,第三个参数为圆半径,第四个参数是画笔;
清楚这些函数的用法之后,我们是否就噼里啪啦地敲代码了呢?别急,我们来搞个设计。既然这些函数都是用来画图的,也就是说它们有共性——画。所有我们应该设计一个接口interface,对于这次任务,只需要一个成员方法就足够了。对于每一个图形,是只用一个方法画,还是将画图封装成类呢?我建议是封装成类。因为说不定你明天就会嫌弃它不会动,想它动起来,或者你过两天又希望在机器人的每个部位加点什么。所以我将每一个图形封装成类,都实现一个名叫drawGraphics的接口。最后,要记得给UI创建一个线程哦。
就这样我开始动手做了,但是很快就发现问题了。什么问题?在定位的时候,也就是设置每个图形的显示区域时,我自以为这里的Rect跟Java的Rectangle是一样的,但我错了。原来这厮跟MFC中的RECT结构才是一家人,害我折腾了许久。
Rect(int left,int top,int right,int bottom)
left
矩形左上角X坐标值
top
矩形左上角Y坐标值
right
矩形右下角X坐标值
bottom
矩形右下角Y坐标值
下面借用一张图说明(忘了哪个博客找来的(*^__^*) 嘻嘻……),如Rect(150, 75, 260, 120) 一目了然吧。
还有一点非常重要的是,屏幕最上方的状态栏和标题栏总占去来50的高度,同时坐标原点下移到标题栏下方,即如果你的手机屏幕分辨率为(320X480),编程时如果没有设置去除状态栏和标题栏,你只能操控的范围只有(320X430),而且坐标原点下移。记住咯。
//drawGraphics.java
package com.scgm.android.drawable;
import android.graphics.Canvas;
public interface drawGraphics {
public void draw(Canvas canvas);
}
package com.scgm.android.drawable;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.View;
public classGameView extends View implements Runnable{
//声明Paint对象
private Paint mPaint= null;
privatedrawGraphics drawGraphics= null;
public GameView(Context context) {
super(context);
// TODOAuto-generated constructor stub
//构建对象
mPaint= new Paint();
//开启线程
new Thread(this).start();
}
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
//设置画布为黑色背景
//canvas.drawColor(Color.BLACK);
//消除锯齿
mPaint.setAntiAlias(true);
//设置图形为空心
mPaint.setStyle(Paint.Style.STROKE);
//绘制空心几何图形
drawGraphics= new DrawCircle();
drawGraphics.draw(canvas);
drawGraphics= new DrawLine();
drawGraphics.draw(canvas);
drawGraphics= newDrawRect();
drawGraphics.draw(canvas);
}
@Override
public void run() {
// TODOAuto-generated method stub
while(!Thread.currentThread().isInterrupted()) {
try{
Thread.sleep(1000);
} catch(InterruptedException e) {
// TODO: handle exception
Thread.currentThread().interrupt();
}
//使用postInvalidate 可以直接在线程中更新界面
postInvalidate();
}
}
}
//DrawRect.java
package com.scgm.android.drawable;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
public class DrawRect implements drawGraphics{
private Paint paint= null;
public DrawRect(){
paint= new Paint();
}
@Override
public void draw(Canvas canvas) {
// TODOAuto-generated method stub
//定义圆角矩形对象
RectF rectF1 = newRectF(120,170,370,500);
RectF rectF2 = newRectF(40,150,90,400);
RectF rectF3 = newRectF(390,150,440,400);
RectF rectF4 = newRectF(140,520,200,650);
RectF rectF5 = newRectF(290,520,350,650);
paint.setAntiAlias(true);
//设置画笔颜色为BLUE
paint.setColor(Color.GREEN);
//在画布上绘制圆角矩形/圆弧/直线
canvas.drawRoundRect(rectF1, 20, 20, paint);
canvas.drawRoundRect(rectF2, 20, 20, paint);
canvas.drawRoundRect(rectF3, 20, 20, paint);
canvas.drawRoundRect(rectF4, 20, 20, paint);
canvas.drawRoundRect(rectF5, 20, 20, paint);
}
}
//DrawLine.java
package com.scgm.android.drawable;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
public class DrawLine implements drawGraphics{
private Paint paint= null;
public DrawLine(){
paint= new Paint();
}
@Override
publicvoiddraw(Canvas canvas) {
// TODOAuto-generated method stub
paint.setAntiAlias(true);
//绘制直线
paint.setColor(Color.GREEN);
//设置线条粗细
paint.setStrokeWidth(12);
canvas.drawLine(120,40,170,90, paint);
canvas.drawLine(320,90,370,40, paint);
}
}
//DrawCircle.java
package com.scgm.android.drawable;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
public class DrawCircle implements drawGraphics{
private Paint paint= null;
private Paint paint_eye= null;
public DrawCircle(){
paint= new Paint();
paint_eye= new Paint();
}
@Override
public void draw(Canvas canvas) {
// TODOAuto-generated method stub
//绘制圆形(圆心x,圆心y,半径r,画笔p)
paint_eye.setAntiAlias(true);
paint.setAntiAlias(true);
RectF rectF = newRectF(120,60,370,240);
paint_eye.setColor(Color.WHITE);
paint.setColor(Color.GREEN);
canvas.drawCircle(190, 110, 18, paint_eye);
canvas.drawCircle(300, 110, 18, paint_eye);
canvas.drawArc(rectF, 180, 180,true, paint);
}
}
//GameStart.java
package com.scgm.android.drawable;
import android.app.Activity;
import android.os.Bundle;
public class GameStart extends Activity {
private GameView mGameView= null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.mGameView= newGameView(this);
setContentView(mGameView);
}
}
分享到:
相关推荐
通过这个案例,开发者不仅可以学习到如何使用Canvas绘制自定义图形,还可以深入理解Matrix和Shader在Android图形绘制中的应用,这些都是Android UI开发中的重要技能。同时,这也提供了一个实际的应用场景,帮助...
综上所述,掌握Canvas和clipRect的使用对于Android开发者来说至关重要,它们是构建丰富、动态用户界面的基础。通过深入学习和实践,开发者可以创建出更具创新性和交互性的应用程序。在实际项目中,不断探索和优化...
这份“安卓Android源码——(Canvas画布).rar”压缩包很可能是包含了一些关于Canvas使用的源代码示例或者解析,帮助我们深入理解Android图形绘制的底层机制。 Canvas是Android中的一个类,它允许开发者通过调用其...
Android 开发者学习笔记——View、Canvas、bitmap 是 Android 开发中常用的类,本文将通过实例讲解 View、Canvas 等相关知识点。 从资源中获取位图 在 Android 开发中,获取位图可以使用 BitmapDrawable 或 ...
博客《自定义控件三部曲之绘图篇(十三)——Canvas与图层(一)》对应源码,博客地址:http://blog.csdn.net/harvic880925/article/details/51317746
Canvas使用集合意味着我们可以利用它来绘制一系列图形、文本、图像等元素,从而实现自定义视图或控件。本篇文章将深入探讨Android Canvas的使用方法以及与之相关的集合操作。 Canvas是Android中的一个类,它提供了...
在Android系统中,Canvas通常与其他类一起使用,比如Paint、Path和Drawable。Paint负责控制图形的外观,如颜色、风格、抗锯齿等;Path用于创建复杂路径,可以组合直线、曲线等元素;Drawable是可绘制对象的抽象接口...
本文将详细解析如何利用Android的源码实现这些功能,特别是使用Canvas进行绘制的操作。 首先,让我们来了解一下`Canvas`。在Android中,`Canvas`是图形绘制的核心,它提供了在Bitmap上绘制线条、文本、图像等各种...
1. **自定义视图**:为了创建独特且美观的日历视图,开发者可能创建了自定义的View或ViewGroup,这涉及到对Android绘图API的理解,如Canvas、Paint和Rect。 2. **用户界面设计**:MyDate可能遵循了Material Design...
"Android——仿美图秀秀和IOS系统的相机胶卷"这个项目的目标就是创建一个与美图秀秀相似,并且具有iOS系统相机胶卷用户体验的应用。 首先,我们要关注的是多媒体文件的管理和访问。在Android中,我们可以使用`...
1. 使用Canvas绘制:Android的View类提供了丰富的绘图API,通过Canvas对象可以绘制出日历的格子、日期等元素。自定义日历视图通常需要重写onDraw()方法,根据日期范围计算每个格子的位置和大小,然后绘制相应的日期...
这篇博客"2011.09.20(3)——— android canvas.clipRect"主要探讨了Canvas类中的`clipRect()`方法,这是一个非常关键的裁剪操作,用于限制后续绘图操作的区域。 `clipRect()`方法允许开发者定义一个矩形区域,...
这篇文档将深入解析《安卓Android源码——三国杀版连连看》这个项目,它是一个基于HTML5 Canvas特性和纯JavaScript开发的游戏。Canvas是HTML5的一个重要组成部分,它为Web开发者提供了一个在网页上进行2D图形绘制的...
总的来说,使用SurfaceView和Canvas在Android上实现动态效果是一种常见且实用的技术。通过熟练掌握这些技术,开发者可以创造出更多引人入胜的用户界面,提升应用的吸引力和用户体验。在实际项目中,可以根据需求调整...
这将帮助你更好地掌握自定义View的使用,以及Android动画系统的工作原理。 总的来说,Android的自定义View功能强大,可以创造出各种富有创意的UI特效。光点模糊渐变的自旋转圆环和水滴波纹特效只是冰山一角,开发者...
使用Path对象和canvas提供的绘图API(如`drawLine()`, `drawRect()`, `rotate()`)来构建和绘制风车的各个部分。 4. **动画更新**: 在绘制线程中,我们需要跟踪风车的旋转状态,并根据时间间隔更新其旋转角度。可以...
总结,这个"安卓Android源码——使用代码绘制一个电池 (非图片)"的示例,旨在教开发者如何利用Android的图形绘制API来自定义复杂UI组件,不仅提升了用户体验,也锻炼了开发者对底层图形绘制的理解和掌控能力。...