链接地址:http://www.cnblogs.com/lknlfy/archive/2012/02/25/2368069.html

一、概述

SurfaceView也是一个用来画图的部件,不过由于它的效率比较高,因此一般多用在游戏编程中,在摄像头编程中也会用到,还有它和View比较大的不同是它可以在非UI线程里画图。下面的实现中会提到使用SurfaceView来画图需要注意的几个地方。

 

二、要求

会使用SurfaceView来画图。

 

三、实现

新建工程MySurface,修改/res/layout/main.xml文件,在里面添加一个Button和一个SurfaceView,完整的main.xml文件如下:

 1 <?xml version="1.0" encoding="utf-8"?>
2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 android:layout_width="fill_parent"
4 android:layout_height="fill_parent"
5 android:orientation="vertical" >
6
7
8 <Button
9 android:id="@+id/button"
10 android:layout_width="fill_parent"
11 android:layout_height="wrap_content"
12 android:text="画线"
13 />
14
15 <SurfaceView
16 android:id="@+id/surface"
17 android:layout_width="fill_parent"
18 android:layout_height="fill_parent"
19 />
20
21 </LinearLayout>

修改MySurfaceActivity.java文件,主要实现Button的监听和SurfaceHolder.Callback的接口,完整的内容如下:

 1 package com.nan.surface;
2
3
4 import android.app.Activity;
5 import android.graphics.Canvas;
6 import android.graphics.Color;
7 import android.graphics.Paint;
8 import android.graphics.Rect;
9 import android.os.Bundle;
10 import android.view.SurfaceHolder;
11 import android.view.SurfaceView;
12 import android.view.View;
13 import android.widget.Button;
14
15
16 public class MySurfaceActivity extends Activity
17 {
18 private int OldX = 0;
19 private int OldY = 0;
20 private Button mButton = null;
21 private SurfaceView mSurfaceView = null;
22 private SurfaceHolder mSurfaceHolder = null;
23 private Paint mPaint = null;
24
25 @Override
26 public void onCreate(Bundle savedInstanceState)
27 {
28 super.onCreate(savedInstanceState);
29 setContentView(R.layout.main);
30
31 mButton = (Button)findViewById(R.id.button);
32 mSurfaceView = (SurfaceView)findViewById(R.id.surface);
33 mSurfaceHolder = mSurfaceView.getHolder();
34 mSurfaceHolder.addCallback(new MyHolder());
35
36 mPaint = new Paint();
37 //画笔的颜色
38 mPaint.setColor(Color.RED);
39 //画笔的粗细
40 mPaint.setStrokeWidth(10.0f);
41 //按钮监听
42 mButton.setOnClickListener(new View.OnClickListener()
43 {
44
45 public void onClick(View v)
46 {
47 // TODO Auto-generated method stub
48 //锁定整个SurfaceView
49 Canvas mCanvas = mSurfaceHolder.lockCanvas();
50 mCanvas.drawLine(OldX, OldY, OldX+10, OldY+10, mPaint);
51 //横坐标增加
52 OldX = OldX + 10;
53 //纵坐标增加
54 OldY = OldY + 10;
55 // 绘制完成,释放画布,提交修改
56 mSurfaceHolder.unlockCanvasAndPost(mCanvas);
57 //重新锁一次
58 //mSurfaceHolder.lockCanvas(new Rect(0, 0, 0, 0));
59 //mSurfaceHolder.unlockCanvasAndPost(mCanvas);
60 }
61 });
62 }
63
64 //定义一个类,实现Callback接口
65 public class MyHolder implements SurfaceHolder.Callback
66 {
67
68 public void surfaceChanged(SurfaceHolder holder, int format, int width,
69 int height)
70 {
71 // TODO Auto-generated method stub
72 //add your code
73 }
74
75 public void surfaceCreated(SurfaceHolder holder)
76 {
77 // TODO Auto-generated method stub
78 //add your code
79 }
80
81 public void surfaceDestroyed(SurfaceHolder holder)
82 {
83 // TODO Auto-generated method stub
84 //add your code
85 }
86
87 }
88
89 }

此时运行该程序,并点击几下“画线”按钮,效果如下所示:

可以看到,画出来的线是断断续续的,把上面程序的第58,59行的注释去掉,再运行一次,效果如下:

可以看到,线已经没有断开的现象了。

还有一点需要注意的是,如果希望程序在后台运行时还能画图且不报程序出错的问题,就要修改成以下这样的形式:

 1                 //锁定整个SurfaceView
2 Canvas mCanvas = mSurfaceHolder.lockCanvas();
3 try
4 {
5 if(mCanvas!=null)
6 {
7 mCanvas.drawLine(OldX, OldY, OldX+10, OldY+10, mPaint);
8 //横坐标增加
9 OldX = OldX + 10;
10 //纵坐标增加
11 OldY = OldY + 10;
12 //绘制完成,释放画布,提交修改
13 mSurfaceHolder.unlockCanvasAndPost(mCanvas);
14 }
15 }
16 catch(Exception e)
17 {
18 e.printStackTrace();
19 }
20 finally
21 {
22 if(mCanvas!=null)
23 {
24 //重新锁一次
25 mSurfaceHolder.lockCanvas(new Rect(0, 0, 0, 0));
26 mSurfaceHolder.unlockCanvasAndPost(mCanvas);
27 }
28 }

