智汇工业-智慧工业、智能制造及工业智能、工业互联门户网站,专业的工业“互联网+”传媒

Android應(yīng)用之SurfaceView的雙緩沖使用

來(lái)源:網(wǎng)絡(luò)

點(diǎn)擊:2267

A+ A-

所屬頻道:新聞中心

關(guān)鍵詞: Android,SurfaceView,雙緩沖

        這次介紹SurfaceView的雙緩沖使用。雙緩沖是為了防止動(dòng)畫閃爍而實(shí)現(xiàn)的一種多線程應(yīng)用,基于SurfaceView的雙緩沖實(shí)現(xiàn)很簡(jiǎn)單,開一條線程并在其中繪圖即可。本文介紹基于SurfaceView的雙緩沖實(shí)現(xiàn),以及介紹類似的更高效的實(shí)現(xiàn)方法。

        本文程序運(yùn)行截圖如下,左邊是開單個(gè)線程讀取并繪圖,右邊是開兩個(gè)線程,一個(gè)專門讀取圖片,一個(gè)專門繪圖:

     

        對(duì)比一下,右邊動(dòng)畫的幀速明顯比左邊的快,左右兩者都沒使用Thread.sleep()。為什么要開兩個(gè)線程一個(gè)讀一個(gè)畫,而不去開兩個(gè)線程像左邊那樣都“邊讀邊畫”呢?因?yàn)镾urfaceView每次繪圖都會(huì)鎖定Canvas,也就是說(shuō)同一片區(qū)域這次沒畫完下次就不能畫,因此要提高雙緩沖的效率,就得開一條線程專門畫圖,開另外一條線程做預(yù)處理的工作。

    main.xml的源碼:

    view plaincopy to clipboardprint?
    <?xml version="1.0" encoding="utf-8"?> 
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
        android:layout_width="fill_parent" android:layout_height="fill_parent" 
        android:orientation="vertical"> 
     
        <LinearLayout android:id="@+id/LinearLayout01" 
            android:layout_width="wrap_content" android:layout_height="wrap_content"> 
            <Button android:id="@+id/Button01" android:layout_width="wrap_content" 
                android:layout_height="wrap_content" android:text="單個(gè)獨(dú)立線程"></Button> 
            <Button android:id="@+id/Button02" android:layout_width="wrap_content" 
                android:layout_height="wrap_content" android:text="兩個(gè)獨(dú)立線程"></Button> 
        </LinearLayout> 
        <SurfaceView android:id="@+id/SurfaceView01" 
            android:layout_width="fill_parent" android:layout_height="fill_parent"></SurfaceView> 
    </LinearLayout> 
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="fill_parent" android:layout_height="fill_parent"
     android:orientation="vertical">

     <LinearLayout android:id="@+id/LinearLayout01"
      android:layout_width="wrap_content" android:layout_height="wrap_content">
      <Button android:id="@+id/Button01" android:layout_width="wrap_content"
       android:layout_height="wrap_content" android:text="單個(gè)獨(dú)立線程"></Button>
      <Button android:id="@+id/Button02" android:layout_width="wrap_content"
       android:layout_height="wrap_content" android:text="兩個(gè)獨(dú)立線程"></Button>
     </LinearLayout>
     <SurfaceView android:id="@+id/SurfaceView01"
      android:layout_width="fill_parent" android:layout_height="fill_parent"></SurfaceView>
    </LinearLayout>
     

    本文程序的源碼:

     view plaincopy to clipboardprint?
    package com.testSurfaceView;  
     
    import java.lang.reflect.Field;  
    import java.util.ArrayList;  
    import android.app.Activity;  
    import android.graphics.Bitmap;  
    import android.graphics.BitmapFactory;  
    import android.graphics.Canvas;  
    import android.graphics.Paint;  
    import android.graphics.Rect;  
    import android.os.Bundle;  
    import android.util.Log;  
    import android.view.SurfaceHolder;  
    import android.view.SurfaceView;  
    import android.view.View;  
    import android.widget.Button;  
     
    public class testSurfaceView extends Activity {  
        /** Called when the activity is first created. */ 
        Button btnSingleThread, btnDoubleThread;  
        SurfaceView sfv;  
        SurfaceHolder sfh;  
        ArrayList<Integer> imgList = new ArrayList<Integer>();  
        int imgWidth, imgHeight;  
        Bitmap bitmap;//獨(dú)立線程讀取,獨(dú)立線程繪圖  
     
        @Override 
        public void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);  
            setContentView(R.layout.main);  
     
            btnSingleThread = (Button) this.findViewById(R.id.Button01);  
            btnDoubleThread = (Button) this.findViewById(R.id.Button02);  
            btnSingleThread.setOnClickListener(new ClickEvent());  
            btnDoubleThread.setOnClickListener(new ClickEvent());  
            sfv = (SurfaceView) this.findViewById(R.id.SurfaceView01);  
            sfh = sfv.getHolder();  
            sfh.addCallback(new MyCallBack());// 自動(dòng)運(yùn)行surfaceCreated以及surfaceChanged  
        }  
     
        class ClickEvent implements View.OnClickListener {  
     
            @Override 
            public void onClick(View v) {  
     
                if (v == btnSingleThread) {  
                    new Load_DrawImage(0, 0).start();//開一條線程讀取并繪圖  
                } else if (v == btnDoubleThread) {  
                    new LoadImage().start();//開一條線程讀取  
                    new DrawImage(imgWidth + 10, 0).start();//開一條線程繪圖  
                }  
     
            }  
     
        }  
     
        class MyCallBack implements SurfaceHolder.Callback {  
     
            @Override 
            public void surfaceChanged(SurfaceHolder holder, int format, int width,  
                    int height) {  
                Log.i("Surface:", "Change");  
     
            }  
     
            @Override 
            public void surfaceCreated(SurfaceHolder holder) {  
                Log.i("Surface:", "Create");   
      


                // 用反射機(jī)制來(lái)獲取資源中的圖片ID和尺寸  
                Field[] fields = R.drawable.class.getDeclaredFields();  
                for (Field field : fields) {  
                    if (!"icon".equals(field.getName()))// 除了icon之外的圖片  
                    {  
                        int index = 0;  
                        try {  
                            index = field.getInt(R.drawable.class);  
                        } catch (IllegalArgumentException e) {  
                            // TODO Auto-generated catch block  
                            e.printStackTrace();  
                        } catch (IllegalAccessException e) {  
                            // TODO Auto-generated catch block  
                            e.printStackTrace();  
                        }  
                        // 保存圖片ID  
                        imgList.add(index);  
                    }  
                }  
                // 取得圖像大小  
                Bitmap bmImg = BitmapFactory.decodeResource(getResources(),  
                        imgList.get(0));  
                imgWidth = bmImg.getWidth();  
                imgHeight = bmImg.getHeight();  
            }  
     
            @Override 
            public void surfaceDestroyed(SurfaceHolder holder) {  
                Log.i("Surface:", "Destroy");  
     
            }  
     
        }  
     
        /* 
         * 讀取并顯示圖片的線程 
         */ 
        class Load_DrawImage extends Thread {  
            int x, y;  
            int imgIndex = 0;  
     
            public Load_DrawImage(int x, int y) {  
                this.x = x;  
                this.y = y;  
            }  
     
            public void run() {  
                while (true) {  
                    Canvas c = sfh.lockCanvas(new Rect(this.x, this.y, this.x  
                            + imgWidth, this.y + imgHeight));  
                    Bitmap bmImg = BitmapFactory.decodeResource(getResources(),  
                            imgList.get(imgIndex));  
                    c.drawBitmap(bmImg, this.x, this.y, new Paint());  
                    imgIndex++;  
                    if (imgIndex == imgList.size())  
                        imgIndex = 0;  
     
                    sfh.unlockCanvasAndPost(c);// 更新屏幕顯示內(nèi)容  
                }  
            }  
        };  
     
        /* 
         * 只負(fù)責(zé)繪圖的線程 
         */ 
        class DrawImage extends Thread {  
            int x, y;  
     
            public DrawImage(int x, int y) {  
                this.x = x;  
                this.y = y;  
            }  
     
            public void run() {  
                while (true) {  
                    if (bitmap != null) {//如果圖像有效  
                        Canvas c = sfh.lockCanvas(new Rect(this.x, this.y, this.x  
                                + imgWidth, this.y + imgHeight));  
     
                        c.drawBitmap(bitmap, this.x, this.y, new Paint());  
     
                        sfh.unlockCanvasAndPost(c);// 更新屏幕顯示內(nèi)容  
                    }  
                }  
            }  
        };  
     
        /* 
         * 只負(fù)責(zé)讀取圖片的線程 
         */ 
        class LoadImage extends Thread {  
            int imgIndex = 0;  
     
            public void run() {  
                while (true) {  
                    bitmap = BitmapFactory.decodeResource(getResources(),  
                            imgList.get(imgIndex));  
                    imgIndex++;  
                    if (imgIndex == imgList.size())//如果到盡頭則重新讀取  
                        imgIndex = 0;  
                }  
            }  
        };  

     

     

    (審核編輯: 智匯小新)

    聲明:除特別說(shuō)明之外,新聞內(nèi)容及圖片均來(lái)自網(wǎng)絡(luò)及各大主流媒體。版權(quán)歸原作者所有。如認(rèn)為內(nèi)容侵權(quán),請(qǐng)聯(lián)系我們刪除。

    主站蜘蛛池模板: 河南康振机械有限公司 | 西安logo设计公司/西安包装设计公司/西安画册设计公司/西安广告公司/西安品牌设计公司/泰勒广告 雾度计-雾度仪-透光率测试仪-3nh品牌雾度仪生产厂家 | 山西洗煤设备_山西洗煤机_山西离心机-山西东鑫昶机械科技股份有限公司 | 健身器材_健身器材厂_健身器材厂家-徐州兰士健身器材有限公司 | 中科联航(江苏)-信息化监理|信息化咨询|信息系统项目管理|信息系统工程监理公司 | 思源医疗器械网,雾化器厂家,医用床生产厂家,医疗器械厂家,医疗器械代加工 | 气泡式洗菜机-气泡喷淋清洗机-喷淋清洗风干线-诸城市迪凯工业装备有限公司 | 斩天手游网_高质量手机游戏下载中心| 全自动冷冻研磨仪-高通量组织研磨仪厂家-「杭州宋慈智能科技」 | 陕西柱塞泵厂家_智能张拉设备_桥梁施工设备_千斤顶_液压分裂棒_液压分裂枪|陕西中拓矿山设备有限公司 | 西安西玛电机销售,西安西玛电机有限公司(原泰富西玛西安电机厂) 西安西雷脉冲功率技术有限公司-高压调制器/加速器与脉冲功率系统的研发/生产/应用推广/高压脉冲电源的应用研究/设计/生产和销售/高功率脉冲器件/材料与仪器设备的研发/生产和销售/高电压/大电流/强磁场环境的模拟及测试服务/会议会展服务/货物及进出口的业务/脉冲功率技术领域类的技术转让 西安网站建设,西安网站设计制作,西安短视频拍摄_短视频运营就选动力无限网络推广公司 | 山东贝州集团有限公司| 呼吸家官网|肺功能检测仪生产厂家|国产肺功能仪知名品牌|肺功能检测仪|肺功能测试仪|婴幼儿肺功能仪|弥散残气肺功能仪|肺功能测试系统|广州红象医疗科技有限公司|便携式肺功能仪|大肺功能仪|呼吸康复一体机|儿童肺功能仪|肺活量计|医用简易肺功能仪|呼吸康复系统|肺功能仪|弥散肺功能仪(大肺)|便携式肺功能检测仪|肺康复|呼吸肌力测定肺功能仪|肺功能测定仪|呼吸神经肌肉刺激仪|便携式肺功能 | 木马交互设计研究中心 ,专注于用户体验与人机交互设计 - 首页 | 长沙网站建设,网站设计制作,长沙小程序开发,公众号开发,长沙叶老设计 | 曙海培训-仿真培训Linux培训html5培单片机培训PCB培训python培训PLC培训C语言培训android培训物联网培训无线电培训欧姆龙培训工业机器人培训5G培训Hadoop培训CFD培训项目外包开发咨询 | 液压尾管悬挂器,机械式尾管悬挂器价格,石油套管扶正器厂家,连续油管悬挂器,高压双塞水泥头,免钻塞注水泥分级箍,单塞套管水泥头价格,弹性套管扶正器,铸铝钢性扶正器,钢性套管扶正器厂家 | 木材粉碎机,木头木材破碎机,大型木材粉碎机多少钱一台-晨红木材粉碎机厂家-巩义市晨红机械厂 | 郑州空调维修_郑州中央空调维修_空调清洗维保-郑州大晟机电设备安装工程有限公司 | 树枝粉碎机,锯末机,木材粉碎机的专业生产厂家利鑫机械,问价格找利鑫 | 天空彩票天下彩,天空彩天空彩票免费资料,天空彩票与你同行开奖,天下彩正版资料大全 | 思沃普智能会议预约管理系统-视频会议管理-信息发布-访客管理-会议运维-会议支持-工位管理系统 | 九江市京邦玻纤有限公司| 长沙物流公司|湖南货物运输公司|长沙第三方物流公司-国联物流 湖南第三方物流专家 | 金华美凡文化传媒有限公司 | 深圳人才网_深圳招聘网_【官方网站】 | 热水工程|空气能热水工程|超低温采暖工程|太阳能热水工程|空气源热泵厂家|炬邦热能设备有限公司 热熔钻孔机【优质厂家】_多年热熔钻设备研发制造经验 | 线束加工_线束加工厂_线束厂-苏州缆仕特电子有限公司 | 智能访客系统 - 来访登记系统_微信预约系统_人员出入管理系统_访客机_人脸识别系统门禁闸机 | 全自动冷冻研磨仪-高通量组织研磨仪厂家-「杭州宋慈智能科技」 | 五金冲压件生产厂家_加工五金拉伸件-沧州浚鼎机械制造有限公司-沧州浚鼎机械制造有限公司 | 气动球阀,电动蝶阀,调节阀,衬氟阀门,水利控制阀,大口径阀门生产厂家-上海百钢阀门集团有限公司-官网,上海阀门品牌 | 陕西筱润智能科技有限公司 干部人事智能档案柜 智能密集架 智能档案柜 部队选层文件智能柜 智能枪弹柜 财务智能档案柜 边防武警智能密集架 医院智能档案柜 部队选层文件智能柜智能枪弹柜 学校医院文件柜 企事业单位公检法智能文件柜 生产厂家-筱润智能科技有限公司 RFID射频智能密集架 全自动智能选层档案柜 智能密保柜 枪柜部队营房营具床桌椅办公家具 办公用品档案盒设备货架 全自动智能选层柜生产厂家-筱润智能科技有限公司 | 青州市科信水处理设备有限公司-ic卡水处理设备厂家-畜牧养殖水处理设备 | 仪器校准,校验,校正,检定选值得托付的第三方法定计量检测机构! 铱金供应-上海钌合金-氯铱酸厂家-上海庞势新材料科技有限公司 | 南通惠德彩钢有限公司-彩钢瓦,岩棉板,净化板,夹芯板,市政工地围挡板 | 兔展-H5页面制作、微信营销活动一站式企业营销数字化增长平台 | 西安鸿仁汇智软件公司是高新技术企业,专业为企业及高校提供智慧化管理一站式解决方案 | 九江江菱电梯有限公司| 景德镇芳然装饰有限公司 | 太原重卡叔叔运输有限公司-山西太原大件运输、太原物流公司、太原货运物流、太原大件运输、太原货运信息、长治物流公司、长治大件运输、晋城物流公司、晋城大件运输、忻州大件运输、朔州大件运输、阳泉大件运输、大同大件运输、吕梁大件运输、临汾大件运输、运城大件运城 |