链接地址: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. 解决:未能加载文件或程序集“Newtonsoft.Json, Version=4.5.0.0

    开发环境:Microsoft Visual Studio 2013 MVC4.0 使用SignalR的过程中随着版本的升级,其它程序集也跟着升级,如Newtonsoft.Json,一般编译的时候,如果 ...

  2. 关于httpservletrequest的获取真实的ip

    via 值为: 下面是一些DemoWTP/1.1 GDSZ-PS-GW010-WAP05.gd.chinamobile.com (Nokia WAP Gateway 4.0 CD3/ECD13_C/N ...

  3. mysql查询语句理解

    看一个查询语句 ,)) as passcount FROM (SELECT b.user,b.full_name,b.user_group From login_log a LEFT JOIN vic ...

  4. hdu--1800--字典树&&其他

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1800 根据题意可知:意思是有若干个飞行员,需要在扫帚上练习飞行,每个飞行员具有不同的等级,且等级高的飞 ...

  5. 开源点评:Protocol Buffers介绍

    今天来介绍一下“Protocol Buffers”(下面简称protobuf)这个玩意儿.本来俺在构思“生产者/消费者模式 ”系列的下一个帖子:关于生产者和消费者之间的传输数据格式.因为里面扯到了pr ...

  6. C# SQL文件执行器的功能实现

    好一段时间没写博客了,这次我们来一起谈谈SQL文件执行器的功能实现,在ERP软件升级时往往在客户端程序更新的同时也要对数据库进行升级,ERP程序开发人员会对数据库升级的执行代码在开发的过程中以SQL文 ...

  7. 一个可无限伸缩且无ABA问题的无锁队列

    关于无锁队列,详细的介绍请参考陈硕先生的<无锁队列的实现>一文.然进一步,如何实现一个不限node数目即能够无限伸缩的无锁队列,即是本文的要旨. 无锁队列有两种实现形式,分别是数组与链表. ...

  8. BootStrap 模态框禁用空白处点击关闭问题

    模态框为信息编辑窗口,涉及好多内容,填了半天,若一不小心点了空白处,那就前功尽弃了..... 所以我们很有必要禁用鼠标点击空白处模态框关闭的功能. $('#myModal').modal({backd ...

  9. 跟我一起学写jQuery插件开发方法(转载)

    jQuery如此流行,各式各样的jQuery插件也是满天飞.你有没有想过把自己的一些常用的JS功能也写成jQuery插件呢?如果你的答案是肯定的,那么来吧!和我一起学写jQuery插件吧!     很 ...

  10. (转)ios限制控制器旋转

    iOS屏幕旋转控制 iOS屏幕旋转控制(iOS6之后)       iOS6之前,子控制器只要覆盖父类的shouldAutorotateToInterfaceOrientation:方法就能单独控制某 ...