再运行,效果同第2幅图的一样。

Android应用开发基础篇(8)-----SurfaceView的更多相关文章

  1. Android应用开发基础篇(1)-----Button

    Android应用开发基础篇(1)-----Button   一.概述        Button,顾名思义就是按钮的意思,它主要的功能是响应用户按下按钮时的动作. 二.应用      新建一个工程, ...

  2. Android应用开发基础篇(3)-----ListView

    一.概述 ListView是一个列表显示控件,它的应用非常广泛,在很多应用程序中都可以看到它的身影,比如来电通,网易新闻等等,特别是QQ.因此非常有必要熟练掌握它. 二.要求 能够利用ListView ...

  3. Android应用开发基础篇(4)-----TabHost(选项卡)

    一.概述 TabHost是一种用来显示标签的组件,不清楚?看一下来电通这个应用就知道了.这个组件用起来与其他组件不太一样,它需要继承TabActivity这个类,还有它的布局文件与我们平时用的也有些不 ...

  4. Android应用开发基础篇(12)-----Socket通信

    链接地址:http://www.cnblogs.com/lknlfy/archive/2012/03/03/2378669.html 一.概述 网络通信无论在手机还是其他设备上都应用得非常广泛,因此掌 ...

  5. Android应用开发基础篇(12)-----Socket通信(转载)

    转自:http://www.devdiv.com/android_socket_-blog-258060-10594.html 一.概述 网络通信无论在手机还是其他设备上都应用得非常广泛,因此掌握网络 ...

  6. Android应用开发基础篇(14)-----自定义标题栏

    一.概述 每一个应用程序默认的标题栏(注意与状态栏的区别)只有一行文字(新建工程时的名字),而且颜色.大小等都是固定的,给人的感觉比较单调.但当程序需要美化的时候,那么修改标题栏是就是其中一项内容,虽 ...

  7. Android应用开发基础篇(16)-----ScaleGestureDetector(缩放手势检测)

    链接地址:http://www.cnblogs.com/lknlfy/archive/2012/03/11/2390274.html 一.概述 ScaleGestureDetector这个类是专门用来 ...

  8. Android应用开发基础篇(2)-----Notification(状态栏通知)

    一.概述      Notification这个部件的功能是在状态栏里显示消息提醒,比如有未读的短信或者是未接的电话,那么状态栏里都会有显示,更或者是从某个应用(比如QQ,酷我音乐等等)里按Home键 ...

  9. Android应用开发基础篇(15)-----URL(获取指定网址里的图片)

    链接地址:http://www.cnblogs.com/lknlfy/archive/2012/03/10/2389190.html 一.概述 URL,说白了就是一个网络地址(网址),通常一个网址里包 ...

随机推荐

  1. Qt中如何禁掉所有UI操作以及注意事项(处理各个widget的eventFilter这一层,但是感觉不好,为什么不使用QApplication呢)

    刚做完的一个项目,在测试时出现了一个问题:由于多线程的存在,当进行语音识别时:如果用户点击程序界面上的button或者其他接受点击事件后会发出信号的widget时,程序会crash ! 后来尝试着从多 ...

  2. rsyslog start with

    startswith Checks if the value is found exactly at the beginning of the property value. For example, ...

  3. Ignatius and the Princess III(母函数)

    Ignatius and the Princess III Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K ...

  4. C#DataTable DataSet DataRow区别详解

    DataSet 是C#中用来存储数据库数据的.其实,它的作用是在内存中模拟数据库.我们现实生活中的数据库从大到小的基本结构类似于:数据库实例,表,列,行.在C#语言中,我们在内存中也模拟出了一个这样的 ...

  5. 试用cmd markdown

    欢迎使用 Cmd Markdown 编辑阅读器 我们理解您需要更便捷更高效的工具记录思想,整理笔记.知识,并将其中承载的价值传播给他人,Cmd Markdown 是我们给出的答案 -- 我们为记录思想 ...

  6. hosts文件简析

    什么是hosts文件 hosts文件是个什么文件呢?Hosts虽然没有后缀名,其实是个纯文本文件,可以用记事本等文本编辑软件打开.Hosts文件主要用于在本地电脑强制解析域名,Hosts文件里包含映射 ...

  7. NOPI导出Excel 自定义列名

    NOPI 做Excel 导出确实很方便 ,但是一直在用没好好研究. 在网上没找到自定义Columns的方法 ,于是乎自己就在原来的方法上简单地改改. 想用的童鞋们可以直接拿去用! /// 数据大于65 ...

  8. 成功的背后!(给所有IT人)----转载:来自CSDN第一名博主

    转载:来自CSDN第一名博主:http://blog.csdn.net/phphot/article/details/2187505 放在这里激励你我! 正文: 成功的背后,有着许多不为人知的故事,而 ...

  9. 用css控制一个DIV画图标。

    在实际开发中,我们会用到一些小图形,图标.大多数情况下都是用图片来实现的,同时对图片进行处理使图片大小尽可能的缩小.但是图片在怎么处理也是按KB来算的.但是要是用CSS画,只要用很少的空间就能完成同样 ...

  10. IIS发布网站:CS0016: 未能写入输出文件的解决方法

    “/”应用程序中的服务器错误.-------------------------------------------------------------------------------- 编译错误 ...