- 浏览: 243991 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
yingjianxuehun:
在android4.4上fb0总是打不开,已经root,权限也 ...
Android原生(Native)C开发之二 framebuffer篇 -
zdyhlp:
新版本4.3.1不能在Android2.2下工作。请问楼主用的 ...
为免费app嵌入Admob广告 -
zdyhlp:
另外要加上ads:adSize="BANNER&qu ...
为免费app嵌入Admob广告 -
zdyhlp:
<com.admob.android.ads.AdVie ...
为免费app嵌入Admob广告 -
王山而:
mark
Android引入第三方jar包的方法
在android中,手机的屏幕大少为320*480,原点坐标在左上角(0,0),在绘制图形时一定要非常清楚要绘制的图形对坐标转换的关系。
简单的图形如,直线,画点,画圆大家可能不会有什么问题,但如果遇到复杂图形或图形旋转等情况时,比较游戏俄罗斯方块中,对不同组合的方块进行变换时,涉及到很多坐标变换情况,如果不是完全清楚的话,很难编码了。
如下:
以上代码就是俄罗斯方块中的图形变换。
这是其一,另外还要找准其旋转坐标点,方程变换。
(x,y), (x+1,y),(x+2, y)即为向屏幕x轴移动,(x,y),(x,y+1),(x,y+2)即为向屏幕y轴移动,其它一此类推。
简单的图形如,直线,画点,画圆大家可能不会有什么问题,但如果遇到复杂图形或图形旋转等情况时,比较游戏俄罗斯方块中,对不同组合的方块进行变换时,涉及到很多坐标变换情况,如果不是完全清楚的话,很难编码了。
如下:
引用
public int[][] rotateStone(int[][] currentPosition) {
int[][] newPosition = new int[4][2];
int x, y;
switch (blockID) {
case 2:
if (rotatePosition == 0) {//一横变一竖
x = currentPosition[3][0];
y = currentPosition[3][1];
newPosition[0][0] = x - 3;
newPosition[0][1] = y;
newPosition[1][0] = x - 2;
newPosition[1][1] = y;
newPosition[2][0] = x - 1;
newPosition[2][1] = y;
newPosition[3][0] = x;
newPosition[3][1] = y;
rotatePosition = 1;
} else {//反之
x = currentPosition[3][0];
y = currentPosition[3][1];
newPosition[0][0] = x;
newPosition[0][1] = y - 3;
newPosition[1][0] = x;
newPosition[1][1] = y - 2;
newPosition[2][0] = x;
newPosition[2][1] = y - 1;
newPosition[3][0] = x;
newPosition[3][1] = y;
rotatePosition = 0;
}
return newPosition;
case 3:
if (rotatePosition == 0) {//左T
x = currentPosition[2][0];
y = currentPosition[2][1];
newPosition[0][0] = x;
newPosition[0][1] = y - 1;
newPosition[1][0] = x;
newPosition[1][1] = y + 1;
newPosition[2][0] = x;
newPosition[2][1] = y;
newPosition[3][0] = x + 1;
newPosition[3][1] = y;
rotatePosition = 1;
} else if (rotatePosition == 1) {//上T
x = currentPosition[2][0];
y = currentPosition[2][1];
newPosition[0][0] = x;
newPosition[0][1] = y + 1;
newPosition[1][0] = x - 1;
newPosition[1][1] = y;
newPosition[2][0] = x;
newPosition[2][1] = y;
newPosition[3][0] = x + 1;
newPosition[3][1] = y;
rotatePosition = 2;
} else if (rotatePosition == 2) {//右T
x = currentPosition[2][0];
y = currentPosition[2][1];
newPosition[0][0] = x;
newPosition[0][1] = y - 1;
newPosition[1][0] = x - 1;
newPosition[1][1] = y;
newPosition[2][0] = x;
newPosition[2][1] = y;
newPosition[3][0] = x;
newPosition[3][1] = y + 1;
rotatePosition = 3;
} else if (rotatePosition == 3) {//下T
x = currentPosition[2][0];
y = currentPosition[2][1];
newPosition[0][0] = x - 1;
newPosition[0][1] = y;
newPosition[1][0] = x + 1;
newPosition[1][1] = y;
newPosition[2][0] = x;
newPosition[2][1] = y;
newPosition[3][0] = x;
newPosition[3][1] = y - 1;
rotatePosition = 0;
}
return newPosition;
case 4:
if (rotatePosition == 0) {//上右7
x = currentPosition[2][0];
y = currentPosition[2][1];
newPosition[0][0] = x;
newPosition[0][1] = y;
newPosition[1][0] = x + 1;
newPosition[1][1] = y;
newPosition[2][0] = x + 2;
newPosition[2][1] = y;
newPosition[3][0] = x + 2;
newPosition[3][1] = y - 1;
rotatePosition = 1;
} else if (rotatePosition == 1) {//左上T
x = currentPosition[2][0];
y = currentPosition[2][1];
newPosition[0][0] = x - 1;
newPosition[0][1] = y - 2;
newPosition[1][0] = x;
newPosition[1][1] = y - 2;
newPosition[2][0] = x;
newPosition[2][1] = y - 1;
newPosition[3][0] = x;
newPosition[3][1] = y;
rotatePosition = 2;
} else if (rotatePosition == 2) {//下左7
x = currentPosition[1][0];
y = currentPosition[1][1];
newPosition[0][0] = x - 2;
newPosition[0][1] = y + 1;
newPosition[1][0] = x - 2;
newPosition[1][1] = y;
newPosition[2][0] = x - 1;
newPosition[2][1] = y;
newPosition[3][0] = x;
newPosition[3][1] = y;
rotatePosition = 3;
} else if (rotatePosition == 3) {//左上
x = currentPosition[1][0];
y = currentPosition[1][1];
newPosition[0][0] = x;
newPosition[0][1] = y;
newPosition[1][0] = x;
newPosition[1][1] = y + 1;
newPosition[2][0] = x;
newPosition[2][1] = y + 2;
newPosition[3][0] = x + 1;
newPosition[3][1] = y + 2;
rotatePosition = 0;
}
return newPosition;
case 5:
if (rotatePosition == 0) {
x = currentPosition[1][0];
y = currentPosition[1][1];
newPosition[0][0] = x - 2;
newPosition[0][1] = y - 1;
newPosition[1][0] = x - 1;
newPosition[1][1] = y - 1;
newPosition[2][0] = x;
newPosition[2][1] = y - 1;
newPosition[3][0] = x;
newPosition[3][1] = y;
rotatePosition = 1;
} else if (rotatePosition == 1) {
x = currentPosition[0][0];
y = currentPosition[0][1];
newPosition[0][0] = x;
newPosition[0][1] = y;
newPosition[1][0] = x + 1;
newPosition[1][1] = y;
newPosition[2][0] = x;
newPosition[2][1] = y + 1;
newPosition[3][0] = x;
newPosition[3][1] = y + 2;
rotatePosition = 2;
} else if (rotatePosition == 2) {
x = currentPosition[2][0];
y = currentPosition[2][1];
newPosition[0][0] = x;
newPosition[0][1] = y;
newPosition[1][0] = x;
newPosition[1][1] = y + 1;
newPosition[2][0] = x + 1;
newPosition[2][1] = y + 1;
newPosition[3][0] = x + 2;
newPosition[3][1] = y + 1;
rotatePosition = 3;
} else if (rotatePosition == 3) {
x = currentPosition[2][0];
y = currentPosition[2][1];
newPosition[0][0] = x;
newPosition[0][1] = y;
newPosition[1][0] = x + 1;
newPosition[1][1] = y;
newPosition[2][0] = x + 1;
newPosition[2][1] = y - 1;
newPosition[3][0] = x + 1;
newPosition[3][1] = y - 2;
rotatePosition = 0;
}
return newPosition;
case 6:
if (rotatePosition == 0) {
x = currentPosition[2][0];
y = currentPosition[2][1];
newPosition[0][0] = x - 1;
newPosition[0][1] = y;
newPosition[1][0] = x;
newPosition[1][1] = y + 1;
newPosition[2][0] = x;
newPosition[2][1] = y;
newPosition[3][0] = x + 1;
newPosition[3][1] = y + 1;
rotatePosition = 1;
} else {
x = currentPosition[2][0];
y = currentPosition[2][1];
newPosition[0][0] = x;
newPosition[0][1] = y - 1;
newPosition[1][0] = x - 1;
newPosition[1][1] = y;
newPosition[2][0] = x;
newPosition[2][1] = y;
newPosition[3][0] = x - 1;
newPosition[3][1] = y + 1;
rotatePosition = 0;
}
return newPosition;
case 7:
if (rotatePosition == 0) {
x = currentPosition[2][0];
y = currentPosition[2][1];
newPosition[0][0] = x - 1;
newPosition[0][1] = y - 1;
newPosition[1][0] = x - 1;
newPosition[1][1] = y;
newPosition[2][0] = x;
newPosition[2][1] = y;
newPosition[3][0] = x;
newPosition[3][1] = y + 1;
rotatePosition = 1;
} else {
x = currentPosition[2][0];
y = currentPosition[2][1];
newPosition[0][0] = x + 1;
newPosition[0][1] = y;
newPosition[1][0] = x - 1;
newPosition[1][1] = y + 1;
newPosition[2][0] = x;
newPosition[2][1] = y;
newPosition[3][0] = x;
newPosition[3][1] = y + 1;
rotatePosition = 0;
}
return newPosition;
default:
return currentPosition;
}
}
int[][] newPosition = new int[4][2];
int x, y;
switch (blockID) {
case 2:
if (rotatePosition == 0) {//一横变一竖
x = currentPosition[3][0];
y = currentPosition[3][1];
newPosition[0][0] = x - 3;
newPosition[0][1] = y;
newPosition[1][0] = x - 2;
newPosition[1][1] = y;
newPosition[2][0] = x - 1;
newPosition[2][1] = y;
newPosition[3][0] = x;
newPosition[3][1] = y;
rotatePosition = 1;
} else {//反之
x = currentPosition[3][0];
y = currentPosition[3][1];
newPosition[0][0] = x;
newPosition[0][1] = y - 3;
newPosition[1][0] = x;
newPosition[1][1] = y - 2;
newPosition[2][0] = x;
newPosition[2][1] = y - 1;
newPosition[3][0] = x;
newPosition[3][1] = y;
rotatePosition = 0;
}
return newPosition;
case 3:
if (rotatePosition == 0) {//左T
x = currentPosition[2][0];
y = currentPosition[2][1];
newPosition[0][0] = x;
newPosition[0][1] = y - 1;
newPosition[1][0] = x;
newPosition[1][1] = y + 1;
newPosition[2][0] = x;
newPosition[2][1] = y;
newPosition[3][0] = x + 1;
newPosition[3][1] = y;
rotatePosition = 1;
} else if (rotatePosition == 1) {//上T
x = currentPosition[2][0];
y = currentPosition[2][1];
newPosition[0][0] = x;
newPosition[0][1] = y + 1;
newPosition[1][0] = x - 1;
newPosition[1][1] = y;
newPosition[2][0] = x;
newPosition[2][1] = y;
newPosition[3][0] = x + 1;
newPosition[3][1] = y;
rotatePosition = 2;
} else if (rotatePosition == 2) {//右T
x = currentPosition[2][0];
y = currentPosition[2][1];
newPosition[0][0] = x;
newPosition[0][1] = y - 1;
newPosition[1][0] = x - 1;
newPosition[1][1] = y;
newPosition[2][0] = x;
newPosition[2][1] = y;
newPosition[3][0] = x;
newPosition[3][1] = y + 1;
rotatePosition = 3;
} else if (rotatePosition == 3) {//下T
x = currentPosition[2][0];
y = currentPosition[2][1];
newPosition[0][0] = x - 1;
newPosition[0][1] = y;
newPosition[1][0] = x + 1;
newPosition[1][1] = y;
newPosition[2][0] = x;
newPosition[2][1] = y;
newPosition[3][0] = x;
newPosition[3][1] = y - 1;
rotatePosition = 0;
}
return newPosition;
case 4:
if (rotatePosition == 0) {//上右7
x = currentPosition[2][0];
y = currentPosition[2][1];
newPosition[0][0] = x;
newPosition[0][1] = y;
newPosition[1][0] = x + 1;
newPosition[1][1] = y;
newPosition[2][0] = x + 2;
newPosition[2][1] = y;
newPosition[3][0] = x + 2;
newPosition[3][1] = y - 1;
rotatePosition = 1;
} else if (rotatePosition == 1) {//左上T
x = currentPosition[2][0];
y = currentPosition[2][1];
newPosition[0][0] = x - 1;
newPosition[0][1] = y - 2;
newPosition[1][0] = x;
newPosition[1][1] = y - 2;
newPosition[2][0] = x;
newPosition[2][1] = y - 1;
newPosition[3][0] = x;
newPosition[3][1] = y;
rotatePosition = 2;
} else if (rotatePosition == 2) {//下左7
x = currentPosition[1][0];
y = currentPosition[1][1];
newPosition[0][0] = x - 2;
newPosition[0][1] = y + 1;
newPosition[1][0] = x - 2;
newPosition[1][1] = y;
newPosition[2][0] = x - 1;
newPosition[2][1] = y;
newPosition[3][0] = x;
newPosition[3][1] = y;
rotatePosition = 3;
} else if (rotatePosition == 3) {//左上
x = currentPosition[1][0];
y = currentPosition[1][1];
newPosition[0][0] = x;
newPosition[0][1] = y;
newPosition[1][0] = x;
newPosition[1][1] = y + 1;
newPosition[2][0] = x;
newPosition[2][1] = y + 2;
newPosition[3][0] = x + 1;
newPosition[3][1] = y + 2;
rotatePosition = 0;
}
return newPosition;
case 5:
if (rotatePosition == 0) {
x = currentPosition[1][0];
y = currentPosition[1][1];
newPosition[0][0] = x - 2;
newPosition[0][1] = y - 1;
newPosition[1][0] = x - 1;
newPosition[1][1] = y - 1;
newPosition[2][0] = x;
newPosition[2][1] = y - 1;
newPosition[3][0] = x;
newPosition[3][1] = y;
rotatePosition = 1;
} else if (rotatePosition == 1) {
x = currentPosition[0][0];
y = currentPosition[0][1];
newPosition[0][0] = x;
newPosition[0][1] = y;
newPosition[1][0] = x + 1;
newPosition[1][1] = y;
newPosition[2][0] = x;
newPosition[2][1] = y + 1;
newPosition[3][0] = x;
newPosition[3][1] = y + 2;
rotatePosition = 2;
} else if (rotatePosition == 2) {
x = currentPosition[2][0];
y = currentPosition[2][1];
newPosition[0][0] = x;
newPosition[0][1] = y;
newPosition[1][0] = x;
newPosition[1][1] = y + 1;
newPosition[2][0] = x + 1;
newPosition[2][1] = y + 1;
newPosition[3][0] = x + 2;
newPosition[3][1] = y + 1;
rotatePosition = 3;
} else if (rotatePosition == 3) {
x = currentPosition[2][0];
y = currentPosition[2][1];
newPosition[0][0] = x;
newPosition[0][1] = y;
newPosition[1][0] = x + 1;
newPosition[1][1] = y;
newPosition[2][0] = x + 1;
newPosition[2][1] = y - 1;
newPosition[3][0] = x + 1;
newPosition[3][1] = y - 2;
rotatePosition = 0;
}
return newPosition;
case 6:
if (rotatePosition == 0) {
x = currentPosition[2][0];
y = currentPosition[2][1];
newPosition[0][0] = x - 1;
newPosition[0][1] = y;
newPosition[1][0] = x;
newPosition[1][1] = y + 1;
newPosition[2][0] = x;
newPosition[2][1] = y;
newPosition[3][0] = x + 1;
newPosition[3][1] = y + 1;
rotatePosition = 1;
} else {
x = currentPosition[2][0];
y = currentPosition[2][1];
newPosition[0][0] = x;
newPosition[0][1] = y - 1;
newPosition[1][0] = x - 1;
newPosition[1][1] = y;
newPosition[2][0] = x;
newPosition[2][1] = y;
newPosition[3][0] = x - 1;
newPosition[3][1] = y + 1;
rotatePosition = 0;
}
return newPosition;
case 7:
if (rotatePosition == 0) {
x = currentPosition[2][0];
y = currentPosition[2][1];
newPosition[0][0] = x - 1;
newPosition[0][1] = y - 1;
newPosition[1][0] = x - 1;
newPosition[1][1] = y;
newPosition[2][0] = x;
newPosition[2][1] = y;
newPosition[3][0] = x;
newPosition[3][1] = y + 1;
rotatePosition = 1;
} else {
x = currentPosition[2][0];
y = currentPosition[2][1];
newPosition[0][0] = x + 1;
newPosition[0][1] = y;
newPosition[1][0] = x - 1;
newPosition[1][1] = y + 1;
newPosition[2][0] = x;
newPosition[2][1] = y;
newPosition[3][0] = x;
newPosition[3][1] = y + 1;
rotatePosition = 0;
}
return newPosition;
default:
return currentPosition;
}
}
以上代码就是俄罗斯方块中的图形变换。
这是其一,另外还要找准其旋转坐标点,方程变换。
(x,y), (x+1,y),(x+2, y)即为向屏幕x轴移动,(x,y),(x,y+1),(x,y+2)即为向屏幕y轴移动,其它一此类推。
发表评论
-
Android-Intent和PendingIntent的关系
2010-11-05 14:40 7869Intent和PendingIntent的关系 Intent和 ... -
Android引入第三方jar包的方法
2010-03-17 09:09 4457在Android平台中可以使用第三方外部 JAR库文件,在Ec ... -
android的网络接口
2010-02-11 10:07 0目前android平台有3种网各接口可以使用,它们分别是:ja ... -
Google Android SDK 2.1正式发布
2010-02-02 16:45 14591月12日,来自Google Android开发团队博客的消息 ... -
android 常用 INTENT
2010-01-20 23:35 5070IntentFilter 简述:结构化描述int ... -
Google Weather API
2010-01-20 22:10 2262Google Weather API 只支持美国地区使用邮政编 ... -
TableLayout 中 stretchColumns的用法
2010-01-19 16:32 9572<?xml version="1.0" ... -
Android应用开发中的风格和主题(style,themes)
2010-01-19 15:06 2120当你设计你的程序的时候,你可以用风格和主题来统一格式化各种屏幕 ... -
WIFI IP转换
2010-01-14 14:01 1030private String intToIp(int i) { ... -
Get IP Address
2010-01-14 10:43 15541, Connect via WIFI WifiManager ... -
OPhone开发环境设置
2010-01-07 15:16 13351 安装eclipse 3.4.x http://www.e ... -
Android通过AIDL接口实现跨进程通讯
2010-01-07 14:43 2385在Android开发中, 每个应 ... -
对android重力测试的一个疑问
2010-01-04 11:29 1778之前有看过IBM Eyes 关于SensorManager的代 ... -
Android启动过程
2009-12-30 11:07 31981. Boot系统初始化, 具 ... -
android source tree
2009-12-29 15:21 1701makefile 全局makefile bionic b ... -
android中绘图的方法
2009-11-23 11:13 2585绘制各种图形、文字使用Canvas类中drawRect、dra ... -
零打碎敲学Android(一)—用什么来替代Graphics
2009-11-23 10:47 2896一、要想在View中绘制图 ... -
Android原生(Native)C开发之三 鼠标事件篇(捕鼠记)
2009-11-20 23:38 2833在做SDL至Android的移植时,键盘事件是能正常捕获到,看 ... -
Android原生(Native)C开发之二 framebuffer篇
2009-11-20 23:35 2501虽然现在能通过交叉环境编译程序,并push到Android上执 ... -
Android原生(Native) C开发之一 环境搭建篇
2009-11-20 23:31 1596Android是基于Linux的操作系统,处理器是ARM的,所 ...
相关推荐
"Android-CoordinateAxisChart在Android绘制坐标轴函数图像"这个项目专注于利用自定义视图来实现坐标轴图表的绘制,这对于数据分析、科学计算或统计展示的应用非常有用。下面将详细介绍如何在Android中创建并使用`...
在这个主题中,我们主要关注如何在Android平台上使用OpenGL ES绘制一个透明的三维/空间坐标系。这个过程涉及到几个关键的概念和技术。 首先,我们要理解OpenGL ES中的坐标系。OpenGL ES采用右手坐标系,其中X轴正...
2. **绘图坐标系统**:理解Android的左下角为原点的坐标系统至关重要,这直接影响到绘图的位置和大小。 3. **绘图路径(Path)**:Path对象可以用来绘制复杂的几何形状,通过addRect、addCircle、addPath等方法,可以...
在Android开发中,有时我们需要实现根据用户触摸屏幕的坐标来判断其点击的是哪个特定的图形区域,例如将一个圆分成四个扇形区域。这个任务在创建互动式UI或者游戏时非常常见。本篇将深入探讨如何实现“Android根据...
总结来说,这个源码实例涵盖了Android图形编程的基础,包括自定义View、Canvas绘图、触摸事件处理以及资源管理等关键概念。通过深入研究和理解这个源码,开发者可以学习到如何在Android应用中实现自己的数据可视化...
同时,也可能涉及Matrix的使用,Matrix可以对绘图坐标进行变换,实现旋转、缩放、平移等效果。 Android绘图还可以结合SurfaceView或SurfaceHolder,实现实时动态的图形渲染,这对于游戏和动画等场景非常有用。...
Android绘图与自定义组件的结合,能够让我们创造出独具特色的交互效果和视觉表现。以下将详细阐述这两个重要概念及其应用。 1. Android绘图基础 - Canvas与Paint:Canvas是绘制图形的基础,它提供了各种画图方法,...
本文将深入探讨Android绘图实现的相关知识点,包括基础概念、核心类、API以及实践技巧。 一、基础概念 1. Canvas与Bitmap:Canvas是Android绘图的主要工作台,你可以在这个画布上绘制各种图形。而Bitmap则可以看作...
在Android平台上,开发一款简单的涂鸦绘图应用是一项常见的任务,尤其对于初学者来说,它可以帮助理解Android...通过这个项目,开发者不仅可以掌握Android绘图的基础,还能了解到如何处理用户输入和实现自定义视图。
自定义View时,理解坐标系至关重要,因为许多关键的绘图和事件处理逻辑都涉及到坐标计算。例如,重写`onDraw()`方法时,你需要使用`Canvas`对象提供的方法(如`drawRect()`, `drawCircle()`),这些方法接受的参数...
在绘图应用中,可以根据坐标来绘制线条或形状。 ### 示例代码分析 以下是一个简单的示例,展示了如何在`AbsoluteLayout` Activity中实现上述功能: ```java public class AbsoluteLayout extends Activity { ...
2. **绘图坐标系统**:Android的绘图坐标系统原点位于屏幕左上角,x轴向右延伸,y轴向下延伸。你可以使用`translate()`方法改变当前坐标系的位置,`scale()`方法缩放坐标系,`rotate()`方法旋转坐标系,以及`skew()`...
在Android开发中,有时我们需要创建个性化的视图来满足特定的数据显示需求,比如自定义的坐标系用于绘制折线图。这个"Android 支持滚动的自定义坐标系"项目就是为了实现这样一个功能,允许用户根据自己的需求定义...
本篇将深入探讨`Android Canvas绘图`的相关知识点,包括基本概念、常用方法以及实际应用。 一、Canvas基础 1. `Canvas`对象:在Android中,`Canvas`是绘画的基础,它就像一块画布,我们可以在上面绘制各种元素。...
Android绘图的核心类是`Canvas`,它提供了在各种表面上绘制的基本操作。`Canvas`对象就像一个画布,你可以在这个画布上画出你的图形。而`Paint`对象则负责设置颜色、样式和字体等绘图属性,就像是你的画笔和颜料。...
首先,我们需要了解Android的绘图基础。Android提供了Canvas类,它是一个画布,可以在这个画布上进行各种图形绘制操作。我们通常会在View或SurfaceView的onDraw()方法中使用Canvas来完成绘图。以下是一个简单的...
在这个“Android绘图”的示例中,我们主要关注如何利用Canvas类和Paint类来绘制复杂的图形,例如这里提到的Android机器人。下面我们将深入探讨这两个核心类以及它们在自定义绘图中的应用。 首先,Canvas是Android...
本文将深入探讨Android View中的原点坐标相关问题,这对于理解和优化自定义View的绘制至关重要。 首先,理解Android视图坐标系统是关键。在Android中,每个View都有自己的坐标系统,其原点((0,0))位于View的左上...
在Android平台上,开发一个简易的绘图板是一个常见的需求,特别是在构建教育、创意或娱乐类应用时。这个“android之简易绘图板”项目显然旨在提供一个基础的绘画功能,让用户能够在屏幕上自由绘制图形和线条。然而,...
首先,我们来理解Android的绘图机制。Android的绘图过程基于Canvas和Paint对象。Canvas提供了画布,可以在此上绘制各种形状、文本和位图,而Paint则定义了绘制的样式,如颜色、线条宽度、阴影等。开发者可以通过调用...