Android Canvas绘图详解

Android Canvas绘图详解
Android Canvas绘图详解

Android Canvas绘图详解(图文)

摘要Android中使用图形处理引擎,2D部分是android SDK内部自己提供,3D部分是用Open GL ES 1.0。今天我们主要要了解的是2D相关的,如果你想看3D的话那么可以跳过这篇文章。大部分2D 使用的api都在android.graphics和android.graphics.drawable包中。他们提供了图

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对象时使用的方法:

1 2 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:

1 2 3 4 5 6 package com.android777.demo.uicontroller.graphics;

import android.app.Activity;

import android.content.Context;

import android.graphics.Canvas;

import android.graphics.Color;

7 8 9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47 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开头的。

从上面方法的名字看来我们可以知道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的一些简单用法:

1 2 3 4 protected void onDraw(Canvas canvas) {

canvas.drawCircle(100, 100, 90, paint); }

效果是:

1 2 3 4 5 6 7 8 9

10

11

12

13

14 @Override

protected void onDraw(Canvas canvas) { //绘制弧线区域

RectF rect =new RectF(0, 0, 100, 100);

canvas.drawArc(rect,//弧线所使用的矩形区域大小 0, //开始角度

90,//扫过的角度

false,//是否使用中心

paint);

}

使用下面的代码:

1 2 3 4 5 6 7 8 9

10

11

12

13 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时,是弧线开始角度和结束角度都与中心点连接,形成一个扇形。

1 2 3 4 5 protected void onDraw(Canvas canvas) { canvas.drawColor(Color.BLUE);

}

canvas.drawColor是直接将View显示区域用某个颜色填充满。

1 2 3 4 5 6 7 @Override

protected void onDraw(Canvas canvas) {

//画一条线

canvas.drawLine(10, 10, 100, 100, paint); }

Canvas.drawOval:

1 2 3 4 5 6 7 8 9 @Override

protected void onDraw(Canvas canvas) {

//定义一个矩形区域

RectF oval =new RectF(0,0,200,300);

//矩形区域内切椭圆

canvas.drawOval(oval, paint);

}

canvas.drawPosT ext:

1 2 3 4 5 6 7 8 9

10

11

12

13

14

15

16 @Override

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);

17

18

} canvas.drawRect:

1 2 3 4 5 6 7 8 9 10 @Override

protected void onDraw(Canvas canvas) {

RectF rect =new RectF(50, 50, 200, 200); canvas.drawRect(rect, paint);

}

}

canvas.drawRoundRect:

1 2 3 4 5 6 7 8 9

10

11 @Override

protected void onDraw(Canvas canvas) {

RectF rect =new RectF(50, 50, 200, 200);

canvas.drawRoundRect(rect,

30,//x轴的半径

30,//y轴的半径

paint);

}

canvas.drawPath:

1 2 3 4 5 6 7 8 9

10

11

12 @Override

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:

1 2 3 4 5 6 7 8 9

10

11

12

13 @Override

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:

1 2 3 4 5 6 7 8 9

10

11

12

13

14 @Override

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);

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46 citePaint.setTextSize(14);

citePaint.setStrokeWidth(1);

canvas.drawTextOnPath("https://www.360docs.net/doc/479741640.html,", 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

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*方法测试过了,我们结合一些事件,做一些有用户交互的应用:

1 2 3 4 5 6 7 8 9

10

11

12

13

14

15 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 {

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59 @Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(new CustomView1(this));

}

/**

* 使用内部类自定义一个简单的View

* @author Administrator

*

*/

class CustomView1 extends View{

Paint paint;

private ArrayList graphics =new ArrayList(); 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();//重新绘制区域

returntrue;

}

//在这里我们将测试canvas提供的绘制图形方法

@Override

protected void onDraw(Canvas canvas) {

for(PointF point : graphics) {

60

61

62

63

64

65

66

67 canvas.drawPoint(point.x, point.y, paint); }

// super.onDraw(canvas);

}

}

}

当用户点击时将出现一个小点,拖动时将画出一条用细点组成的虚线:

Android日历完整实现

实用第一智慧密集 2011. 05 实现基于Android 的日历系统 摘要: Android 作为目前较为流行的智能手机操作系统已成为大多数人的首选。在美国乃至世界 的很多地方的出货量已经超越Iphone,成为世界上最大智能手机操作系统。因此,世界各地的程 序员都跃跃欲试地想学习Android 的开发,并希望从中捞得属于自己的第一桶金。在此给出一个 基于Android 的日历系统的完整实现过程。 关键词: Android;日历;绘画;农历;记录;提醒 1 引言 要实现的日历除了常规的日历功能外,还可以显示与当前 日期相关的信息,如当前日期的农历日期、天干地支、节日等 信息。下面先看看日历的绚丽界面,如图1、图2 所示。 主要功能

