1. 程式人生 > >Android應用截圖兩種方法

Android應用截圖兩種方法

在Android應用開發過程中,可能會遇到需要對整個介面或者某一部分進行截圖的需求。Android中對View的截圖也有很多中方式:

  1. 使用DrawingCache
  2. 直接呼叫View.draw
DrawingCache方法: 如果使用DrawingCache,則對要截圖的View有一個要求:View本身已經顯示在介面上。如果View沒有新增到介面上或者沒有顯示(繪製)過,則buildDrawingCache會失敗。這種方式比較適合對應用介面或者某一部分的截圖。步驟很簡單:
view.setDrawingCacheEnabled(true);
view.buildDrawingCache();  //啟用DrawingCache並建立點陣圖
Bitmap bitmap = Bitmap.createBitmap(view.getDrawingCache()); //建立一個DrawingCache的拷貝,因為DrawingCache得到的點陣圖在禁用後會被回收
view.setDrawingCacheEnabled(false);  //禁用DrawingCahce否則會影響效能

View.draw方法: 如果需要截圖的View並沒有新增到介面上,可能是通過java程式碼建立的或者inflate建立的,此時呼叫DrawingCache方法是獲取不到點陣圖的。因為View在新增到容器中之前並沒有得到實際的大小(如果LayoutWidth是MatchParent,它還沒有Parent…),所以首先需要指定View的大小:
	private void layoutView(View v, int width, int height) {
		// validate view.width and view.height
		v.layout(0, 0, width, height);
		int measuredWidth = View.MeasureSpec.makeMeasureSpec(width, View.MeasureSpec.EXACTLY);
		int measuredHeight = View.MeasureSpec.makeMeasureSpec(height, View.MeasureSpec.EXACTLY);
		// validate view.measurewidth and view.measureheight
		v.measure(measuredWidth, measuredHeight);
		v.layout(0, 0, v.getMeasuredWidth(), v.getMeasuredHeight());i
	}

然後View和其內部的子View都具有了實際大小,也就是完成了佈局,相當與新增到了介面上。接著就可以建立點陣圖並在上面繪製了:
int viewWidth = webView.getMeasuredWidth();
int viewHeight = webView.getMeasuredHeight();
if (viewWidth > 0 && viewHeight > 0) {
	b = Bitmap.createBitmap(viewWidth, viewHeight, Config.ARGB_8888);
	Canvas cvs = new Canvas(b);
	webView.draw(cvs);
}
對於WebView的截圖有一點特殊,網頁內容並不能在佈局完成後立即渲染出來,因為WebView大小的變化就相當與桌面瀏覽器視窗大小的變化,Webkit需要根據視窗大小重新渲染所有的內容,這最多大概需要300ms的時間(對於不同效能的裝置、網頁複雜程度和Webkit版本可能不同)。如果建立後臺的WebView需要截圖的話,應該在建立時就對其進行佈局操作,這樣載入完成後大部分就已經渲染完畢了(除非有非同步的js處理)。

相關推薦

Android應用方法

在Android應用開發過程中,可能會遇到需要對整個介面或者某一部分進行截圖的需求。Android中對View的截圖也有很多中方式: 使用DrawingCache直接呼叫View.drawDrawingCache方法: 如果使用DrawingCache,則對要截圖的Vie

Matplotlib 子 subplot 畫餅、折線方法

