日韩欧美自拍在线观看-欧美精品在线看片一区二区-高清性视频一区二区播放-欧美日韩女优制服另类-国产精品久久久久久av蜜臀-成人在线黄色av网站-肥臀熟妇一区二区三区-亚洲视频在线播放老色-在线成人激情自拍视频

SurfaceView的雙緩沖使用Android

出處:ybm 發(fā)布于:2011-08-25 22:36:57

    Android一詞的本義指“機(jī)器人”,同時(shí)也是Google于2007年11月5日宣布的基于Linux平臺(tái)的開(kāi)源手機(jī)操作系統(tǒng)的名稱,該平臺(tái)由操作系統(tǒng)、中間件、用戶界面和應(yīng)用軟件組成,號(hào)稱是為移動(dòng)終端打造的真正開(kāi)放和完整的移動(dòng)軟件。目前,版本為Android 2.4 Gingerbread和Android 3.0 Honeycomb。

    Android是基于Linux開(kāi)放性內(nèi)核的操作系統(tǒng),是Google公司在2007年11月5日公布的手機(jī)操作系統(tǒng)。早期由原名為"Android"的公司開(kāi)發(fā),谷歌在2005年收購(gòu)"Android.Inc"后,繼續(xù)進(jìn)行對(duì)Android系統(tǒng)開(kāi)發(fā)運(yùn)營(yíng),它采用了軟件堆層的架構(gòu),主要分為三部分。底層Linux內(nèi)核只提供基本功能,其他的應(yīng)用軟件則由各公司自行開(kāi)發(fā),部分程序以Java編寫。

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

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

 

 

 

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

    main.xml的源碼:

    view plaincopy to clipboardprint?

    android:orientation="vertical">

    android:layout_width="wrap_content" android:layout_height="wrap_content">

        
        
     
    android:layout_width="fill_parent" android:layout_height="fill_parent">

    android:layout_width="fill_parent" android:layout_height="fill_parent"

    android:orientation="vertical">

    android:layout_width="wrap_content" android:layout_height="wrap_content">

  
  


 
   android:layout_width="fill_parent" android:layout_height="fill_parent">
 

    本文程序的源碼:

    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 imgList = new ArrayList();

    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();//開(kāi)一條線程讀取并繪圖

    } else if (v == btnDoubleThread) {

    new LoadImage()。start();//開(kāi)一條線程讀取

    new DrawImage(imgWidth + 10, 0)。start();//開(kāi)一條線程繪圖

    }

    }

    }

    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;

    }

    }

    };

    }


  
關(guān)鍵詞:Android

版權(quán)與免責(zé)聲明

凡本網(wǎng)注明“出處:維庫(kù)電子市場(chǎng)網(wǎng)”的所有作品,版權(quán)均屬于維庫(kù)電子市場(chǎng)網(wǎng),轉(zhuǎn)載請(qǐng)必須注明維庫(kù)電子市場(chǎng)網(wǎng),http://www.hbjingang.com,違反者本網(wǎng)將追究相關(guān)法律責(zé)任。

本網(wǎng)轉(zhuǎn)載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點(diǎn)或證實(shí)其內(nèi)容的真實(shí)性,不承擔(dān)此類作品侵權(quán)行為的直接責(zé)任及連帶責(zé)任。其他媒體、網(wǎng)站或個(gè)人從本網(wǎng)轉(zhuǎn)載時(shí),必須保留本網(wǎng)注明的作品出處,并自負(fù)版權(quán)等法律責(zé)任。

如涉及作品內(nèi)容、版權(quán)等問(wèn)題,請(qǐng)?jiān)谧髌钒l(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。

廣告
OEM清單文件: OEM清單文件
*公司名:
*聯(lián)系人:
*手機(jī)號(hào)碼:
QQ:
有效期:

掃碼下載APP,
一鍵連接廣大的電子世界。

在線人工客服

買家服務(wù):
賣家服務(wù):
技術(shù)客服:

0571-85317607

網(wǎng)站技術(shù)支持

13606545031

客服在線時(shí)間周一至周五
9:00-17:30

關(guān)注官方微信號(hào),
第一時(shí)間獲取資訊。

建議反饋

聯(lián)系人:

聯(lián)系方式:

按住滑塊,拖拽到最右邊
>>
感謝您向阿庫(kù)提出的寶貴意見(jiàn),您的參與是維庫(kù)提升服務(wù)的動(dòng)力!意見(jiàn)一經(jīng)采納,將有感恩紅包奉上哦!