`
enefry
  • 浏览: 36616 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

SurfaceView 笔记

阅读更多
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);
}
分享到:
评论

相关推荐

    MapTest仿景点通景区地图SurfaceView实现

    “新建文本文档.txt”可能是开发者留下的临时文档或笔记;“千万别双击.url”可能是一个快捷方式文件,提醒用户不要直接双击打开,防止误操作;最后的“MapTest”可能是一个包含项目源代码的文件夹或者打包的APK文件...

    android高级编程学习笔记

    ### Android高级编程学习笔记 #### 1. Android安全性 Android安全性是高级开发中非常重要的一环。安全性主要由底层的Linux内核提供,并且涉及到应用程序之间的数据隔离与通信控制。 ##### 1.1 Linux内核安全 每...

    Android SurfaceView画板操作

    本文实例为大家分享了Android SurfaceView画板操作的具体代码,供大家参考,具体内容如下 画板——画路径 package com.example.review.view; import android.content.Context; import android.graphics.Canvas; ...

    Android笔记

    这篇笔记主要涉及了几个关键的Android知识点,包括控件的旋转、SurfaceView的使用、按钮的显示与隐藏逻辑、ImageView的属性差异以及动画效果。下面将详细阐述这些概念。 1. 实现界面元素随手机旋转的控件: 在...

    springboot课堂笔记 (源码+数据库)090912

    拍照功能实现 首先需要调用 camera 函数,通过 SurfaceView 将 Camera 的实时画面显示 在屏幕上,然后通过点击拍照对当前画面进行捕捉,最后将获得的图片保存至 本地。在 Android 中,只有授权才能调用。 4 涂鸦、圈...

    Android学习笔记

    这份"Android学习笔记"涵盖了多个核心主题,旨在帮助开发者深入理解Android系统的工作原理以及如何在实际应用中运用这些知识。 首先,SurfaceView和View是Android UI系统中的两个关键组件。SurfaceView是用于处理高...

    notes:用于记笔记的 Android 应用

    笔记Android 笔记应用程序,仍处于开发初期。 支持文本注释、复选框、音频、照片和(很快)视频。 与 Froyo 和更高版本的设备兼容。 此应用中使用的 Android 功能: 活动碎片列表视图阵列适配器ViewPagers 对话框...

    Android 学习实例备份,添加收集的文档和笔记.

    这个名为“Android学习实例备份”的资源集合,显然提供了一系列的学习材料,包括文档和笔记,帮助开发者在探索Android世界时提升技能。其中,"Graphics"这个标签可能指的是与Android图形处理相关的知识,这涵盖了从...

    Android开发核心知识点笔记_安卓开发_

    13. **动画与图形**:学习如何使用帧动画、属性动画,以及自定义View和SurfaceView进行高性能图形绘制。 14. **通知和推送**:掌握如何创建和管理通知,以及如何集成Firebase Cloud Messaging (FCM) 实现远程推送。...

    android培训笔记(超详细)

    SurfaceView是View的子类,适合进行高性能的图形绘制,如视频播放、游戏等,因为它在单独的线程中拥有自己的Surface。而View主要用于UI展示和用户交互,不支持单独的渲染线程,可能会出现渲染延迟。 【edittext取消...

    android笔记宝典

    - **视频播放**:同样通过MediaPlayer类,结合SurfaceView或TextureView可以实现实时视频流的播放。 - **拍照功能**:利用Camera类和预览界面,可以实现拍照和录像功能。 #### 8. 应用发布与市场推广 - **打包与...

    安卓笔记拍照

    根据提供的信息,我们可以总结出以下有关“安卓笔记拍照”中涉及的关键知识点: ### 安卓摄像头操作基础 在安卓开发中,使用摄像头进行拍照是一项常用的功能。为了实现这一功能,开发者需要了解Android SDK中与...

    视频聊天悬浮窗口切换效果

    在IT行业中,视频聊天悬浮窗口切换效果是一种常见的用户体验设计,特别是在多任务处理和实时通信的应用中。这种技术允许用户在进行视频通话的同时,能够轻松地在不同的应用或窗口之间切换,而无需中断通话。...

    android图像处理系统1.0

    通过SurfaceView和GLSurfaceView,开发者可以在Android应用中集成OpenGL ES渲染。 五、硬件加速 为了提高图像处理性能,Android系统支持硬件加速。在启用硬件加速后,许多图像操作会由GPU执行,而不是CPU。开发者...

    Android开源个人空间含记事本,游戏,相册

    在这个项目中,记事本功能可能包含了创建新笔记、编辑现有笔记、删除不需要的笔记以及查询特定笔记的能力。这些功能的实现依赖于Android的数据存储机制,如SQLite数据库或SharedPreferences。SQLite是一个轻量级的...

    Android高级应用源码-android的手写功能.zip

    在Android平台上,手写功能是许多应用程序不可或缺的一部分,尤其在教育、绘画、笔记类应用中。这个名为"Android高级应用源码-android的手写功能.zip"的压缩包包含了一个名为"CancasDemo"的示例项目,它展示了如何在...

    BGACamera-Android:Android相机开发学习笔记,参考https

    2. 设置预览显示:使用`SurfaceView`或`TextureView`作为预览的显示窗口,通过`Camera.setPreviewDisplay(SurfaceHolder holder)`设置。 3. 开始预览:调用`Camera.startPreview()`方法启动相机预览。 4. 拍照:`...

    基于Android平台的 酷相机

    酷相机首先需要设置一个SurfaceView或TextureView作为相机预览的显示窗口。`Camera`类通过`setPreviewDisplay()`方法设置预览,而`Camera2` API则使用`Surface`对象和`SurfaceHolder`接口。捕获图片可以通过`Camera`...

    android手写上传

    在Android平台上,手写上传是一项常见的功能,尤其在教育、笔记、签名等应用场景中非常实用。这个资源包可能包含了一个实现这一功能的示例代码或库,方便开发者集成到自己的应用中。以下是对这一主题的详细说明: 1...

    Android EBook Reader Source Code

    - 翻页效果:通过动画实现平滑的翻页效果,可能利用SurfaceView或TextureView。 5. **性能优化**: - 资源缓存:为了提高加载速度,会缓存书籍元数据和部分内容。 - 后台加载:在阅读过程中,后台加载下一章内容...

Global site tag (gtag.js) - Google Analytics