2015年1月27日

【Android】截圖緩存、螢幕畫面擷取實作

各位Android安卓開發者大家好!^^

今天小黑人要與大家分享的文章是"截圖"也就是即時擷取全螢幕畫面的意思,這個功能用途可以運用在一些錯誤測試畫面認證的機制,但要怎麼運用主要還是看開發的需求而定,例如像運用在錯誤測試的原因是:如果程式運行中發生錯誤時可以即時擷取當下的錯誤畫面;或者是需要即時的手機螢幕畫面回傳至後台進行認證等截圖使用機制。那要怎麼快速的擷取螢幕畫面呢?就讓我們繼續看下去吧~

接下來,擷取全螢幕畫面的功能只要在Activity(.java)上做編輯控制即可,所以在Layout(.xml)AndroidManifest.xml都不用特別針對截圖功能做設定。

Activity完整程式碼如下 :

public class MainActivity extends Activity
{
        //擷取畫面按鈕
        private Button mBtn;
        //截圖的畫面
        private ImageView mImg;
       
        @Override
        protected void onCreate(Bundle savedInstanceState)
        {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.main);
               
                //取得ButtonImageView元件
                mBtn = (Button) findViewById(R.id.btn);
                mImg = (ImageView) findViewById(R.id.img);
               
                //點擊按鈕觸發
                mBtn.setOnClickListener(new OnClickListener()
                {
                        @Override
                        public void onClick(View v)
                        {
                                //將截圖Bitmap放入ImageView
                                mImg.setImageBitmap(getScreenShot());
                        }
                });
        }
       
        //將全螢幕畫面轉換成Bitmap
        private Bitmap getScreenShot()
        {   
                //藉由ViewCache全螢幕畫面後放入Bitmap
                View mView = getWindow().getDecorView();  
                mView.setDrawingCacheEnabled(true);  
                mView.buildDrawingCache();  
                Bitmap mFullBitmap = mView.getDrawingCache();  

                //取得系統狀態列高度
                Rect mRect = new Rect();    
                getWindow().getDecorView().getWindowVisibleDisplayFrame(mRect);    
                int mStatusBarHeight = mRect.top;       

                //取得手機螢幕長寬尺寸
                int mPhoneWidth = getWindowManager().getDefaultDisplay().getWidth();    
                int mPhoneHeight = getWindowManager().getDefaultDisplay().getHeight(); 
       
                //將狀態列的部分移除並建立新的Bitmap
                Bitmap mBitmap = Bitmap.createBitmap(mFullBitmap, 0, mStatusBarHeight, mPhoneWidth, mPhoneHeight - mStatusBarHeight);  
                //Cache的畫面清除
                mView.destroyDrawingCache(); 
       
                return mBitmap;  
        }  
}

以上的程式碼帶入後就可以即時擷取螢幕畫面,至於擷取完的畫面Bitmap要怎麼運用就看開發需求而定,例如要儲存顯示回傳等各運用方法,大家可以試試看這個截圖機制。

小黑人範例畫面如下 :


謝謝大家,如有任何問題都可以和小黑人一起交流討論!

☆小黑人☆

1 則留言:

  1. 請問可以連同狀態列一起截進去嗎0.0

    回覆刪除

謝謝大家支持,有任何問題都可以和小黑人一起討論!