- 浏览: 465365 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
wwwjiandan:
我现在遇到的问题是将Activity设置为非全屏,且andro ...
Android中软键盘弹出时底部菜单上移问题 -
zjhdreams:
求下载链接
Android 9Patch (NinePatch) -
wtjandjay:
受教了 .......
从程序员到项目经理 -
mr_zhang2011:
将博客搬至CSDN -
fyc0109:
为什么我传过去的值, 有的都不对呢, 顺序也是一样的.就是获得 ...
Android Parcelable序列化自定义类集合在Activity间传递
Android中使用图形处理引擎,2D部分是android SDK内部自己提供,3D部分是用Open GL ES 1.0。今天我们主要要了解的是2D相关的,如果你想看3D的话那么可以跳过这篇文章。
大部分2D使用的api都在android.graphics和android.graphics.drawable包中。他们提供了图形处理相关的: Canvas、ColorFilter、Point(点)和RetcF(矩形)等,还有一些动画相关的:AnimationDrawable、BitmapDrawable和TransitionDrawable等。以图形处理来说,我们最常用到的就是在一个View上画一些图片、形状或者自定义的文本内容,这里我们都是使用Canvas来实现的。你可以获取View中的Canvas对象,绘制一些自定义形状,然后调用View. invalidate方法让View重新刷新,然后绘制一个新的形状,这样达到2D动画效果。下面我们就主要来了解下Canvas的使用方法。
Canvas对象的获取方式有两种:一种我们通过重写View.onDraw方法,View中的Canvas对象会被当做参数传递过来,我们操作这个Canvas,效果会直接反应在View中。另一种就是当你想创建一个Canvas对象时使用的方法:
Bitmap b = Bitmap.createBitmap(
100
,
100
, Bitmap.Config.ARGB_8888);
Canvas c =
new
Canvas(b);
上面代码创建了一个尺寸是100*100的Bitmap,使用它作为Canvas操作的对象,这时候的Canvas就是使用创建的方式。当你使用创建的Canvas在bitmap上执行绘制方法后,你还可以将绘制的结果提交给另外一个Canvas,这样就可以达到两个Canvas协作完成的效果,简化逻辑。但是android SDK建议使用View.onDraw参数里提供的Canvas就好,没必要自己创建一个新的Canvas对象。接下来我们看看Canvas提供我们哪些绘制图形的方法。我们创建一个自定义View对象,使用onDraw方法提供的Canvas进行绘制图形。
CanvasDemoActivity.java:
package
com.android777.demo.uicontroller.graphics;
import
android.app.Activity;
import
android.content.Context;
import
android.graphics.Canvas;
import
android.graphics.Color;
import
android.graphics.Paint;
import
android.os.Bundle;
import
android.view.View;
public
class
CanvasDemoActivity
extends
Activity {
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(
new
CustomView1(
this
));
}
/**
* 使用内部类 自定义一个简单的View
* @author Administrator
*
*/
class
CustomView1
extends
View{
Paint paint;
public
CustomView1(Context context) {
super
(context);
paint =
new
Paint();
//设置一个笔刷大小是3的黄色的画笔
paint.setColor(Color.YELLOW);
paint.setStrokeJoin(Paint.Join.ROUND);
paint.setStrokeCap(Paint.Cap.ROUND);
paint.setStrokeWidth(
3
);
}
//在这里我们将测试canvas提供的绘制图形方法
@Override
protected
void
onDraw(Canvas canvas) {
}
}
}
执行结果是一片黑色的区域,因为在自定义的CustomView1中,我们没有做任何的绘制操作。canvas提供的绘制图形的方法都是以draw开头的,我们可以查看api:
从上面方法的名字看来我们可以知道Canvas可以绘制的对象有:弧线(arcs)、填充颜色(argb和color)、Bitmap、圆(circle和oval)、点(point)、线(line)、矩形(Rect)、图片(Picture)、圆角矩形(RoundRect)、文本(text)、顶点(Vertices)、路径(path)。通过组合这些对象我们可以画出一些简单有趣的界面出来,但是光有这些功能还是不够的,如果我要画一个仪表盘(数字围绕显示在一个圆圈中)呢? 幸好Android还提供了一些对Canvas位置转换的方法:rorate、scale、translate、skew(扭曲)等,而且它允许你通过获得它的转换矩阵对象(getMatrix方法,不知道什么是转换矩阵?看这里)直接操作它。这些操作就像是虽然你的笔还是原来的地方画,但是画纸旋转或者移动了,所以你画的东西的方位就产生变化。为了方便一些转换操作,Canvas还提供了保存和回滚属性的方法(save和restore),比如你可以先保存目前画纸的位置(save),然后旋转90度,向下移动100像素后画一些图形,画完后调用restore方法返回到刚才保存的位置。下面我们就演示下canvas的一些简单用法:
void
onDraw(Canvas canvas) {
100
,
100
,
90
, paint);
}
protected
void
onDraw(Canvas canvas) {
//绘制弧线区域
RectF rect =
new
RectF(
0
,
0
,
100
,
100
);
canvas.drawArc(rect,
//弧线所使用的矩形区域大小
0
,
//开始角度
90
,
//扫过的角度
false
,
//是否使用中心
paint);
protected
void
onDraw(Canvas canvas) {
//绘制弧线区域
RectF rect =
new
RectF(
0
,
0
,
100
,
100
);
canvas.drawArc(rect,
//弧线所使用的矩形区域大小
0
,
//开始角度
90
,
//扫过的角度
true
,
//是否使用中心
paint);
}
两图对比我们可以发现,当drawArcs(rect,startAngel,sweepAngel,useCenter,paint)中的useCenter为false时,弧线区域是用弧线开始角度和结束角度直接连接起来的,当useCenter为true时,是弧线开始角度和结束角度都与中心点连接,形成一个扇形。
protected
void
onDraw(Canvas canvas) {
canvas.drawColor(Color.BLUE);
}
canvas.drawColor是直接将View显示区域用某个颜色填充满。
protected
void
onDraw(Canvas canvas) {
//画一条线
canvas.drawLine(
10
,
10
,
100
,
100
, paint);
}
Canvas.drawOval:
@Override
protected
void
onDraw(Canvas canvas) {
//定义一个矩形区域
RectF oval =
new
RectF(
0
,
0
,
200
,
300
);
//矩形区域内切椭圆
canvas.drawOval(oval, paint);
}
canvas.drawPosText:
protected
void
onDraw(Canvas canvas) {
//按照既定点 绘制文本内容
canvas.drawPosText(
"Android777"
,
new
float
[]{
10
,
10
,
//第一个字母在坐标10,10
20
,
20
,
//第二个字母在坐标20,20
30
,
30
,
//....
40
,
40
,
50
,
50
,
60
,
60
,
70
,
70
,
80
,
80
,
90
,
90
,
100
,
100
}, paint);
}
canvas.drawRoundRect:
protected
void
onDraw(Canvas canvas) {
RectF rect =
new
RectF(
50
,
50
,
200
,
200
);
canvas.drawRoundRect(rect,
30
,
//x轴的半径
30
,
//y轴的半径
paint);
}
canvas.drawPath:
protected
void
onDraw(Canvas canvas) {
Path path =
new
Path();
//定义一条路径
path.moveTo(
10
,
10
);
//移动到 坐标10,10
path.lineTo(
50
,
60
);
path.lineTo(
200
,
80
);
path.lineTo(
10
,
10
);
canvas.drawPath(path, paint);
}
canvas.drawTextOnPath:
protected
void
onDraw(Canvas canvas) {
Path path =
new
Path();
//定义一条路径
path.moveTo(
10
,
10
);
//移动到 坐标10,10
path.lineTo(
50
,
60
);
path.lineTo(
200
,
80
);
path.lineTo(
10
,
10
);
// canvas.drawPath(path, paint);
canvas.drawTextOnPath(
"Android777开发者博客"
, path,
10
,
10
, paint);
}
位置转换方法,canvas.rorate和canvas.translate:
protected
void
onDraw(Canvas canvas) {
paint.setAntiAlias(
true
);
paint.setStyle(Style.STROKE);
canvas.translate(canvas.getWidth()/
2
,
200
);
//将位置移动画纸的坐标点:150,150
canvas.drawCircle(
0
,
0
,
100
, paint);
//画圆圈
//使用path绘制路径文字
canvas.save();
canvas.translate(-
75
, -
75
);
Path path =
new
Path();
path.addArc(
new
RectF(
0
,
0
,
150
,
150
), -
180
,
180
);
Paint citePaint =
new
Paint(paint);
citePaint.setTextSize(
14
);
citePaint.setStrokeWidth(
1
);
canvas.drawTextOnPath(
"http://www.android777.com"
, path,
28
,
0
, citePaint);
canvas.restore();
Paint tmpPaint =
new
Paint(paint);
//小刻度画笔对象
tmpPaint.setStrokeWidth(
1
);
float
y=
100
;
int
count =
60
;
//总刻度数
for
(
int
i=
0
; i <count ; i++){
if
(i%
5
==
0
){
canvas.drawLine(0f, y,
0
, y+12f, paint);
canvas.drawText(String.valueOf(i/
5
+
1
), -4f, y+25f, tmpPaint);
}
else
{
canvas.drawLine(0f, y, 0f, y +5f, tmpPaint);
}
canvas.rotate(
360
/count,0f,0f);
//旋转画纸
}
//绘制指针
tmpPaint.setColor(Color.GRAY);
tmpPaint.setStrokeWidth(
4
);
canvas.drawCircle(
0
,
0
,
7
, tmpPaint);
tmpPaint.setStyle(Style.FILL);
tmpPaint.setColor(Color.YELLOW);
canvas.drawCircle(
0
,
0
,
5
, tmpPaint);
canvas.drawLine(
0
,
10
,
0
, -
65
, paint);
}
上面几个例子基本已经将常用的canvas.draw*方法测试过了,我们结合一些事件,做一些有用户交互的应用:
package
com.android777.demo.uicontroller.graphics;
import
java.util.ArrayList;
import
android.app.Activity;
import
android.content.Context;
import
android.graphics.Canvas;
import
android.graphics.Color;
import
android.graphics.Paint;
import
android.graphics.PointF;
import
android.os.Bundle;
import
android.view.MotionEvent;
import
android.view.View;
public
class
CanvasDemoActivity
extends
Activity {
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(
new
CustomView1(
this
));
}
/**
* 使用内部类 自定义一个简单的View
* @author Administrator
*
*/
class
CustomView1
extends
View{
Paint paint;
private
ArrayList<PointF> graphics =
new
ArrayList<PointF>();
PointF point;
public
CustomView1(Context context) {
super
(context);
paint =
new
Paint();
//设置一个笔刷大小是3的黄色的画笔
paint.setColor(Color.YELLOW);
paint.setStrokeJoin(Paint.Join.ROUND);
paint.setStrokeCap(Paint.Cap.ROUND);
paint.setStrokeWidth(
3
);
}
@Override
public
boolean
onTouchEvent(MotionEvent event) {
graphics.add(
new
PointF(event.getX(),event.getY()));
invalidate();
//重新绘制区域
return
true
;
}
//在这里我们将测试canvas提供的绘制图形方法
@Override
protected
void
onDraw(Canvas canvas) {
for
(PointF point : graphics) {
canvas.drawPoint(point.x, point.y, paint);
}
// super.onDraw(canvas);
}
}
}
当用户点击时将出现一个小点,拖动时将画出一条用细点组成的虚线:
发表评论
-
android Log.isLoggable方法的使用
2014-06-06 15:35 3006android 动态控制logcat日志开关,通过Log. ... -
View not attached to window manager
2013-01-10 11:55 1081View not attached to window man ... -
代码设置android:icon,android:label
2013-01-05 15:26 7998requestWindowFeature( Window.F ... -
Android项目为一个apk设置多个ICON图标和执行入口
2013-01-05 12:13 3881Android开发中,一个工程对应一个AndroidManif ... -
Intent跳转到系统应用中的拨号界面、联系人界面、短信界面及其他
2012-12-04 12:15 01:调用系统发送短信界面 Uri smsT ... -
Android 源码目录结构详解
2012-11-22 17:20 1470这是Android2.1的源代码的 ... -
如何获取android源代码
2012-07-10 17:50 2742如何获取android源代码 研究 ... -
Android uses-permission大全
2012-06-12 17:33 1072android.permission.ACCESS_CHE ... -
Android 应用程序基础(Application Fundamentals)
2012-05-23 17:42 1272Android 应用程序基础(Application Fun ... -
转Android 音乐频谱实现
2012-02-18 23:35 0最近由于需要实现音乐频谱,所以今天就为大家普及一下。 这里实现 ... -
android VideoView本工程mp4文件
2012-01-09 18:42 2707最近在做一个demo,要求播放视频,记录一下。使用的是Vid ... -
关于android播放mp3与歌词同步问题收集
2012-01-09 17:57 1691关于android播放mp3与歌词同步问题收集,有时间再试。 ... -
android使用MediaPlayer播放音乐文件时遇到的问题
2012-01-09 17:38 18386把mp3文件放在Assets文件夹里,然后用MediaPlay ... -
android资源目录---assets与res/raw的不同
2012-01-05 11:49 2382android资源目录---assets与 ... -
Android 的cpu硬盘 内存 网络设置 系统信息 硬件信息
2012-01-04 10:56 1621转载 http://www.cnmsdn.com/html/2 ... -
使用 Android Compatibility Package 来简化开发工作
2012-01-04 10:12 1436转载 http://www.cnmsdn.com/html/2 ... -
Android 9Patch (NinePatch)
2011-12-26 16:06 45411:介绍 NinePatch图片以*.9.png结尾,和普通 ... -
Windows平台下Android源码的下载
2011-12-21 11:06 1263Windows平台下Android源码的下载 ... -
改变MenuItem默认背景
2011-12-07 19:58 1447@Override public boolean onCre ... -
Android横屏竖屏切换
2011-11-10 18:20 107转载 http://blog.csdn.net/leesido ...
相关推荐
在Android开发中,Canvas是用于在屏幕上绘制2D图形的核心组件。`Canvas`类提供了丰富的绘图方法,让我们能够在Bitmap或者Surface上绘制线条、形状、文本等元素。在这个"Android画布Canvas之连线动画Demo"中,我们将...
5. **Canvas与Paint**:Canvas是绘图的基础,用于在SurfaceView上绘制图形;Paint则用于设置颜色、线条样式等绘图属性。 6. **运动模拟**:台球游戏需要精确的物理模拟,如碰撞检测、动量守恒等。这可能涉及到...
openGL-canvas-master.zip”这个项目中,开发者可能结合了这两者,创建了一个示例应用来展示如何在 Android 上使用 OpenGL ES(OpenGL 的嵌入式版本)与 Canvas 进行交互,以实现更高效的图形绘制和动画效果。...
在Android平台上,2D图形绘制是一项基础且重要的技术,它允许开发者创建丰富的用户界面和动态效果。本主题将深入探讨Android 2D图形绘制的核心概念、API和实践技巧。 首先,Android提供了两种主要的方式来实现2D...
在Android开发中,Canvas是用于在屏幕上绘制2D图形的核心组件。Kotlin作为一种现代、简洁的编程语言,已经成为Android开发的首选。本篇文章将深入探讨如何在Kotlin中更有效地利用Canvas进行绘制,以实现丰富的视觉...
在Android开发中,Canvas是用于绘制2D图形的重要工具,它是Android系统提供的一个低级绘图接口。"android-canvas-donut-chart.7z"这个压缩包文件很可能包含了一个使用Canvas来实现甜甜圈图(Donut Chart)的示例项目...
在本文中,我们将深入探讨如何基于给定的“android游戏开发源码 体育游戏-----2D迷你桌球”项目进行Android游戏开发。这个项目使用了Java编程语言(JDK 1.6.0_18版本)和Android SDK 2.1,开发环境为Eclipse 3.5.1。...
在这个项目中,很可能使用了属性动画,因为它允许对对象的任何属性进行动画处理,而且支持2D和3D变换,可以实现更复杂的桌面图标动态效果。 2. **自定义View** 实现桌面图标动画可能需要自定义View或 ViewGroup。...
在Android开发中,Canvas是用于在屏幕上绘制2D图形的核心组件。它允许开发者直接在Bitmap上进行绘制操作,实现各种视觉效果。以下是对标题和描述中提到的各种图形绘制方法的详细说明: 1. **点(Point)**:使用`...
总的来说,"MetaballLoading 2D小球加载动画"涉及到Android的动画技术、2D图形绘制、状态管理和自定义视图等多个方面,是Android开发中的一个高级实践案例。通过学习和研究这个压缩包中的内容,开发者可以提高自己在...
这些变换通常在`ImageView`、`Canvas`或自定义视图中使用,以实现复杂的图像操作。以下是一些关键概念和使用方法: 1. **矩阵基础**:在数学中,矩阵是一个二维数组,可以用来表示线性变换。在Android中,`...
在Android开发中,Canvas是图形绘制的核心工具,它允许开发者在屏幕、图片或者Bitmap上进行绘制操作。要实现“在Canvas上显示动画”,我们需要深入理解Canvas的使用方式以及与动画相关的概念和技术。以下是对这个...
Canvas是Android中用于绘图的核心组件,允许开发者在屏幕上绘制自定义图形。而Android动画则可以为用户界面元素添加动态效果,提升用户的交互体验。这部分内容可能涵盖2D绘图技巧、自定义视图的动画实现、帧动画以及...
本教程将深入探讨如何利用Android提供的核心组件,如SurfaceView、Canvas和Paint,进行2D图形的绘制。 首先,SurfaceView是一个特殊的View类,设计用于显示高性能、连续更新的图像,比如游戏画面或视频流。它在应用...
此外,Android还提供了2D图形处理类,位于`android.graphics`、`android.graphics.drawable.shapes`和`android.view.animation`包中,以及3D图形处理,依赖于OpenGL ES,相关的类位于`javax.microedition.khronos....
在Android开发中,Bitmap是用于图像处理的基本对象,它存储并表示了图像的数据。而Matrix则是Android图形系统中的一个关键类,它允许我们对图像进行各种变换操作,如旋转、缩放、平移和倾斜等。这个教程将深入探讨...
- **移动应用开发**:在Android系统中,Skia是Canvas和Bitmap类的基础,用于绘制用户界面和动画。 - **浏览器渲染**:Chrome浏览器利用Skia进行网页内容的渲染,包括HTML、CSS和JavaScript生成的2D图形。 - **游戏...
高级Canvas绘图是Android图形库的一个强大功能,允许开发者创建复杂的2D图形。在E-compass应用中,我们可以使用Canvas来绘制一个指针,这个指针会根据传感器数据动态旋转,指示出当前的磁北方向。例如,我们可以通过...
在Android开发中,Canvas是绘制2D图形的重要工具,它提供了在Bitmap上画图的功能。"安卓之Canvas撕衣服"这个话题,实际上是指利用Canvas、Bitmap和Paint等Android图形库组件来实现一种特殊效果,即在屏幕上模拟...