Android中布局保存成圖片實(shí)例代碼
一、前言
有一個(gè)朋友問(wèn)做過(guò)截屏的小功能沒(méi),自己沒(méi)有做過(guò)。但是想了一下,實(shí)現(xiàn)的過(guò)程。實(shí)現(xiàn)截屏就是為了截取咱們應(yīng)用中的部分布局,然后實(shí)現(xiàn)將保存在本地,或?qū)⑵浞窒?,或?qū)⑵渫ㄟ^(guò)第三方的平臺(tái)分享出去。自己可能是受了截屏這兩個(gè)字的影響,想當(dāng)然的去梳理自己的實(shí)現(xiàn)思路。
1:截屏,調(diào)用系統(tǒng)的截屏功能區(qū)實(shí)現(xiàn)截屏。
2:對(duì)圖片進(jìn)行處理:截屏是截取的手機(jī)的全屏,因?yàn)槲覀兪切枰厝∥覀兊膽?yīng)用的某一部分,所以我們需要去通過(guò)剪切裁剪,去裁剪出自己想要保留的一部分(實(shí)質(zhì)也就是保存布局)。
3:后續(xù)也許還要處理系統(tǒng)截屏功能本身所有的分享等其他的功能。反正就是會(huì)有各種問(wèn)題。
上面有一個(gè)詞兒是“保存布局”。意思就是將我們的布局保存成為圖片。我聽(tīng)到這個(gè)之后,今天到公司的第一件事兒就是自己去實(shí)現(xiàn)一下所謂的截屏這個(gè)功能。
二、實(shí)現(xiàn)流程以及實(shí)現(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() { // 要在運(yùn)行在子線程中 final Bitmap bmp = relativeLayout.getDrawingCache(); // 獲取圖片 savePicture(bmp, "test.jpg");// 保存圖片 relativeLayout.destroyDrawingCache(); // 保存過(guò)后釋放資源 } },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é)
很顯然,如果利用保存布局的方式去解決這個(gè)問(wèn)題,我們就算是第一次做,也用不到三十分鐘就能搞定,如果去用調(diào)用系統(tǒng)截屏的方案去解決的話,同樣是第一次做,估計(jì)一天也很危險(xiǎn),同時(shí)也會(huì)存在有很多未知的問(wèn)題和局限性。
這個(gè)問(wèn)題雖然很小,但是讓我收到的感觸確實(shí)很大。感觸就是在我們解決問(wèn)題之前,一定要定義好自己的問(wèn)題。就以這個(gè)問(wèn)題,如果這個(gè)問(wèn)題換個(gè)問(wèn)法。保存布局,而不是截屏。估計(jì)我們每個(gè)人都能會(huì)想到以上的解決方案。所以在在我們定義問(wèn)題的時(shí)候一定要完全弄明白是怎么回事兒。雖然同樣是可以解決問(wèn)題,但是有可能會(huì)出現(xiàn)一些殺雞用牛刀的現(xiàn)象。問(wèn)題的定義也就是數(shù)模的轉(zhuǎn)換。
第二就是處理問(wèn)題一定要去做出幾個(gè)不同的預(yù)選備案,從而再去選擇一個(gè)嘴適合自己的去處理問(wèn)題。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
利用Jetpack?Compose實(shí)現(xiàn)繪制五角星效果
這篇文章主要為大家介紹了Jetpack?Compose如何使用自定義操作符實(shí)現(xiàn)繪制五角星效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-04-04Android實(shí)現(xiàn)App中導(dǎo)航Tab欄懸浮的功能
相信大家在玩手機(jī)的過(guò)程中應(yīng)該會(huì)注意到很多的app都有這種功能,比如說(shuō)外賣(mài)達(dá)人常用的“餓了么”。所以這篇文章給大家分享了Android如何實(shí)現(xiàn)app中的導(dǎo)航Tab欄懸浮的功能,有需要的朋友們可以參考借鑒。2016-10-10Android自定義scrollview實(shí)現(xiàn)回彈效果
這篇文章主要為大家詳細(xì)介紹了Android自定義scrollview實(shí)現(xiàn)回彈效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04Android recyclerview實(shí)現(xiàn)縱向虛線時(shí)間軸的示例代碼
本文主要介紹了Android recyclerview實(shí)現(xiàn)縱向虛線時(shí)間軸的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07Android WebView 應(yīng)用界面開(kāi)發(fā)教程
WebView組件本身就是一個(gè)瀏覽器實(shí)現(xiàn),開(kāi)發(fā)者可以直接在WebView中使用聚合(Polymer)和Material設(shè)計(jì)。接下來(lái)通過(guò)本文給大家介紹Android WebView 應(yīng)用界面開(kāi)發(fā)教程,一起看下吧2016-08-08Eclipse+ADT+Android SDK搭建安卓開(kāi)發(fā)環(huán)境的實(shí)現(xiàn)步驟
這篇文章主要介紹了Eclipse+ADT+Android SDK搭建安卓開(kāi)發(fā)環(huán)境的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09Android中自定義控件的declare-styleable屬性重用方案
這篇文章主要介紹了Android中自定義控件的declare-styleable屬性重用方案,本文給出了一個(gè)終極重用解決方案,需要的朋友可以參考下2015-01-01Android編程使用Fragment界面向下跳轉(zhuǎn)并一級(jí)級(jí)返回的實(shí)現(xiàn)方法
這篇文章主要介紹了Android編程使用Fragment界面向下跳轉(zhuǎn)并一級(jí)級(jí)返回的實(shí)現(xiàn)方法,較為詳細(xì)的分析了Fragment界面跳轉(zhuǎn)所涉及的相關(guān)知識(shí)點(diǎn)與實(shí)現(xiàn)技巧,并附帶了完整的實(shí)例代碼供讀者下載參考,需要的朋友可以參考下2015-10-10Android仿新浪微博自定義ListView下拉刷新(4)
這篇文章主要為大家詳細(xì)介紹了Android仿新浪微博自定義ListView下拉刷新,重點(diǎn)介紹了Adapter的詳細(xì)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11