2 绘画基础 由于实现的日历系统要涉及到大量的Android 绘图技术, 因此,要简单介绍Android 的绘图技术。 绘制图形通常在Android.view.View 或其子类的onDraw 方 法中进行。该方法的定义如下: protected void onDraw(Canvas canvas); 其中Canvas 对象提供了大量用于绘图的方法,这些方法 主要包括绘制像素点、直线、圆形、弧、文本,这些都是组成 复杂图形的基本元素。如果要画更复杂的图形,可以采用组合 这些图形基本元素的方式来完成。例如,可以采用画3 条直线 的方式来画三角形。下面来看一下绘制图形基本元素的方法。 2.1 绘制像素点 public native void drawPoint(float x, float y, Paint paint); // 画一个像素点 public native void drawPoints(float[] pts, int offset, int count, Paint paint); // 画多个像素点 public void drawPoints(float[] pts, Paint paint); // 画多个像素点 参数的含义如下: (1) x:像素点的横坐标。 (2) y:像素点的纵坐标。 (3) paint:描述像素点属性的Paint 对象。可设置像素点 的大小、颜色等属性。绘制其他图形元素的Paint 对象与绘制 像素点的Paint 对象的含义相同。在绘制具体的图形元素时可 根据实际的情况设置Paint 对象。 (4) pts: drawPoints 方法可一次性画多个像素点。pts 参数 表示多个像素点的坐标。该数组元素必须是偶数个,两个一组 为一个像素点的坐标。 (5) offset: drawPoints 方法可以取pts 数组中的一部分连 续元素作为像素点的坐标,因此,需要通过offset 参数来指定 取得数组中连续元素的第一个元素的位置,也就是元素偏移 量,从0 开始。例如,要从第3 个元素开始取数组元素,那么 offset 参数值就是2。 (6) count:要获得的数组元素个数, count 必须为偶数 (两个数组元素为一个像素点的坐标)。 要注意的是, offset 可以从任意一个元素开始取值,例如, offset 可以为1,然后count 为4。

Android UI开发专题

https://www.360docs.net/doc/479741640.html,/cmdn/bbs/viewthread.php?tid=18736&page=1 #pid89255 Android UI开发专题(一) 之界面设计 近期很多网友对Android用户界面的设计表示很感兴趣,对于Android UI开发自绘控件和游戏制作而言掌握好绘图基础是必不可少的。本次专题分10节来讲述,有关OpenGL ES相关的可能将放到以后再透露。本次主要涉及以下四个包的相关内容:android.content.res 资源类 android.graphics 底层图形类 android.view 显示类 android.widget 控件类 一、android.content.res.Resources 对于Android平台的资源类android.content.res.Resources可能很多网友比较陌生,一起来看看SDK上是怎么介绍的吧,Contains classes for accessing application resources, such as raw asset files, colors, drawables, media or other other files in the package, plus important device configuration details (orientation, input types, etc.) that affect how the application may behave.平时用到的二进制源文件raw、颜色colors、图形drawables和多媒体文件media的相关资源均通过该类来管理。 int getColor(int id) 对应res/values/colors.xml Drawable getDrawable(int id) 对应res/drawable/ XmlResourceParser getLayout(int id) 对应res/layout/ String getString(int id) 和CharSequence getText(int id) 对应res/values/strings.xml InputStream openRawResource(int id) 对应res/raw/ void parseBundleExtra (String tagName, AttributeSet attrs, Bundle outBundle) 对应res/xml/ String[] getStringArray(int id) res/values/arrays.xml float getDimension(int id) res/values/dimens.xml 二、android.graphics.Bitmap 作为位图操作类,Bitmap提供了很多实用的方法,常用的我们总结如下: boolean compress(https://www.360docs.net/doc/479741640.html,pressFormat format, int quality, OutputStream stream) 压缩一个Bitmap对象根据相关的编码、画质保存到一个OutputStream中。其中第一个压缩格式目前有JPG和PNG void copyPixelsFromBuffer(Buffer src) 从一个Buffer缓冲区复制位图像素 void copyPixelsToBuffer(Buffer dst) 将当前位图像素内容复制到一个Buffer缓冲区 我们看到创建位图对象createBitmap包含了6种方法在目前的Android 2.1 SDK中,当然他们使用的是API Level均为1,所以说从Android 1.0 SDK开始就支持了,所以大家可以放心使用。

