Android實(shí)現(xiàn)將View轉(zhuǎn)化為圖片并保存到本地
本文實(shí)例為大家分享了Android將View轉(zhuǎn)化為圖片并保存到本地的具體代碼,供大家參考,具體內(nèi)容如下
一、概述
app中有需求需要將View轉(zhuǎn)化為圖片并保存到本地,這里分兩種情況:
1.View本身已經(jīng)顯示在界面上
2.View還沒(méi)有添加到界面上或者沒(méi)有顯示(繪制)過(guò)
二、實(shí)現(xiàn)方法
對(duì)于上述的第一種情況我使用下面代碼即可:
private void viewSaveToImage(View view) { ? ? ? ? view.setDrawingCacheEnabled(true); ? ? ? ? view.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH); ? ? ? ? view.setDrawingCacheBackgroundColor(Color.WHITE); ? ? ? ? // 把一個(gè)View轉(zhuǎn)換成圖片 ? ? ? ? Bitmap cachebmp = loadBitmapFromView(view); ? ? ? ? FileOutputStream fos; ? ? ? ? String imagePath = ""; ? ? ? ? try { ? ? ? ? ? ? // 判斷手機(jī)設(shè)備是否有SD卡 ? ? ? ? ? ? boolean isHasSDCard = Environment.getExternalStorageState().equals( ? ? ? ? ? ? ? ? ? ? android.os.Environment.MEDIA_MOUNTED); ? ? ? ? ? ? if (isHasSDCard) { ? ? ? ? ? ? ? ? // SD卡根目錄 ? ? ? ? ? ? ? ? File sdRoot = Environment.getExternalStorageDirectory(); ? ? ? ? ? ? ? ? File file = new File(sdRoot, Calendar.getInstance().getTimeInMillis()+".png"); ? ? ? ? ? ? ? ? fos = new FileOutputStream(file); ? ? ? ? ? ? ? ? imagePath = file.getAbsolutePath(); ? ? ? ? ? ? } else ? ? ? ? ? ? ? ? throw new Exception("創(chuàng)建文件失敗!"); ? ? ? ? ? ? cachebmp.compress(Bitmap.CompressFormat.PNG, 90, fos); ? ? ? ? ? ? fos.flush(); ? ? ? ? ? ? fos.close(); ? ? ? ? } catch (Exception e) { ? ? ? ? ? ? e.printStackTrace(); ? ? ? ? } ? ? ? ? LogUtil.e("imagePath="+imagePath); ? ? ? ? view.destroyDrawingCache(); ? ? } ? ? private Bitmap loadBitmapFromView(View v) { ? ? ? ? int w = v.getWidth(); ? ? ? ? int h = v.getHeight(); ? ? ? ? Bitmap bmp = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); ? ? ? ? Canvas c = new Canvas(bmp); ? ? ? ? c.drawColor(Color.WHITE); ? ? ? ? /** 如果不設(shè)置canvas畫(huà)布為白色,則生成透明 */ ? ? ? ? v.layout(0, 0, w, h); ? ? ? ? v.draw(c); ? ? ? ? return bmp; ?}
如果是第二種,還這樣使用的話,就會(huì)報(bào)錯(cuò)了,因?yàn)閂iew在添加到容器中之前并沒(méi)有得到實(shí)際的大小,所以首先需要指定View的大?。?/p>
DisplayMetrics metric = new DisplayMetrics(); ? ? ? ? ? ? ? ? ? ? getWindowManager().getDefaultDisplay().getMetrics(metric); ? ? ? ? ? ? ? ? ? ? int width = metric.widthPixels; ? ? // 屏幕寬度(像素) ? ? ? ? ? ? ? ? ? ? int height = metric.heightPixels; ? // 屏幕高度(像素) ? ? ? ? ? ? ? ? ? ? View mingpianView = LayoutInflater.from(this).inflate(R.layout.view_team_mingpian, null, false); ? ? ? ? ? ? ? ? ? ? layoutView(mingpianView, width, height);
//然后View和其內(nèi)部的子View都具有了實(shí)際大小,也就是完成了布局,相當(dāng)與添加到了界面上。接著就可以創(chuàng)建位圖并在上面繪制了: ? ? private void layoutView(View v, int width, int height) { ? ? ? ? // 整個(gè)View的大小 參數(shù)是左上角 和右下角的坐標(biāo) ? ? ? ? v.layout(0, 0, width, height); ? ? ? ? int measuredWidth = View.MeasureSpec.makeMeasureSpec(width, View.MeasureSpec.EXACTLY); ? ? ? ? int measuredHeight = View.MeasureSpec.makeMeasureSpec(10000, View.MeasureSpec.AT_MOST); ? ? ? ? /** 當(dāng)然,measure完后,并不會(huì)實(shí)際改變View的尺寸,需要調(diào)用View.layout方法去進(jìn)行布局。 ? ? ? ? ?* 按示例調(diào)用layout函數(shù)后,View的大小將會(huì)變成你想要設(shè)置成的大小。 ? ? ? ? ?*/ ? ? ? ? v.measure(measuredWidth, measuredHeight); ? ? ? ? v.layout(0, 0, v.getMeasuredWidth(), v.getMeasuredHeight()); ? ? }
然后再調(diào)用viewSaveToImage(mingpianView);方法即可。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android實(shí)現(xiàn)圓圈倒計(jì)時(shí)
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)圓圈倒計(jì)時(shí),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08Android使用FontMetrics對(duì)象計(jì)算位置坐標(biāo)
這篇文章主要為大家詳細(xì)介紹了Android使用FontMetrics對(duì)象計(jì)算位置坐標(biāo),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12Android Camera2實(shí)現(xiàn)最簡(jiǎn)單的預(yù)覽框顯示
這篇文章主要為大家詳細(xì)介紹了Android Camera2實(shí)現(xiàn)最簡(jiǎn)單的預(yù)覽框顯示,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05學(xué)習(xí)使用Material Design控件(二)使用DrawerLayout實(shí)現(xiàn)側(cè)滑菜單欄效果
這篇文章主要為大家介紹了學(xué)習(xí)使用Material Design控件的詳細(xì)教程,使用DrawerLayout和NavigationView實(shí)現(xiàn)側(cè)滑菜單欄效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07Android跨應(yīng)用啟動(dòng)實(shí)例詳解
這篇文章主要介紹了 Android跨應(yīng)用啟動(dòng)實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-04-04