SurfaceView 是一个继承了View但是由于一般的View有这很大区别的类.
这是由于 SurfaceView 的绘制方法和原来的View不同.在 View 中系统不允许主线程外的线程控制 UI .但是 SurfaceView 却可以 .下面是我总结的几个要点:
1. 首先需要实现 View 的构造方法.( 如果 需要在XML 文件中布局需要实现public S(Context context, AttributeSet attrs) 这个构造方法 )
2. 由于需要对SurfaceView 进行监控所以需要实现 SurfaceHolder.Callback 这个接口( 可以用内部类或者方法实现.) 这个接口需要实现三个方法:
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {} //大小改变的时候被调用到.
public void surfaceCreated(SurfaceHolder holder) {} // 创建的时候被调用到
public void surfaceDestroyed(SurfaceHolder holder) {} //销毁的时候被调用
3.在SurfaceView 中屏幕接触处理和 布局处理和View一样.
4. 使用绘制的时候和 View 完全不一样.他是使用 SufaceHodler 的方法
public canvas holder.lockCanvas();
public void unlockCanvasAndPost(canvas);
第一个方法可以调用出一个Canvas 画布.在上面绘制所需的画面.然后调用第二个方法.这样就可以在屏幕上面绘制出来的.
View中的 invalidate()方法需要在主线程中调用(postInvalidate()不同).但是 SurfaceView不需要.SurfaceView绘制效率比View高.
5.SurfaceView中如果需要请求重新布局同样使用 requestLayout();
6. 和View一样重要的一些方法:
onMeasure(int ,int); 是使用 View 前需要调用的方法. 通知View进行自身尺寸测量.如果自己重写的话测量完自身大小注意需要调用setMeasuredDimension(int, int);这个方法设置控件大小.
onLayout(boolean,int,int,int,int); 这个方法使父控件具体分配给当前View的具体位置的方法.
下面是一个小例子 :
main.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
android:focusable = "true"
/>
<com.en.demo.SVD
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>
SurfaceView 子类 SVD:
import android.content.Context;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
public class SVD extends SurfaceView implements SurfaceHolder.Callback, Runnable{
SurfaceHolder holder;
public SVD(Context context, AttributeSet attrs) {
super(context, attrs);
System.out.println("init()");
holder = getHolder();
holder.addCallback(this);
}
public void draw(){
System.out.println(" draw()");
Canvas canvas = holder.lockCanvas();
draw(canvas);
holder.unlockCanvasAndPost(canvas);
}
@Override
public void draw(Canvas canvas) {
canvas.drawColor(0xff7f7f7f + (run << 3));
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.setMeasuredDimension(130, 100);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
System.out.println("width:"+width+" height:"+height);
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
System.out.println(" create ");
new Thread(this).start();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
this.holder = null;
}
int run = 10;
@Override
public void run() {
// TODO Auto-generated method stub
try{
while( run-- > 0){
draw();
Thread.sleep(1000);
}
}catch(Exception e){
e.printStackTrace();
}
}
}
Activity 中 的onCreate(Bundle)
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
分享到:
相关推荐
“新建文本文档.txt”可能是开发者留下的临时文档或笔记;“千万别双击.url”可能是一个快捷方式文件,提醒用户不要直接双击打开,防止误操作;最后的“MapTest”可能是一个包含项目源代码的文件夹或者打包的APK文件...
### Android高级编程学习笔记 #### 1. Android安全性 Android安全性是高级开发中非常重要的一环。安全性主要由底层的Linux内核提供,并且涉及到应用程序之间的数据隔离与通信控制。 ##### 1.1 Linux内核安全 每...
本文实例为大家分享了Android SurfaceView画板操作的具体代码,供大家参考,具体内容如下 画板——画路径 package com.example.review.view; import android.content.Context; import android.graphics.Canvas; ...
这篇笔记主要涉及了几个关键的Android知识点,包括控件的旋转、SurfaceView的使用、按钮的显示与隐藏逻辑、ImageView的属性差异以及动画效果。下面将详细阐述这些概念。 1. 实现界面元素随手机旋转的控件: 在...
拍照功能实现 首先需要调用 camera 函数,通过 SurfaceView 将 Camera 的实时画面显示 在屏幕上,然后通过点击拍照对当前画面进行捕捉,最后将获得的图片保存至 本地。在 Android 中,只有授权才能调用。 4 涂鸦、圈...
这份"Android学习笔记"涵盖了多个核心主题,旨在帮助开发者深入理解Android系统的工作原理以及如何在实际应用中运用这些知识。 首先,SurfaceView和View是Android UI系统中的两个关键组件。SurfaceView是用于处理高...
笔记Android 笔记应用程序,仍处于开发初期。 支持文本注释、复选框、音频、照片和(很快)视频。 与 Froyo 和更高版本的设备兼容。 此应用中使用的 Android 功能: 活动碎片列表视图阵列适配器ViewPagers 对话框...
这个名为“Android学习实例备份”的资源集合,显然提供了一系列的学习材料,包括文档和笔记,帮助开发者在探索Android世界时提升技能。其中,"Graphics"这个标签可能指的是与Android图形处理相关的知识,这涵盖了从...
13. **动画与图形**:学习如何使用帧动画、属性动画,以及自定义View和SurfaceView进行高性能图形绘制。 14. **通知和推送**:掌握如何创建和管理通知,以及如何集成Firebase Cloud Messaging (FCM) 实现远程推送。...
SurfaceView是View的子类,适合进行高性能的图形绘制,如视频播放、游戏等,因为它在单独的线程中拥有自己的Surface。而View主要用于UI展示和用户交互,不支持单独的渲染线程,可能会出现渲染延迟。 【edittext取消...
- **视频播放**:同样通过MediaPlayer类,结合SurfaceView或TextureView可以实现实时视频流的播放。 - **拍照功能**:利用Camera类和预览界面,可以实现拍照和录像功能。 #### 8. 应用发布与市场推广 - **打包与...
根据提供的信息,我们可以总结出以下有关“安卓笔记拍照”中涉及的关键知识点: ### 安卓摄像头操作基础 在安卓开发中,使用摄像头进行拍照是一项常用的功能。为了实现这一功能,开发者需要了解Android SDK中与...
在IT行业中,视频聊天悬浮窗口切换效果是一种常见的用户体验设计,特别是在多任务处理和实时通信的应用中。这种技术允许用户在进行视频通话的同时,能够轻松地在不同的应用或窗口之间切换,而无需中断通话。...
通过SurfaceView和GLSurfaceView,开发者可以在Android应用中集成OpenGL ES渲染。 五、硬件加速 为了提高图像处理性能,Android系统支持硬件加速。在启用硬件加速后,许多图像操作会由GPU执行,而不是CPU。开发者...
在这个项目中,记事本功能可能包含了创建新笔记、编辑现有笔记、删除不需要的笔记以及查询特定笔记的能力。这些功能的实现依赖于Android的数据存储机制,如SQLite数据库或SharedPreferences。SQLite是一个轻量级的...
在Android平台上,手写功能是许多应用程序不可或缺的一部分,尤其在教育、绘画、笔记类应用中。这个名为"Android高级应用源码-android的手写功能.zip"的压缩包包含了一个名为"CancasDemo"的示例项目,它展示了如何在...
2. 设置预览显示:使用`SurfaceView`或`TextureView`作为预览的显示窗口,通过`Camera.setPreviewDisplay(SurfaceHolder holder)`设置。 3. 开始预览:调用`Camera.startPreview()`方法启动相机预览。 4. 拍照:`...
酷相机首先需要设置一个SurfaceView或TextureView作为相机预览的显示窗口。`Camera`类通过`setPreviewDisplay()`方法设置预览,而`Camera2` API则使用`Surface`对象和`SurfaceHolder`接口。捕获图片可以通过`Camera`...
在Android平台上,手写上传是一项常见的功能,尤其在教育、笔记、签名等应用场景中非常实用。这个资源包可能包含了一个实现这一功能的示例代码或库,方便开发者集成到自己的应用中。以下是对这一主题的详细说明: 1...
- 翻页效果:通过动画实现平滑的翻页效果,可能利用SurfaceView或TextureView。 5. **性能优化**: - 资源缓存:为了提高加载速度,会缓存书籍元数据和部分内容。 - 后台加载:在阅读过程中,后台加载下一章内容...