方法一:axs畫子圖 import seaborn as sns import matplotlib import matplotlib.pyplot as plt sns.set_style("whitegrid") matplotlib.rcParams['font.sans-serif'

Android應用和SurfaceView問題總結

                最近在做android截圖應用的過程遇到很多問題,接觸了好些截圖方法,但是還是不能實現SufaceView截圖功能。今天就把我嘗試過的方法總結下,希望把我慘痛的經歷寫出來後能夠幫助到要做此功能的朋友少走彎路,或者是給一些思路吧。如果哪位大俠能夠做到SurfaceView截圖,還

2012-7-20 android 圖片疊加效果——方法

效果圖: 第一種: 第二種: 第一種是通過canvas畫出來的效果: public void first(View v) { // 防止出現Immutable bitmap passed to Canvas constructor錯誤

android 呼叫webservice(方法

   首先介紹下網上常用的webservice呼叫方法,例子很多,我就不詳細介紹了,簡單說下流程: // 建立soapObject物件,引數為名稱空間和呼叫方法名,也就是soap_action. 這個可以在WSDL中獲取.SoapObject object = new So

android 圖片疊加效果——方法

效果圖: 第一種: 第二種: 第一種是通過canvas畫出來的效果: public void first(View v) { // 防止出現Immutable bitmap passed to Canvas constructor錯誤

Android按鈕實現的方法

剛接觸Android開發,第一篇部落格,也就當做筆記吧, 這裡先說一個問題,在很多Android開發書中可能是版本太早的問題,都說res/layout下有一個main.xml檔案中放著排版資訊,但是個人在實際中見到的是res/menu下是main.xml中只有少量其他資訊,

android介面切換的方法

方法1、通過setContentView切換layout ①新建一個介面的layout的xml檔案 ②觸發某一控制元件(如Button),該控制元件已經載入監聽器,監聽器通過setContentView函式切換layout     這樣的實現整個過程都是在一個Activit

監控Linux環境下JVM應用記憶體的方法

效能測試監控中,監控Linux環境下應用記憶體方法如下: ------------------------------------------------------------------------------------------------------------

Android螢幕常亮方法

一種是在Activity的onCreate裡面處理 @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedI

Android沉浸式的方法

隱藏狀態列 一個Android應用程式的介面上其實是有很多系統元素的,觀察下圖: 而打造沉浸式模式的使用者體驗,就是要將這些

Android實現功能的幾方法

一般情況下各種型號的手機都會有自帶的截圖功能,也會有諸如“開關機鍵+音量鍵”的截圖快捷鍵,只要手機是亮屏狀態,都會將手機螢幕的可視區域(包含狀態列)全部擷取下來。如果開發中想要調取系統的截圖功能,理論上講是可以的,需要在APK中呼叫“adb shell screencap -

簡單演示螢幕視窗方法(MessageBox,並自動關閉)

程式碼中提供了視窗截圖的兩種方法,但是在ScreenCapture.cs檔案中提供了多種螢幕截圖的方法 1、擷取button_click後彈出的視窗; 2、獲取指定標題的MessageBox,截圖,並在一秒鐘後自動關閉。 不貼程式碼了,直接上VS2008的工程了

Android】Gadle改變應用名稱(appName)的方法

應用場景App在debug/release編譯環境下,想通過改變appName來給予區分。productFlavors增加各種編譯引數時,比如更換applicationId包名,appName也需要跟著變動。方法一:設定manifestPlaceholders1234567891011121314151617

Laravel向視傳遞變量的方法

turn col pan indent 視圖 ret log class cnblogs 1 //方法一 2 return view(‘home.user‘)->with(‘datas‘, $datas); 3 4 //方法二 5 return view(‘hom

android 選取部分 log 的方法

trac rac 兩種方法 tag mar grep ack run ng- Grep多個條件: android logcat -v time | grep -e A -e B 選取多個android log tag: android logcat -v ti

aNDROID方法實現MENU

music win pup andro com 兩種方法 hao123 popu oid pOpUpWINDOW%E6%98%BE%E7%A4%BA%E7%9A%84%E9%97%AE%E9%A2%98 http://music.hao123.com/songlist/4

CSS實現背景尺寸不隨瀏覽器縮放而變化的方法

簡單 fix chrom per 實現 瀏覽器 webkit 只需要 div 方法一. 把圖片作為background 有幾個CSS的屬性要提一下:background-size:cover,這個CSS3的屬性作用是把背景圖像擴展至足夠大,以使背景圖像完全覆蓋背景區域,背景

自制按鈕標的方法: image sprite和svg字體文件

輸出 圖標 int uil pac 設置 定制 方法 ets 用image sprite和svg字體文件這兩種方法,都能夠極大地減少小圖形文件的數量, 從而減少服務器請求和帶寬需求。提高網頁的響應速度。 一、建立SVG字體文件 iconmoon 是一個在線工具,可以上傳

使用PHP生成二維碼的方法(帶logo像)

好的 區域 chl sta n) 方便 ram 尺寸 混合 一、利用Google API生成二維碼 Google提供了較為完善的二維碼生成接口,調用API接口很簡單,以下是調用代碼: $urlToEncode="http://www.jb51.net"; generat