Android Canvas绘图详解

Android Canvas绘图详解(图文) 摘要Android中使用图形处理引擎,2D部分是android SDK内部自己提供,3D部分是用Open GL ES 1.0。今天我们主要要了解的是2D相关的,如果你想看3D的话那么可以跳过这篇文章。大部分2D 使用的api都在android.graphics和android.graphics.drawable包中。他们提供了图 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对象时使用的方法: 1 2 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: 1 2 3 4 5 6 package com.android777.demo.uicontroller.graphics; import android.app.Activity; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color;

android UI界面设计

Android UI开发专题(一) 之界面设计 发帖日期:2010-02-09 10:49:28 标签:ophone 近期很多网友对Android用户界面的设计表示很感兴趣,对于Android UI开发自绘控件和游戏制作而言掌握好绘图基础是必不可少的。本次专题分10节来讲述,有关OpenGL ES相关的可能将放到以后再透露。本次主要涉及以下四个包的相关内容: android.content.res 资源类 android.graphics 底层图形类 android.view 显示类 android.widget 控件类 一、android.content.res.Resources 对于Android平台的资源类android.content.res.Resources可能很多网友比较陌生,一起来看看SDK上是怎么介绍的吧,Contains classes for accessing application resources, such as raw asset files, colors, drawables, media or other other files in the package, plus important device configuration details (orientation, input types, etc.) that affect how the application may behave.平时用到的二进制源文件raw、颜色colors、图形drawables和多媒体文件media的相关资源均通过该类来管理。 int getColor(int id) 对应res/values/colors.xml Drawable getDrawable(int id) 对应res/drawable/ XmlResourceParser getLayout(int id) 对应res/layout/ String getString(int id) 和CharSequence getText(int id) 对应 res/values/strings.xml InputStream openRawResource(int id) 对应res/raw/ void parseBundleExtra (String tagName, AttributeSet attrs, Bundle outBundle) 对应res/xml/ String[] getStringArray(int id) res/values/arrays.xml float getDimension(int id) res/values/dimens.xml 二、android.graphics.Bitmap 作为位图操作类,Bitmap提供了很多实用的方法,常用的我们总结如下: boolean compress(https://www.360docs.net/doc/479741640.html,pressFormat format, int quality, OutputStream stream) 压缩一个Bitmap对象根据相关的编码、画质保存到一个OutputStream中。其中第一个压缩格式目前有JPG和PNG void copyPixelsFromBuffer(Buffer src) 从一个Buffer缓冲区复制位图像素

Android 图形系统分析-surfaceFlinger流程

第一章Android GDI之基本原理及其总体 框架 Android GDI基本框架 在Android中所涉及的概念和代码最多,最繁杂的就是GDI相关的代码了。但是本质从抽象上来讲,这么多的代码和框架就干了一件事情:对显示缓冲区的操作和管理。 GDI主要管理图形图像的输出,从整体方向上来看,GDI可以被认为是一个物理屏幕使用的管理器。因为在实际的产品中,我们需要在物理屏幕上输出不同的窗口,而每个窗口认为自己独占屏幕的使用,对所有窗口输出,应用程序不会关心物理屏幕是否被别的窗口占用,而只是关心自己在本窗口的输出,至于输出是否能在屏幕上看见,则需要GDI来管理。 从最上层到最底层的数据流的分析可以看到实际上GDI在上层为GUI提供一个抽象的概念,就好像操作系统中的文件系统所提供文件,目录等抽象概念一样,GDI输出抽象成了文本,画笔,位图操作等设备无关的操作,让应用程序员只需要面对逻辑的设备上下文进行输出操作,而不要涉及到具体输出设备,以及输出边界的管理。GDI负责将文本、线条、位图等概念对象映射到具体的物理设备,所以GDI的在大体方向上可以分为以下几大要素:画布 字体 文本输出 绘画对象 位图输出 Android的GDI系统 Android的GDI系统所涉及到概念太多,加之使用了OpenGL使得Android的层次和代

码很繁杂。但是我们对于Android的GDI系统需要了解的方面不是他的静态的代码关系,而是动态的对象关系,在逻辑运行的架构上理解GDI。我们首先还是需要从代码结构开始我们的理解。 Frameworks/Libs/Surfaceflinger Frameworks/base/core/jni/android_view_Surface.cpp Frameworks/base/core/java/android/view/surface.java Frameworks/base/Graphics:绘图接口 Frameworks/Libs/Ui External/Skia 其中External/Skia是一个C++的2D图形引擎库,Android的2D绘制系统都是建立在该基础之上.Skia完成了:文本输出,位图,点,线,图像解码等功能。在这里给出Android GDI 的基本框架示意图。 对于上面的GDI架构图我们只是一个大概的了解,我们有太多的问题需要解决,有太多的疑问需要得到答案,我就一直在想,为什么设计者有提出如此众多的概念,这个概念的背景是什么?他要管理什么,他要抽象什么?从前面知道,Android的整个设计理念就是无边界化,他是如何穿透Linux进程这个鸿沟来达到无边界的?Surface,Canvas,Layer,LayerBase, NativeBuffer,SurfaceFlinger,SurfaceFlingerClient这些到底是一个什么东西?如

ANDROID实训心得体会

项目总结 时间过的好快,为期三个月的实训生活即将结束了,每一次的实训我们都受益匪浅,我 们学到的不仅仅是课内还有课外,实训让我们的课内知识得到了巩固,专业知识、编程水平 都有很大的提高,我们非常感谢这次实训。 刚开始二周的高强度的课程安排让我们受益匪浅;接下来的项目实训又让我们可以巩固 了课程。这让我觉得实习生活充实而有意义。 乐淘购物项目和android优化大师,我更好的学习了ui的设计,如何使界面漂亮,美观, 巩固了listview,gridview,的使用,学会了动画进入界面的,和会移动的画廊等等。在这 两个项目中,除了让我明白工作中需要能力,素质,知识之外,更重要的是学会了如何去完 成一个任务,懂得了享受工作。当遇到问题,冷静,想办法一点一点的排除障碍,到最后获 取成功,一种自信心由然而生,这就是工作的乐趣。有时候也需要虚心请教,从别人的身上 真得能学习到不自己没有的东西,每一次的挫折只能使我更接近成功。 音乐播放器项目,我们是七个人组成小组完成的,由组长带领我们,分配任务,每个人, 都发挥自己的长处,更好地去完成任务。对于团队开发来说,团结一致使我深有体会。团队 的合作注重沟通和信任,不能不屑于做小事,永远都要保持亲和诚信,把专业理论运用到具 体实践中,不仅加深我对理论的掌握和 运用,还让我拥有了一次又一次难忘的开发经历,这是也是实训最大的收获。 这次实训对于我以后学习、找工作也真是受益菲浅,在这3个月中让我初步从理性回到 感性的重新认识,也让我初步的认识这个社会,对于以后做人所应把握的方向也有所启发! 相信这些宝贵的经验会成为我今后成功的重要的基石。在此,我非常感谢指导老师和 同学对我的帮助。篇二:android实训报告 通信与电子信息专业实训报告 项目名称:基于android的游戏开发 班级 10通信1班 姓名 学号 指导教师 成绩 实训时间:年月日— 目录 一、实训目的及其意义 (3) 1.1、目的及意义 (3) 1.2、研究现状 (3) 二、实训主要任务、重点及难点 (4) 2.1、任务 (4) 2.2、重点内容及实现途径 (4) 三、实训具体内容及完成的主要工作 (5) 3.1、认识基础开发 (6) 3.2、了解数据存储 (6) 3.3、总体实训过程 (7) 四、实际遇到的困难,解决问题的方法和措施 (8) (一)、所遇问题 (8) (二)、解决方法与措施 (9) 五、心得体会 (9)

第四章 Android游戏开发之图形界面

第四章 Android游戏开发之图形界面 4.1 图片 图片是游戏的必备元素之一。 4.1.1 drawable对象 游戏所使用到的图片资源,我们都把它放置到res文件夹中的drawable中,当增加了drawable对象后,Android SDK会为该图片 资源在R清单文件中创建一个索引项,该索引的名字为 R.drawable.fileName。 生成了该资源的索引后,在XML资源文件中就可以通过@drawable/fileName来访问该图片资源,也可以在代码中 R.drawable.fileName来访问该drawable对象。而 R.drawable.fileName只是一个int类型的常量,它只是代表了 drawable对象的ID,程序代码当中需要获取到实际的drawable对象, 需要调用Resource的getDrawable(int id)方法来获取。 4.1.2 Bitmap Bitmap即位图,Bitmap类中欧那个提供了一些静态方法来创建新的Bitmap对象,如下是常用的方法。

对象,如:BitmapDrawable drawable = new BitmapDrawable(bitmap);获取BitmapDrawable所包装的Bitmap对象可以调用该类的getBitmap()方法,如Bitmap bitmap = drawable.getBitmap();。 BitmapFactory是一个Bitamap的工具类,它共提供了多种方法以便于从不同的数据源来解析和创建Bitmap对象,如下。

drawable目录中,而程序代码中通过该图片对应的资源ID来获取封装该图片的drawable对象即可。但手机系统的内存是有限的,如果不停的创建Bitmap对象,就会导致内存不够用的情况,所以Bitmap有各两个非常重要的方法来判断图片资源的是否回收和强制Bitmap进行回收。一下都是一些Bitmap常用到的方法。

Android图形系统及GPU加速分析

Android图形系统及GPU加速分析 ---西安交大智能交互与软件实验室 2013-5-7 一、Android图形系统简介 1.1Surface与SurfaceFlinger 对于现代的操作系统而言,流畅、精致的图形用户界面是构建优秀用户体验的重要手段。作为图形用户界面赖以存在的基础,图形系统已经成为操作系统的重要基础设施,特别对于移动设备而言,图形系统决定着该设备的整体体验与运行效率。 Android图形系统由两大组件构成:Surface和SurfaceFlinger。 Surface,又称绘图表面,代表应用程序需要显示在屏幕上的内容。Andorid系统中同时存在多个Surface,这些Surface可能会重叠、相互遮挡。 SurfaceFlinger负责Surface的叠加与合成,并把合成结果输出到屏幕上。同时,SurfaceFlinger为每一个Surface建立一个绘图缓冲区队列,用于存储Surface绘制的图像。 Android图形系统的总体结构如下: 图1Android图形系统总体结构 1.2Surface与SurfaceFlinger的交互过程 Surface与SurfaceFlinger的交互主要集中于当Surface需要更新的时候。交互过程如图2所示:

图2Surface与SurfaceFlinger的交互过程 首先,当Surface需要更新的时候,向SurfaceFlinger申请一块绘图缓冲区;之后,Surface 就在这块缓冲区上绘图;绘图完成后,Surface把缓冲区归还给SurfaceFlinger,并通知SurfaceFlinger重新合成各个Surface;SurfaceFlinger接收到合成请求后,合成并重绘需要重绘的Surface,并输出给显示设备,从而使屏幕上呈现最新的界面。 1.3图形系统的效率提升 作为Android系统的关键组件,图形系统的运行效率直接影响着用户体验,而且关乎系统的整体效率。Android系统采取如下措施提升图形系统的效率: 1.共享缓冲区 2.使用GPU加速图形绘制与叠加 下面,就分别分析Android图形系统对缓冲区的管理和对GPU的使用。 二、缓冲区管理 2.1Gralloc 为了便于使用,并隔离底层硬件的变化,向上提供统一的接口,Android在其HAL层为其图形系统提供了gralloc(即Graphic Alloc)模块,负责图像缓冲区的分配、映射和回收。它可以从Andorid匿名共享内存(以下简称AShm设备)和图形设备(Framebuffer设备,以下 简称fb设备)的存储区中分配缓冲区,并且可以把缓冲区映射到不同的进程中。

android绘图

android:绘图 View:组件,理解为画布 Drawable:所有可见对象的描述,理解为:素材类 Bitmap:图片类 Canvas:画笔 Paint:画笔样式与颜色、特效的集合 近期很多网友对Android用户界面的设计表示很感兴趣,对于Android UI开发自绘控件和游戏制作而言掌握好绘图基础是必不可少的。本次专题分10节来讲述,有关OpenGL ES相关的可能将放到以后再透露。本次主要涉及以下四个包的相关内容: android.content.res资源类 android.graphics底层图形类 android.view显示类 android.widget控件类 一、android.content.res.Resources 对于Android平台的资源类android.content.res.Resources可能很多网友比较陌生,一起来看看SDK上是怎么介绍的吧,Contains classes for accessing application resources,such as raw asset files,colors,drawables,media or other other files in the package,plus important device configuration details(orientation,input types,etc.)that affect how the application may behave.平时用到的二进制源文件raw、颜色colors、图形drawables和多媒体文件media的相关资源均通过该类来管理。 int getColor(int id)对应res/values/colors.xml Drawable getDrawable(int id)对应res/drawable/ XmlResourceParser getLayout(int id)对应res/layout/ String getString(int id)和CharSequence getText(int id)对应res/values/strings.xml InputStream openRawResource(int id)对应res/raw/ void parseBundleExtra(String tagName,AttributeSet attrs,Bundle outBundle)对应res/xml/ String[]getStringArray(int id)res/values/arrays.xml float getDimension(int id)res/values/dimens.xml 二、android.graphics.Bitmap 作为位图操作类,Bitmap提供了很多实用的方法,常用的我们总结如下: boolean compress(https://www.360docs.net/doc/479741640.html,pressFormat format,int quality,OutputStream stream)压缩一个Bitmap对象根据相关的编码、画质保存到一个OutputStream中。其中第一个压缩格式目前有JPG和PNG void copyPixelsFromBuffer(Buffer src)从一个Buffer缓冲区复制位图像素 void copyPixelsToBuffer(Buffer dst)将当前位图像素内容复制到一个Buffer缓冲区

Android实训报告

2016年 1 月 5 日

摘要: 本文首先介绍了Android开发环境的安装和部署过程;之后介绍了Android项目的架构及应用程序组成,着重讲解了手机用户界面的布局方法和常见开发控件的使用;然后介绍了Android中的文件存储管理、SQLite数据库存取与共享、2D绘图设计、多媒体应用以及电话和短信开发等知识;最后介绍了Android中的单元测试以及国际化的方法,通过发布案例程序完成Android知识的讲解,同时运用了photoshop,实现了对界面的优化设计。 关键词:Android;开发;SQL;多媒体运用;PHOTOSHOP

目录 一、实训背景及目的要求 (4) 1.1背景简介 (4) 1.2实训目的及要求 (4) 二、设计思路 (5) 2.1设计题目 (5) 2.2功能分析 (5) 2.3模块划分 (5) 三、设计实现及代码分析 (5) 3.1第一个Activity (5) 3.1.1布局文件:main.xml: (5) 3.1.2源代码文件:MainActivity.java (9) 3.2第二个Activity (12) 3.2.1布局文件:result.xml (12) 3.2.2源代码文件:ResultActivity.java (13) 3.3字符串资源文件:strings.xml (17) 3.4程序清单文件:AndroidManifest.xml (18) 四、程序功能测试及截图 (19) 4.1工程项目目录 (19) 4.2程序运行界面: (19) 4.3未填身高提示: (20) 4.4计算示例: (21) 五、课程设计(实训)总结 (21)

Android绘图机制(二)——自定义View绘制形, 圆形, 三角形, 扇形, 椭圆, 曲线,文字和图片的坐标讲解资料

Android绘图机制(二)——自定义View 绘制形, 圆形, 三角形, 扇形, 椭圆, 曲线,文字和图片的坐标讲解 我们要想画好一些炫酷的View,首先我们得知道怎么去画一些基础的图案,比如矩形,圆形,三角形,多边形等…. 新建一个项目 然后我们创建一个listview,每个图案一个Activity,这样看起来是不是很顺眼 编写ListView private ListView listview; //item上的数据源 private String[] name = {"矩形", "圆形", "三角形", "扇形", "椭圆", "曲线","文字和图片"}; //listview的adapter private ArrayAdapteradapter; private void initView() { //实例化listview listview = (ListView) findViewById(R.id.listview); //实例化数据源 adapter = new ArrayAdapter(this, https://www.360docs.net/doc/479741640.html,yout.simple_list_item_1, name); //listview设置adapter listview.setAdapter(adapter); //listview设置点击事件 listview.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView parent, View view, int position, long id) {

Android自定义View和Canvas绘图解析

Android自定义View和Canvas绘图解析 自定义view的流程分为measure、layout、draw三个主要步骤,今天我们通过源码来分下下measure的过程 我们从顶级view开始,顶级view即DecorView,view的事件都是先经过这个DecorView, 接下来我们来看看这个DecorView的MeasureSpec的创建过程:ViewRoot 对应ViewRootImpl类,是连接WindowManager 和DecorView的纽带,进入ViewRootImpl中,查看measureHierarchy方法,有如下代码: final DisplayMetrics packageMetrics = res.getDisplayMetrics(); res.getValue(com.android.internal.R.dimen.config_prefDialogWidth, mTmpValue, true); int baseSize = 0; if (mTmpValue.type == TypedValue.TYPE_DIMENSION) { baseSize = (int)mTmpValue.getDimension(packageMetrics); } if (DEBUG_DIALOG) Log.v(mTag, "Window " + mView + ": baseSize=" + baseSize + ", desiredWindowWidth=" + desiredWindowWidth); if (baseSize != 0 && desiredWindowWidth > baseSize) { childWidthMeasureSpec = getRootMeasureSpec(baseSize, lp.width); childHeightMeasureSpec = getRootMeasureSpec(desiredWindowHeight, lp.height); performMeasure(childWidthMeasureSpec, childHeightMeasureSpec); 这里只是截选一部分的源码,我们看到这个baseSize,其实就是屏幕的尺寸大小,获取宽的MeasureSpc的方法: childWidthMeasureSpec = getRootMeasureSpec(baseSize, lp.width); 这里传入的参数是屏幕尺寸以及DecorView自身的大小,接着我们来看getRootMeasureSpec方法: private static int getRootMeasureSpec(int windowSize, int rootDimension) { int measureSpec; switch (rootDimension) { case https://www.360docs.net/doc/479741640.html,youtParams.MATCH_PARENT: // Window can't resize. Force root view to be windowSize. measureSpec = MeasureSpec.makeMeasureSpec(windowSize, MeasureSpec.EXACTLY); break; case https://www.360docs.net/doc/479741640.html,youtParams.WRAP_CONTENT: // Window can resize. Set max size for root view. measureSpec = MeasureSpec.makeMeasureSpec(windowSize, MeasureSpec.AT_MOST); break; default: // Window wants to be an exact size. Force root view to be that size. measureSpec = MeasureSpec.makeMeasureSpec(rootDimension, MeasureSpec.EXACTLY); break;

android图形编写

android中的图形图像-访问图片drawable 一、如何获取res 中的资源 数据包package:android.content.res 主要类:Resources 其主要接口按照功能,划分为以下三部分: getXXXX() 例如: int getColor(int id) Drawable getDrawable(int id) String getString(int id) 直接获取res中存放的资源InputStream openRawResource(int id) 获取资源的数据流,读取资源数据 void parseBundleExtras(XmlResourceParser parser, Bundle outBundle) 从XML文件中获取数据 Resource为每种资源提供了相应的接口来获取这种资源,除了可以直接获取资源外,还额外提供了以数据流的方式获取资源,这在以后的应用程序开发中会经常使用,那么如何获取Resources了,如下:Resources r = this.getContext().getResources();

二、如何获取资源中的画图对象 数据包package:android.graphics.drawable 主要类:Drawable Drawable是个virtual class,具体如何画图,需要具体分析Drawable的子类,例如:BitmapDrawable 其主要接口如下: BitmapDrawable() BitmapDrawable(Bitmap bitmap) BitmapDrawable(String filepath) BitmapDrawable(InputStream is) void draw(Canvas canvas) final Bitmap getBitmap() final Paint getPaint() Drawable是个抽象类,在BitmapDrawable中我们就看到位图的具体操作,在仔细看下BitmapDrawable的构造函数,我们就会发现与Resource中的openRawResource()接口是相对应的,就可以通过以下方法来获取位图: Resources r = this.getContext().getResources(); Inputstream is = r.openRawResource(R.drawable.my_background_image);

Android绘制折线图

Android绘制折线图 1、使用Android 绘图工具库AChartEngine 2、绘制折线图的代码解析 关于AChartEngine AChartEngine是为android应用而设计的绘图工具库。目前该库的最新稳定版本是0.7,支持绘制以下类型的图表: ?line chart ?area chart ?scatter chart ?time chart ?bar chart ?pie chart ?bubble chart ?doughnut chart ?range (high-low) bar chart ?dial chart / gauge ?combined (any combination of line, cubic line, scatter, bar, range bar, bubble) chart ?cubic line chart 以上每种图表可以包含多个序列, 可以将X轴以水平或垂直的形式显示,也支持很多自定义的特性. 图表可以作为Viewl构建,也可以作为Intent构建——这样可以被用于启动一个活动(Activity) 关于折线图的绘制 折线图的效果:

代码解释: //每条曲线的名称 String[] titles = new String[]{"First","Second"}; List x = new ArrayList(); //点集的x坐标 List y = new ArrayList(); //点集的y坐标 x.add(new double[]{1,3,5,7,9,11}); x.add(new double[]{0,2,4,6,8,10}); y.add(new double[]{3,14,5,30,20,25}); y.add(new double[]{18,9,21,15,10,6}); 曲线的名称和坐标点都以定义 以下的解释参照上图 步骤一:折线图的坐标集 首先应该创建XYSeries对象:用于提供绘制的点集合的数据 XYSeries series = new XYSeries(titles[i]); // 根据每条线的名称创建 将所有的坐标加入这个集合 series.add(xV[k], yV[k]); XYMultipleSeriesDataset对象用于保存点集数据,包括每条曲线的X,Y坐标 // 用于数据的存放 XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset(); dataset.addSeries(series); 步骤二:折线图的样式集 定义每条曲线的颜色 int[] colors = new int[] {Color.BLUE,Color.GREEN}; 定义每条曲线的点的形状 PointStyle[] styles = new PointStyle[]{PointStyle.CIRCLE, PointStyle.DIAMOND}; 曲线图的格式,包括颜色,值的范围,点和线的形状等等都封装在XYSeriesRender对 象中,再将XYSeriesRender对象封装在XYMultipleSeriesRenderer对象中 XYSeriesRenderer r = new XYSeriesRenderer(); r.setColor(colors[i]); r.setPointStyle(styles[i]); r.setFillPoints(fill); XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer();

Android图形画布和图形绘制---Canvas and Drawables

Android框架API提供了一组2D描画API,使用这些API能够在一个画布(canvas)上渲染自己的定制图形,也能够修改那些既存的View对象,来定制它们的外观和视觉效果。在绘制2D图形时,通常要使用以下两种方法中的一种: 1.把图形或动画绘制到布局中的一个View对象中。在这种方式中,图形的绘制是由系统 通常的绘制View层次数据的过程来处理的---只需简单的定义要绘制到View对象内的图形即可。 2.把图形直接绘制在一个画布对象上(Canvas对象)。这种方法,要亲自调用相应类的 onDraw()方法(把图形传递给Canvas对象),或者调用Canvas对象的一个draw…()方法(如drawPicture())。在这个过程中,还可以控制任何动画。 当想要把不需要动态变化和没有游戏性能要求的一个简单的图形绘制到View对象时,方法一是最好的选择。例如,在想要在一个静态的应用程序中,显示一个静态图形或预定义动画时,就应该用方法1把图形绘制到一个View对象中。 当应用程序需要经常重新绘制自己的时候,使用方法2把图形绘制到Canvas中,是一个比较好的选择。像视频游戏这样的应用程序,就应该在它们自己的Canvas对象上绘制图形。但是,有更多的方法来完成绘制任务: 1.在与UI的Activity相同的线程中,创建布局中一个定制的View对象组件,就先要调用 invalidate()方法,然后处理onDraw()回调方法; 2.在一个独立的线程中,管理着SurfaceView对象,并且使用线程来执行把图形绘制到 Canvas对象上的任务(不需要请求invalidate()方法)。 用Canvas对象来绘制图形(Draw with a Canvas) 当要编写专业的绘图或控制图形动画的应用程序时,应该使用Canvas对象来尽心绘制操作。Canvas用一个虚拟的平面来工作,以便把图形绘制在实际的表面上---它持有所有的用draw 开头的方法调用。通过Canvas对象,实际上是执行一个底层的位图绘制处理,这个位图被放置到窗口中。 在onDraw()回调方法的绘制事件中,会提供一个Canvas对象,并且只需要把要绘制的内容交给Canvas对象就可以了。在处理SurfaceView对象时,还可以从SurfaceHolder.lockCanvas()方法来获取一个Canvas对象。但是,如果需要创建一个新的Canvas对象,那么就必须在实际执行绘制处理的Canvas对象上定义Bitmap对象。对于Canvas对象来说,这个Bitmap对象是始终必须的,应该像以下示例这样建立一个新的Canvas对象: Bitmap b =Bitmap.createBitmap(100,100,Bitmap.Config.ARGB_8888); Canvas c =new Canvas(b); 现在就可以在被定义的Bitmap对象上绘图了。在Canvas对象上绘制图形之后,能够用Canvas.drawBitmap(Bitmap, …)的一个方法,把该Bitmap对象绘制到另一个Canvas对象中。通过View.onDraw()方法或SufaceHolder.lockCanvas()方法提供的Canvas对象来完成最终的图形绘制处理是被推荐的。 Canvas类有可以使用的自己的一组绘图方法,如drawBitmap(…)、drawRect(…)、drawText(…)等。还可以使用其他的有draw()方法类。例如,可能想要把某些Drawable对象放到Canvas 对象上。Drawable类就有带有Canvas对象作为参数的draw()方法。 在View对象上绘图 如果应用程序不需要大量的图形处理或很高的帧速率(如一个棋类游戏、Snake游戏或另外的慢动画类应用程序),那么就应该考虑创建一个定制的View组件,并且用该组件的View.onDraw()方法的Canvas参数来进行图形绘制。这么做最大的方便是,Android框架会提供一个预定义的Canvas对象,该对象用来放置绘制图形的调用。

相关主题
相关文档
最新文档