`

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);//结束锁定画图,并提交改变。

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

相关推荐

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

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

    Android 下载视频文件并自动播放.rar

    Android 下载视频文件并自动播放,下载影片并播放,重新建构MediaPlayer对象,设定显示于SurfaceHolder,在线程运行中,调用自定义函数抓下文件,自定义setDataSource,由线程启动,若无法顺利取得扩展名,预设为....

    多点触控显示

    import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.Window; import android.widget.ImageView; public class MyMultitouchDemo extends Activity { private static final...

    android Camera自动拍照、自动对焦并获取指定大小图片

    1.首先android6.0以上版本要动态申请相机和文件读写权限 2.废话不啰嗦,上代码: /** * 摄像头画面采集界面 */ public class DistinguishActivity extends BaseActivity implements SurfaceHolder.Callback, ...

    android启动相机三种方式

    基于android 2.3.3 三种调用相机的方式 分别为使用android自带的照相功能 指定存储目录 使用SurfaceHolder预览相机的图片

    Android 实例实现自定义Camera和前后置摄像头切换以及图片缩小放大预览

    在具体实现代码之前,我们先来了解一下Android api对实现自定义Camera的介绍。 根据api的介绍,对于Camera应用可以简单总结以下几个步骤。 1.检查Camera是否存在,并在AndroidManifest.xml中赋予相关的权限; 2....

    Android代码-ScrollTextView

    Class ScrollTextView extends SurfaceView implements SurfaceHolder.Callback Android 滚动字幕,如新闻联播下面的,可以使用在广告机,机顶盒,电视App等信息发布系统。 以前是在信息发布系统上使用过,作为动态...

    Android二维码扫描

    import android.view.SurfaceHolder.Callback; import android.view.SurfaceView; import com.google.zxing.BarcodeFormat; import com.google.zxing.Result; import com.hsy.Zxing.Gan.camera.CameraManager; ...

    Android双SurfaceView底部拍照,顶部绘图

    Android双SurfaceView底部拍照,顶部绘图,当SurfaceHolder对象的类型设置为SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS时就只能拍照不能绘制了。为了既能通过SurfaceView拍照又能在上面绘制图形,可以通过双...

    Google Android SDK开发范例大全(PDF高清完整版1)(4-1)

    6.6 手机拨接状态——PhoneStateListener之onCallStateChanged 6.7 有来电,发送邮件通知——PhoneStateListener与ACTION_SEND 6.8 存储卡剩余多少容量——Environment加StatFs 6.9 访问本机内存与存储卡——File的...

    Google Android SDK开发范例大全(PDF完整版4)(4-4)

    6.6 手机拨接状态——PhoneStateListener之onCallStateChanged 6.7 有来电,发送邮件通知——PhoneStateListener与ACTION_SEND 6.8 存储卡剩余多少容量——Environment加StatFs 6.9 访问本机内存与存储卡——File的...

    android 快速翻书

    照比較正常的作法, 如果不是做Game之類的應該通常會新增thread處理工作後, 使用handler傳送msg去View#invalidate畫面, 或是在非UI thread呼叫View#postInvalidate. 所以如果需要比較高效的畫面更新就可以用看看...

    Android重力传感器源码

    import android.view.SurfaceHolder.Callback; /** *@author Himi *@Sensor 加速度传感器 ,也称为重力传感器 *@SDK 1.5(api 3)就支持传感器了 *@解释:此传感器不仅对玩家反转手机的动作可以检测到,而且会...

    项目经理Android笔记及试题

    项目经理Android笔记及网上收集的试题 使用Android系统进行拍照用到的类有:(D) A. SurfaceView B. SurfaceHolder C.Callback D. Camera

    android 调用系统摄像头和SurfaceView摄像头拍照

    MainActivity类是调用系统摄像头 MyCameroActivity类是通过surfaceholder的方式调用camera拍照的,只用拍照功能。适合初学者的。

    Google Android SDK开发范例大全(PDF高清完整版3)(4-3)

    6.6 手机拨接状态——PhoneStateListener之onCallStateChanged 6.7 有来电,发送邮件通知——PhoneStateListener与ACTION_SEND 6.8 存储卡剩余多少容量——Environment加StatFs 6.9 访问本机内存与存储卡——File的...

    test_surface_test_

    import android.view.SurfaceHolder;import android.view.SurfaceView;public class DecodeActivity extends Activity implements SurfaceHolder.Callback { // private static final String strVideo = // ...

    炫舞吧 android 游戏开发

    import android.view.SurfaceHolder.Callback; import android.widget.RadioButton; import android.widget.RadioGroup; import android.widget.Toast; import android.widget.RadioGroup.OnCheckedChangeListener; ...

    Android源码 中国象棋游戏完整版.rar

    Android源码 中国象棋游戏完整版,文件说明:  ChessMove 该类为棋子的一个走法,包含是什么棋子,起始点的位置,目标点的位置以及估值时所用到的score  ChessActivity游戏开始和菜单时的音乐  GameView整个程序...

    Google Android SDK开发范例大全的目录

    6.6 手机拨接状态——PhoneStateListener之onCallStateChanged 6.7 有来电,发送邮件通知——PhoneStateListener与ACTION_SEND 6.8 存储卡剩余多少容量——Environment加StatFs 6.9 访问本机内存与存储卡——File的...

Global site tag (gtag.js) - Google Analytics