Android中布局保存成圖片實例代碼
一、前言
有一個朋友問做過截屏的小功能沒,自己沒有做過。但是想了一下,實現(xiàn)的過程。實現(xiàn)截屏就是為了截取咱們應(yīng)用中的部分布局,然后實現(xiàn)將保存在本地,或?qū)⑵浞窒?,或?qū)⑵渫ㄟ^第三方的平臺分享出去。自己可能是受了截屏這兩個字的影響,想當然的去梳理自己的實現(xiàn)思路。
1:截屏,調(diào)用系統(tǒng)的截屏功能區(qū)實現(xiàn)截屏。
2:對圖片進行處理:截屏是截取的手機的全屏,因為我們是需要截取我們的應(yīng)用的某一部分,所以我們需要去通過剪切裁剪,去裁剪出自己想要保留的一部分(實質(zhì)也就是保存布局)。
3:后續(xù)也許還要處理系統(tǒng)截屏功能本身所有的分享等其他的功能。反正就是會有各種問題。
上面有一個詞兒是“保存布局”。意思就是將我們的布局保存成為圖片。我聽到這個之后,今天到公司的第一件事兒就是自己去實現(xiàn)一下所謂的截屏這個功能。
二、實現(xiàn)流程以及實現(xiàn)代碼
0:設(shè)置權(quán)限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
1:獲取布局
relativeLayout = (RelativeLayout) findViewById(R.id.layout_rl);
2:設(shè)置布局相關(guān)設(shè)置
// 獲取圖片某布局 relativeLayout.setDrawingCacheEnabled(true); relativeLayout.buildDrawingCache();
3.獲取圖片
final Bitmap bmp = relativeLayout.getDrawingCache(); // 獲取圖片 savePicture(bmp, "test.jpg");// 保存圖片
4:保存圖片
public void savePicture(Bitmap bm, String fileName) {
Log.i("xing", "savePicture: ------------------------");
if (null == bm) {
Log.i("xing", "savePicture: ------------------圖片為空------");
return;
}
File foder = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/test");
if (!foder.exists()) {
foder.mkdirs();
}
File myCaptureFile = new File(foder, fileName);
try {
if (!myCaptureFile.exists()) {
myCaptureFile.createNewFile();
}
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(myCaptureFile));
//壓縮保存到本地
bm.compress(Bitmap.CompressFormat.JPEG, 90, bos);
bos.flush();
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
Toast.makeText(this, "保存成功!", Toast.LENGTH_SHORT).show();
}
5:釋放資源
relativeLayout.destroyDrawingCache();
6、完整代碼如下
package com.adwan.savephototolocal;
import android.graphics.Bitmap;
import android.os.Environment;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.RelativeLayout;
import android.widget.Toast;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
public class MainActivity extends AppCompatActivity {
private RelativeLayout relativeLayout;
private Handler mHandler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
relativeLayout = (RelativeLayout) findViewById(R.id.layout_rl);
}
public void save(View view) {
initView();
}
private void initView() {
// 獲取圖片某布局
relativeLayout.setDrawingCacheEnabled(true);
relativeLayout.buildDrawingCache();
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
// 要在運行在子線程中
final Bitmap bmp = relativeLayout.getDrawingCache(); // 獲取圖片
savePicture(bmp, "test.jpg");// 保存圖片
relativeLayout.destroyDrawingCache(); // 保存過后釋放資源
}
},100);
}
public void savePicture(Bitmap bm, String fileName) {
Log.i("xing", "savePicture: ------------------------");
if (null == bm) {
Log.i("xing", "savePicture: ------------------圖片為空------");
return;
}
File foder = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/test");
if (!foder.exists()) {
foder.mkdirs();
}
File myCaptureFile = new File(foder, fileName);
try {
if (!myCaptureFile.exists()) {
myCaptureFile.createNewFile();
}
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(myCaptureFile));
//壓縮保存到本地
bm.compress(Bitmap.CompressFormat.JPEG, 90, bos);
bos.flush();
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
Toast.makeText(this, "保存成功!", Toast.LENGTH_SHORT).show();
}
}
三、總結(jié)
很顯然,如果利用保存布局的方式去解決這個問題,我們就算是第一次做,也用不到三十分鐘就能搞定,如果去用調(diào)用系統(tǒng)截屏的方案去解決的話,同樣是第一次做,估計一天也很危險,同時也會存在有很多未知的問題和局限性。
這個問題雖然很小,但是讓我收到的感觸確實很大。感觸就是在我們解決問題之前,一定要定義好自己的問題。就以這個問題,如果這個問題換個問法。保存布局,而不是截屏。估計我們每個人都能會想到以上的解決方案。所以在在我們定義問題的時候一定要完全弄明白是怎么回事兒。雖然同樣是可以解決問題,但是有可能會出現(xiàn)一些殺雞用牛刀的現(xiàn)象。問題的定義也就是數(shù)模的轉(zhuǎn)換。
第二就是處理問題一定要去做出幾個不同的預(yù)選備案,從而再去選擇一個嘴適合自己的去處理問題。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android編程讀取Assets所有文件(遍歷每一個文件夾)并存入sdcard的方法
這篇文章主要介紹了Android編程讀取Assets所有文件(遍歷每一個文件夾)并存入sdcard的方法,涉及Android針對文件與目錄的遍歷及I/O操作相關(guān)技巧,需要的朋友可以參考下2016-02-02
Android local.properties 文件讀取實例詳解
這篇文章主要介紹了Android local.properties 文件讀取實例詳解的相關(guān)資料,需要的朋友可以參考下2017-05-05

