
Android视图组件View与SurfaceView使用实例详解

Android开发中,View和SurfaceView是两种常用的视图组件,它们用于在应用中显示和绘制图形界面。View是所有视图控件的基类,用于简单的绘制操作;SurfaceView则提供了更底层的绘图能力,适合需要频繁更新画面的场景,如视频播放和游戏。接下来将详细探讨这两个组件的用法以及它们的应用示例。
### View组件用法
View是Android平台中所有UI组件的基类,任何在屏幕上显示的内容都是View或者它的子类。View提供了一系列方法来处理绘制、触摸事件、焦点管理等。
#### 常用方法:
- `onDraw(Canvas canvas)`: 自定义View时需要重写这个方法来完成绘制工作。
- `onMeasure(int widthMeasureSpec, int heightMeasureSpec)`: 用于确定View的尺寸。
- `onLayout(boolean changed, int left, int top, int right, int bottom)`: 在布局过程完成后会调用,定义子View的位置。
- `onTouchEvent(MotionEvent event)`: 处理触摸事件,返回值表示事件是否被处理。
#### 自定义View示例:
创建一个自定义的View,继承View类并重写onDraw方法。
```java
public class CustomView extends View {
public CustomView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 在这里执行绘制操作
Paint paint = new Paint();
paint.setColor(Color.BLACK);
canvas.drawRect(100, 100, 300, 300, paint);
}
}
```
#### 在布局文件中使用:
```xml
<com.example.app.CustomView
android:layout_width="match_parent"
android:layout_height="match_parent"/>
```
### SurfaceView组件用法
SurfaceView与普通View不同,它有自己的Surface,意味着它在另一个单独的缓冲区进行绘制,这对于复杂绘图和视频播放尤其有用。
#### 常用方法:
- `getHolder()`: 获取SurfaceHolder对象,用于操作Surface。
- `SurfaceHolder.Callback`: 必须实现此接口来监听Surface的创建、销毁和改变。
- `SurfaceView_LOCKHardwareCanvas()`: 锁定硬件画布,以提高绘制效率。
- `unlockCanvasAndPost(Canvas canvas)`: 解锁画布并发布新的帧。
#### 自定义SurfaceView示例:
创建一个自定义的SurfaceView,继承SurfaceView类并实现SurfaceHolder.Callback接口。
```java
public class CustomSurfaceView extends SurfaceView implements SurfaceHolder.Callback {
public CustomSurfaceView(Context context, AttributeSet attrs) {
super(context, attrs);
getHolder().addCallback(this);
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
// Surface创建后可以开始绘制
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
// Surface尺寸改变时的回调
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// Surface销毁时的回调
}
// 在一个单独的线程中绘制
private Thread drawThread;
private void startDrawThread() {
drawThread = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
Canvas canvas = null;
try {
canvas = getHolder().lockCanvas(null);
synchronized (getHolder()) {
// 在这里进行绘制
Paint paint = new Paint();
paint.setColor(Color.BLUE);
canvas.drawRect(0, 0, getWidth(), getHeight(), paint);
}
} finally {
if (canvas != null) {
getHolder().unlockCanvasAndPost(canvas);
}
}
}
}
});
drawThread.start();
}
}
```
#### 在布局文件中使用:
```xml
<com.example.app.CustomSurfaceView
android:layout_width="match_parent"
android:layout_height="match_parent"/>
```
### 总结
在Android开发中,View和SurfaceView各有其使用场景。普通View适用于简单的图形绘制和交互,而SurfaceView适用于复杂图形的渲染和视频播放等需要高性能图形处理的场景。在实际开发中,需要根据具体需求来选择合适的组件。例如,对于一个游戏应用可能更适合使用SurfaceView,因为它能够提供更高的帧率和更流畅的体验。而对于一个简单的静态页面,则使用View即可满足需求。
关于文件压缩包,`example_surfaceview.zip` 和 `example_surfaceview2.zip` 中可能包含了SurfaceView使用示例的源代码和资源文件,而`example_view.zip`可能包含了View使用示例的源代码和资源文件。开发者可以直接下载这些示例文件,以更具体地学习View和SurfaceView的实际应用。
相关推荐








阳光岛主
- 粉丝: 1w+
最新资源
- 清华大学C++教程深度解析,完整讲稿与试卷曝光
- C程序设计谭浩强课后答案完整版
- 解读电流互感器国家标准GB1208-1997要点
- 掌握XML:两本基础教程带你从入门到精通
- 深入了解VC++编程:从Windows发展到程序设计实践
- C# 2005数据库项目开发:邮件发送管理模块实践
- Java初学者必备课件 - 前三章免费分享
- 探索MASM汇编语言调试工具的使用与安装
- 泡泡龙手机游戏开发教程
- Visual C# 2005数据库项目案例:图书销售管理系统导行
- 全面解析软件开发相关文档的重要性与流程
- MTK核心Perl脚本功能与应用介绍
- 计算机专业面试推理题解析
- 掌握SQL:深入浅出的串讲资料
- Java经典烟花效果实现教程与源码分享
- 最新Asp.Net自定义对话框源码及Demo体验
- 张孝祥IT课堂:深入解析JavaScript教学源代码
- FYD12864显示屏I2C驱动程序的实现与调试
- 全栈式Flex、BlazeDS与Spring集成方案深度解析
- XML编程全面进阶:从基础知识到精通技巧
- 深入探讨COM/Dcom技术内幕与例程
- 在Eclipse中运行C/C++程序的Mingw插件使用指南
- 探索Google搜索模式与脚本封装技巧
- VB课程设计使用SQL Server 2000实现