新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > Android 的 SurfaceView 雙緩沖應用

        Android 的 SurfaceView 雙緩沖應用

        作者: 時間:2016-10-08 來源:網絡 收藏

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

        本文引用地址:http://www.104case.com/article/201610/305442.htm

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

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

        [圖片] 程序運行截圖

        2. [代碼]main.xml

        01

        02

        03 android:layout_width=fill_parent android:layout_height=fill_parent

        04 android:orientation=vertical>

        05

        06

        07 android:layout_width=wrap_content android:layout_height=wrap_content>

        08

        09 android:layout_height=wrap_content android:text=單個獨立線程>

        10

        11 android:layout_height=wrap_content android:text=兩個獨立線程>

        12

        13

        14 android:layout_width=fill_parent android:layout_height=fill_parent>

        15

        3. [代碼]TestSurfaceView.java

        001package com.testSurfaceView;

        002

        003import java.lang.reflect.Field;

        004import java.util.ArrayList;

        005import android.app.Activity;

        006import android.graphics.Bitmap;

        007import android.graphics.BitmapFactory;

        008import android.graphics.Canvas;

        009import android.graphics.Paint;

        010import android.graphics.Rect;

        011import android.os.Bundle;

        012import android.util.Log;

        013import android.view.SurfaceHolder;

        014import android.view.SurfaceView;

        015import android.view.View;

        016import android.widget.Button;

        017

        018public class TestSurfaceView extends Activity {

        019 /** Called when the activity is first created. */

        020 Button btnSingleThread, btnDoubleThread;

        021 SurfaceView sfv;

        022 SurfaceHolder sfh;

        023 ArrayList imgList = new ArrayList();

        024 int imgWidth, imgHeight;

        025 Bitmap bitmap;//獨立線程讀取,獨立線程繪圖

        026

        027 @Override

        028 public void onCreate(Bundle savedInstanceState) {

        029 super.onCreate(savedInstanceState);

        030 setContentView(R.layout.main);

        031

        032 btnSingleThread = (Button) this.findViewById(R.id.Button01);

        033 btnDoubleThread = (Button) this.findViewById(R.id.Button02);

        034 btnSingleThread.setOnClickListener(new ClickEvent());

        035 btnDoubleThread.setOnClickListener(new ClickEvent());

        036 sfv = (SurfaceView) this.findViewById(R.id.SurfaceView01);

        037 sfh = sfv.getHolder();

        038 sfh.addCallback(new MyCallBack());// 自動運行surfaceCreated以及surfaceChanged

        039 }

        040

        041 class ClickEvent implements View.OnClickListener {

        042

        043 @Override

        044 public void onClick(View v) {

        045

        046 if (v == btnSingleThread) {

        047 new Load_DrawImage(0, 0).start();//開一條線程讀取并繪圖

        048 } else if (v == btnDoubleThread) {

        049 new LoadImage().start();//開一條線程讀取

        050 new DrawImage(imgWidth + 10, 0).start();//開一條線程繪圖

        051 }

        052

        053 }

        054

        055 }

        056

        057 class MyCallBack implements SurfaceHolder.Callback {

        058

        059 @Override

        060 public void surfaceChanged(SurfaceHolder holder, int format, int width,

        061 int height) {

        062 Log.i(Surface:, Change);

        063

        064 }

        065

        066 @Override

        067 public void surfaceCreated(SurfaceHolder holder) {

        068 Log.i(Surface:, Create);

        069

        070 // 用反射機制來獲取資源中的圖片ID和尺寸

        071 Field[] fields = R.drawable.class.getDeclaredFields();

        072 for (Field field : fields) {

        073 if (!icon.equals(field.getName()))// 除了icon之外的圖片

        074 {


        上一頁 1 2 下一頁

        關鍵詞:

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 上思县| 成都市| 万宁市| 右玉县| 曲周县| 措美县| 赤峰市| 泰安市| 永福县| 盐源县| 陆良县| 崇州市| 独山县| 丹巴县| 冕宁县| 江西省| 万荣县| 措勤县| 光山县| 缙云县| 瓦房店市| 奈曼旗| 江川县| 萍乡市| 甘孜| 定安县| 门头沟区| 旺苍县| 乌兰浩特市| 新龙县| 永吉县| 巨野县| 金昌市| 巴林右旗| 冷水江市| 云龙县| 玛多县| 永靖县| 山阳县| 澄城县| 时尚|