国产一区二区精品在线_午夜精品视频_亚洲国产高清高潮精品美女_久久久91_午夜精品视频_久久久久亚洲一区二区三区

Android應用之SurfaceView的雙緩沖使用

來源:網絡

點擊:2449

A+ A-

所屬頻道:新聞中心

關鍵詞: Android,SurfaceView,雙緩沖

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

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

     

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

    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="單個獨立線程"></Button> 
            <Button android:id="@+id/Button02" android:layout_width="wrap_content" 
                android:layout_height="wrap_content" android:text="兩個獨立線程"></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="單個獨立線程"></Button>
      <Button android:id="@+id/Button02" android:layout_width="wrap_content"
       android:layout_height="wrap_content" android:text="兩個獨立線程"></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;//獨立線程讀取,獨立線程繪圖  
     
        @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());// 自動運行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");   
      


                // 用反射機制來獲取資源中的圖片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);// 更新屏幕顯示內容  
                }  
            }  
        };  
     
        /* 
         * 只負責繪圖的線程 
         */ 
        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);// 更新屏幕顯示內容  
                    }  
                }  
            }  
        };  
     
        /* 
         * 只負責讀取圖片的線程 
         */ 
        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;  
                }  
            }  
        };  

     

     

    (審核編輯: 智匯小新)

    聲明:除特別說明之外,新聞內容及圖片均來自網絡及各大主流媒體。版權歸原作者所有。如認為內容侵權,請聯系我們刪除。

    国产一区二区精品在线_午夜精品视频_亚洲国产高清高潮精品美女_久久久91_午夜精品视频_久久久久亚洲一区二区三区
    <cite id="gqusq"><tbody id="gqusq"></tbody></cite>
    <strike id="gqusq"><tbody id="gqusq"></tbody></strike>
    <abbr id="gqusq"><rt id="gqusq"></rt></abbr>
  • <strike id="gqusq"><tbody id="gqusq"></tbody></strike>
    <ul id="gqusq"></ul>
    <center id="gqusq"><noscript id="gqusq"></noscript></center>
  • 欧美日韩系列| 国产一区精品在线| 中文字幕精品一区日韩| 黄色国产精品一区二区三区| 影音先锋久久| 欧美激情第10页| 日本精品一区二区三区高清 久久 日本精品一区二区三区不卡无字幕 | 久久激情视频| 在线成人av| 很黄很黄激情成人| 国产精品v亚洲精品v日韩精品| 午夜老司机精品| 欧美精品一区在线发布| 国产亚洲欧美一区二区 | 痴汉一区二区三区| 久久久国产精品一区二区三区| 在线欧美视频| 在线视频观看日韩| 亚洲一本视频| 在线日韩欧美| 亚洲经典三级| 中文久久精品| 国产欧美精品久久| 亚洲欧美视频| 97久久精品午夜一区二区| 久久久一二三| 不卡视频一区| 久久久一本精品99久久精品66 | 亚洲一区成人| 久久亚洲欧美| 久久艹中文字幕| 欧美连裤袜在线视频| 日本高清视频一区二区三区| 亚洲一区免费看| 欧美日韩综合| 国产精品亚洲产品| 91情侣在线视频| 久久国产手机看片| 中文字幕中文字幕在线中一区高清| 在线免费一区| 亚洲狠狠婷婷| 99在线高清视频在线播放| 精品不卡一区二区三区| 亚洲精品成人a8198a| 国内精品亚洲| 99免费在线观看视频| 欧美日韩三区四区| 午夜精品美女久久久久av福利| 亚洲第一黄网| 国产精品青青草| 一本色道久久综合亚洲二区三区 | 亚洲福利国产| 久久综合激情| 日本成人黄色| 亚洲精品在线视频观看| 成人免费在线一区二区三区| 欧美精品一区二区三区四区五区| 欧美在线视频一区二区三区| 国产一级精品aaaaa看| 九色91国产| 亚洲人www| 久久久7777| 99亚洲视频| 热re99久久精品国产99热| 亚洲经典三级| 人禽交欧美网站免费| 99热这里只有精品8| 美女视频久久| 国产精品一区二区三区四区五区| 久久综合九色99| 夜夜精品视频| 亚洲高清不卡一区| av日韩中文字幕| 一区免费在线| 日韩高清av电影| 99久久无色码| 亚洲免费激情| 一区二区精品国产| 国产有色视频色综合| 影音国产精品| 亚洲欧美影院| 国产精品美女黄网| 亚洲精品一区二| 亚洲一区二区免费视频软件合集| 久久精品亚洲| 在线成人www免费观看视频| 欧美日产一区二区三区在线观看| 99精品99久久久久久宅男| 亚洲欧美日产图| 久久综合中文色婷婷| 7777奇米亚洲综合久久| 亚洲欧洲精品一区二区| 在线视频精品一区| 欧美亚洲另类久久综合| av成人在线电影| 亚洲一区二区三区四区中文 | 亚洲片区在线| 国产一区观看| 亚洲图片在线观看| 欧美区高清在线| 精品欧美一区二区在线观看视频| 久久国产精品高清| 国产精品老牛| 国产亚洲精品bv在线观看| 亚洲五月婷婷| 欧美天堂亚洲电影院在线观看| 日韩福利影院| 日韩欧美精品一区二区三区经典| 好吊色欧美一区二区三区四区| 2020国产精品久久精品不卡| 亚洲一区二区三区色| 国产伦精品一区二区三| 亚洲精品美女91| 亚洲高清视频一区| 国内综合精品午夜久久资源| 欧美.www| 亚洲亚洲精品三区日韩精品在线视频| 欧美国产视频在线观看| 欧美久久久久| 好看的日韩av电影| 激情综合中文娱乐网| 欧美伊人久久| 激情综合激情| 国产日韩欧美三区| 亚洲一区二区网站| 久久久亚洲一区| 99久久无色码| 国产精品一区视频| 九色91在线视频| 久久手机视频| 亚洲在线不卡| 欧美精品首页| 99热在线精品观看| 51国偷自产一区二区三区的来源| av免费精品一区二区三区| 精品一区在线播放| 日本精品一区二区| 欧美午夜视频| 国产伦精品一区二区三| 国产伦精品一区二区三区免 | 亚洲精品在线观看免费| 亚洲伊人网站| 九九九九精品九九九九| 夜夜春亚洲嫩草影视日日摸夜夜添夜| 椎名由奈jux491在线播放| 日韩视频在线一区二区三区| 国产亚洲欧美一区二区三区| 动漫3d精品一区二区三区| 亚洲成人蜜桃| 国产亚洲第一区| 久久精品日韩精品| 国产一区二区无遮挡| 性色一区二区三区| 日本在线高清视频一区| 在线精品福利| 精品人伦一区二区三区| 午夜欧美精品| 91丝袜脚交足在线播放| 青娱乐一区二区| 午夜亚洲激情| 五月天久久狠狠| 国产伦理一区| 亚洲欧洲日韩精品| 老妇喷水一区二区三区| 亚洲一区在线免费| 91成人理论电影| 欧美日韩mv| 国产在线资源一区| 亚洲国产精品一区二区第一页| 动漫3d精品一区二区三区| 欧美日韩精品免费看| av一区二区三区在线观看| 欧美精品观看| 国产乱码精品一区二区三区中文 | 亚洲精品一区二区三区樱花 | 国产亚洲欧美一区二区三区| 国内精品久久久久国产盗摄免费观看完整版| 欧美亚洲一区二区三区| 一本一生久久a久久精品综合蜜| 免费久久99精品国产自| 在线观看免费91| 精品国产乱码久久久久软件| 91久久极品少妇xxxxⅹ软件| 日韩免费三级| 999热视频| 成人高清在线观看| 一区在线播放| 一区二区三区四区免费视频| 国产精品久久波多野结衣| 一区二区三区免费看| 一区国产精品| 日本一区二区免费看| 国产一区二区免费电影| 国产精品区一区| 国产中文一区| 亚洲电影免费| 奇米视频888战线精品播放| 91在线观看网站| 久久精品三级| 亚洲欧美日韩一区在线观看|