`

Android之SurfaceHolder

 
阅读更多
SurfaceHolder,可以把它当成surface的控制器,用来操纵surface。处理它的Canvas上画的效果和动画,控制表面,大小,像素等。
几个需要注意的方法:
(1)、abstract void addCallback(SurfaceHolder.Callback callback);
// 给SurfaceView当前的持有者一个回调对象。
(2)、abstract Canvas lockCanvas();
// 锁定画布,一般在锁定后就可以通过其返回的画布对象Canvas,在其上面画图等操作了。
(3)、abstract Canvas lockCanvas(Rect dirty);
// 锁定画布的某个区域进行画图等..因为画完图后,会调用下面的unlockCanvasAndPost来改变显示内容。
// 相对部分内存要求比较高的游戏来说,可以不用重画dirty外的其它区域的像素,可以提高速度。
(4)、abstract void unlockCanvasAndPost(Canvas canvas);
// 结束锁定画图,并提交改变。

package xl.test;

import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class ViewTest extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new MyView(this));
    }
    //视图内部类
    class MyView extends SurfaceView implements SurfaceHolder.Callback
    {
        private SurfaceHolder holder;
        private MyThread myThread; 
        public MyView(Context context) {
            super(context);
            // TODO Auto-generated constructor stub
            holder = this.getHolder();
            holder.addCallback(this);
            myThread = new MyThread(holder);//创建一个绘图线程
        }

        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width,
                int height) {
            // TODO Auto-generated method stub
            
        }

        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            // TODO Auto-generated method stub
            myThread.isRun = true;
            myThread.start();
        }

        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            // TODO Auto-generated method stub
            myThread.isRun = false;
        }
        
    }
    //线程内部类
    class MyThread extends Thread
    {
        private SurfaceHolder holder;
        public boolean isRun ;
        public  MyThread(SurfaceHolder holder)
        {
            this.holder =holder; 
            isRun = true;
        }
        @Override
        public void run()
        {
            int count = 0;
            while(isRun)
            {
                Canvas c = null;
                try
                {
                    synchronized (holder)
                    {
                        c = holder.lockCanvas();//锁定画布,一般在锁定后就可以通过其返回的画布对象Canvas,在其上面画图等操作了。
                        c.drawColor(Color.BLACK);//设置画布背景颜色
                        Paint p = new Paint(); //创建画笔
                        p.setColor(Color.WHITE);
                        Rect r = new Rect(100, 50, 300, 250);
                        c.drawRect(r, p);
                        c.drawText("这是第"+(count++)+"秒", 100, 310, p);
                        Thread.sleep(1000);//睡眠时间为1秒
                    }
                }
                catch (Exception e) {
                    // TODO: handle exception
                    e.printStackTrace();
                }
                finally
                {
                    if(c!= null)
                    {
                        holder.unlockCanvasAndPost(c);//结束锁定画图,并提交改变。

                    }
                }
            }
        }
    }
}
分享到:
评论

相关推荐

    AndroidApp中使用SurfaceView制作多线程动画的实例讲解.docx

    ### Android App中使用SurfaceView制作多线程动画的实例讲解 #### SurfaceView的定义与应用场景 在Android开发中,为了确保应用的流畅性和响应性,通常需要将耗时操作(如网络请求)放在非UI线程中进行。然而,...

    tiaoxingma.zip_SurfaceHolder_条形码

    在Android开发中,"SurfaceHolder"是一个非常关键的接口,用于与SurfaceView进行交互,而SurfaceView则是一种特殊的视图,适用于处理高性能的图形绘制,比如视频播放、游戏画面或者像这里的条形码生成。"条形码"是...

    android之surfaceview学习示例

    在这个"android之surfaceview学习示例"中,我们将深入探讨SurfaceView的核心特性和使用方法。 首先,SurfaceView拥有自己的Surface对象,它位于窗口的最底层,直接与硬件交互,允许在主线程之外进行绘制操作,避免...

    Android之实现二维码扫描包.zip

    然后,设置SurfaceHolder的回调,以便初始化Camera。最后,监听Button点击事件,启动和停止扫描: ```java public class ScanActivity extends AppCompatActivity { private CaptureActivityHandler handler; ...

    Android开发摄像头SurfaceView预览 背景画图(矩形和圆形) 实现(双surfaceview,顶层画矩形框,底层预览视频)

    Android开发摄像头SurfaceView预览 背景画图(矩形和圆形) 实现(双surfaceview,顶层画矩形框,底层预览视频); UI:三个按钮 预览 摄像 图片保存,预览界面 可以显示(矩形和圆形等图画)

    Android音视频开发学习思路.pdf

    ### Android音视频开发学习思路详解 #### 一、引言 随着移动互联网的发展,音视频技术在Android平台上的应用越来越广泛。无论是视频通话、在线教育还是直播应用,音视频技术都是核心之一。对于想要深入研究Android...

    Android 通过SurfaceView 实现实时显示摄像头视频

    在Android开发中,实时显示摄像头视频是一个常见的需求,如创建相机应用、视频聊天软件等。本文将详细讨论如何使用SurfaceView来实现这一功能。SurfaceView是Android系统提供的一种用于高效显示动态图像的视图组件,...

    Android后台开启服务默默拍照

    Android Service是Android四大组件之一,它允许应用在没有用户交互的情况下运行,这对于需要长时间运行的任务非常有用。在这个场景中,我们讨论的是如何在后台启动一个服务来执行拍照操作。 首先,我们需要创建一个...

    Android 使用MediaPlayer播放视频

    在Android平台上,开发人员经常需要实现视频播放功能。`MediaPlayer`是Android SDK提供的一种核心组件,专门用于播放音频和视频文件。在这个场景中,我们将详细探讨如何使用`MediaPlayer`来播放视频,同时结合`...

    Android实现后台连续静默拍照

    创建一个SurfaceTexture,然后在SurfaceHolder中设置它,用于接收相机的预览流。这一步不是必须的,因为静默拍照通常不需要显示预览,但为了确保正确捕获图像,预览流的配置仍然是必要的。 三、静默拍照 要实现静默...

    android通过camera和surfaceview选择摄像头并即时预览

    在Android平台上,开发一款应用程序来实现通过Camera与SurfaceView选择摄像头并进行即时预览涉及到多个关键知识点。以下是对这些技术的详细解释: 1. **Camera API**:Android提供了Camera类,用于与设备上的摄像头...

    Android之改进版贪吃蛇

    7. **多线程**:为了保证游戏的流畅运行,游戏逻辑通常在独立的线程(如SurfaceHolder.Callback的SurfaceCreated方法启动的线程)中执行,以防止UI线程被阻塞。 8. **用户界面**:使用XML布局文件创建游戏界面,...

    android之camera用法实例详解

    在Android平台上,Camera API是开发者用来实现相机功能的关键接口,它允许应用进行拍照、录制视频以及其他与摄像头相关的操作。在本文中,我们将深入探讨如何在Android应用中使用Camera API,并通过实例来解决一些...

    基于Android4.4以上,Android8.0一下平台静默拍照

    在Android平台上实现静默拍照是一项常见的需求,尤其是在自动化测试、安全监控或者隐私保护等场景下。这个主题主要针对的是Android 4.4 (KitKat)及以上版本,但不包括Android 8.0 (Oreo)以下的操作系统。下面将详细...

    Android 调用外接摄像头

    在Android平台上,调用外接摄像头是一项常见的功能,尤其对于那些需要进行图像处理或多媒体应用的开发者来说至关重要。本文将详细讲解如何在Android应用中实现这一功能,包括拍照、录像以及调整摄像头方向。 首先,...

    android开发摄像头实现前置后置切换

    在Android平台上进行应用程序开发时,摄像头的使用是一个常见的需求,特别是在构建相机相关的应用时。本教程将详细讲解如何实现一个Android小程序,以实现在运行时切换前后摄像头的功能。这一过程涉及到了Android...

    android-Camera-Code.zip_android 相机_android 相机_camera_camera and

    在`onCreate()`方法中,我们通常会创建并设置这些视图,并在`SurfaceHolder.Callback`回调中启动相机预览。 ### 控制相机参数 `Camera`类的`Parameters`对象提供了设置相机参数的方法,例如调整焦距、白平衡、曝光...

    Android应用源码之Android使用SurfaceView实现墨迹天气的风车效果.zip

    本压缩包“Android应用源码之Android使用SurfaceView实现墨迹天气的风车效果.zip”显然是一个示例项目,展示了如何利用SurfaceView来实现类似墨迹天气应用中的风车动画效果。 SurfaceView的工作原理: 1. ...

    android自定义背景动态背景

    在Android开发中,创建自定义背景,特别是动态背景,是一个有趣且挑战性的任务。动态壁纸不仅为用户提供了个性化手机的机会,还可以通过动画效果提升用户体验。本项目“android自定义背景动态背景”提供了一种实现这...

Global site tag (gtag.js) - Google Analytics