日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > Android >内容正文

Android

Android仿简历生成图片功能,Android 根据View生成图片简易参考

發(fā)布時(shí)間:2024/3/26 Android 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android仿简历生成图片功能,Android 根据View生成图片简易参考 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、分類

開(kāi)發(fā)中,我們有時(shí)候需要根據(jù)View生成圖片。

本文根據(jù)不同情況的View生成圖片進(jìn)行了一些示例,分類如下

第一種,普通View生成圖片(view已經(jīng)渲染加載到界面上)

第二種,無(wú)中生有,通過(guò)java代碼創(chuàng)建的或者inflate創(chuàng)建

第三種,WebView 生成圖片

第四種,ScrollView 生成圖片

第五種,ListView 生成圖片

第六種,RecyclerView 生成圖片

還是圖來(lái)的直接

shot.gif

核心代碼

public class SimpleUtils {

/**

* 將 Bitmap 保存到SD卡

* @param context

* @param mybitmap

* @param name

* @return

*/

public static boolean saveBitmapToSdCard(Context context, Bitmap mybitmap, String name){

boolean result = false;

//創(chuàng)建位圖保存目錄

String path = Environment.getExternalStorageDirectory() + "/1000ttt/";

File sd = new File(path);

if (!sd.exists()){

sd.mkdir();

}

File file = new File(path+name+".jpg");

FileOutputStream fileOutputStream = null;

if (!file.exists()){

try {

// 判斷SD卡是否存在,并且是否具有讀寫權(quán)限

if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){

fileOutputStream = new FileOutputStream(file);

mybitmap.compress(Bitmap.CompressFormat.JPEG,100,fileOutputStream);

fileOutputStream.flush();

fileOutputStream.close();

//update gallery

Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);

Uri uri = Uri.fromFile(file);

intent.setData(uri);

context.sendBroadcast(intent);

Toast.makeText(context, "保存成功", Toast.LENGTH_SHORT).show();

result = true;

}

else{

Toast.makeText(context, "不能讀取到SD卡", Toast.LENGTH_SHORT).show();

}

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

return result;

}

/**

* 手動(dòng)測(cè)量擺放View

* 對(duì)于手動(dòng) inflate 或者其他方式代碼生成加載的View進(jìn)行測(cè)量,避免該View無(wú)尺寸

* @param v

* @param width

* @param height

*/

public static 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());

}

public static int px2dip(Context context, float pxValue) {

final float scale = context.getResources().getDisplayMetrics().density;

return (int) (pxValue / scale + 0.5f);

}

/**

* 獲取一個(gè) View 的緩存視圖

* (前提是這個(gè)View已經(jīng)渲染完成顯示在頁(yè)面上)

* @param view

* @return

*/

public static Bitmap getCacheBitmapFromView(View view) {

final boolean drawingCacheEnabled = true;

view.setDrawingCacheEnabled(drawingCacheEnabled);

view.buildDrawingCache(drawingCacheEnabled);

final Bitmap drawingCache = view.getDrawingCache();

Bitmap bitmap;

if (drawingCache != null) {

bitmap = Bitmap.createBitmap(drawingCache);

view.setDrawingCacheEnabled(false);

} else {

bitmap = null;

}

return bitmap;

}

/**

* 對(duì)ScrollView進(jìn)行截圖

* @param scrollView

* @return

*/

public static Bitmap shotScrollView(ScrollView scrollView) {

int h = 0;

Bitmap bitmap = null;

for (int i = 0; i < scrollView.getChildCount(); i++) {

h += scrollView.getChildAt(i).getHeight();

scrollView.getChildAt(i).setBackgroundColor(Color.parseColor("#ffffff"));

}

bitmap = Bitmap.createBitmap(scrollView.getWidth(), h, Bitmap.Config.RGB_565);

final Canvas canvas = new Canvas(bitmap);

scrollView.draw(canvas);

return bitmap;

}

/**

* 對(duì)ListView進(jìn)行截圖

* http://stackoverflow.com/questions/12742343/android-get-screenshot-of-all-listview-items

*/

public static Bitmap shotListView(ListView listview) {

ListAdapter adapter = listview.getAdapter();

int itemscount = adapter.getCount();

int allitemsheight = 0;

List bmps = new ArrayList();

for (int i = 0; i < itemscount; i++) {

View childView = adapter.getView(i, null, listview);

childView.measure(

View.MeasureSpec.makeMeasureSpec(listview.getWidth(), View.MeasureSpec.EXACTLY),

View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));

childView.layout(0, 0, childView.getMeasuredWidth(), childView.getMeasuredHeight());

childView.setDrawingCacheEnabled(true);

childView.buildDrawingCache();

bmps.add(childView.getDrawingCache());

allitemsheight += childView.getMeasuredHeight();

}

Bitmap bigbitmap =

Bitmap.createBitmap(listview.getMeasuredWidth(), allitemsheight, Bitmap.Config.ARGB_8888);

Canvas bigcanvas = new Canvas(bigbitmap);

Paint paint = new Paint();

int iHeight = 0;

for (int i = 0; i < bmps.size(); i++) {

Bitmap bmp = bmps.get(i);

bigcanvas.drawBitmap(bmp, 0, iHeight, paint);

iHeight += bmp.getHeight();

bmp.recycle();

bmp = null;

}

return bigbitmap;

}

/**

* 對(duì)RecyclerView進(jìn)行截圖

* https://gist.github.com/PrashamTrivedi/809d2541776c8c141d9a

*/

public static Bitmap shotRecyclerView(RecyclerView view) {

RecyclerView.Adapter adapter = view.getAdapter();

Bitmap bigBitmap = null;

if (adapter != null) {

int size = adapter.getItemCount();

int height = 0;

Paint paint = new Paint();

int iHeight = 0;

final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);

// Use 1/8th of the available memory for this memory cache.

final int cacheSize = maxMemory / 8;

LruCache bitmaCache = new LruCache<>(cacheSize);

for (int i = 0; i < size; i++) {

RecyclerView.ViewHolder holder = adapter.createViewHolder(view, adapter.getItemViewType(i));

adapter.onBindViewHolder(holder, i);

holder.itemView.measure(

View.MeasureSpec.makeMeasureSpec(view.getWidth(), View.MeasureSpec.EXACTLY),

View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));

holder.itemView.layout(0, 0, holder.itemView.getMeasuredWidth(),

holder.itemView.getMeasuredHeight());

holder.itemView.setDrawingCacheEnabled(true);

holder.itemView.buildDrawingCache();

Bitmap drawingCache = holder.itemView.getDrawingCache();

if (drawingCache != null) {

bitmaCache.put(String.valueOf(i), drawingCache);

}

height += holder.itemView.getMeasuredHeight();

}

bigBitmap = Bitmap.createBitmap(view.getMeasuredWidth(), height, Bitmap.Config.ARGB_8888);

Canvas bigCanvas = new Canvas(bigBitmap);

Drawable lBackground = view.getBackground();

if (lBackground instanceof ColorDrawable) {

ColorDrawable lColorDrawable = (ColorDrawable) lBackground;

int lColor = lColorDrawable.getColor();

bigCanvas.drawColor(lColor);

}

for (int i = 0; i < size; i++) {

Bitmap bitmap = bitmaCache.get(String.valueOf(i));

bigCanvas.drawBitmap(bitmap, 0f, iHeight, paint);

iHeight += bitmap.getHeight();

bitmap.recycle();

}

}

return bigBitmap;

}

}

核心代碼都在上面了,下面開(kāi)始分析。

二、普通View

普通View,在本文中就是已經(jīng)繪制到界面的View。

Paste_Image.png

如上,點(diǎn)擊截取View,并且我們會(huì)生成圖片顯示保存到sd卡

普通View生成圖片參考代碼

/**

* 獲取一個(gè) View 的緩存視圖

* (前提是這個(gè)View已經(jīng)渲染完成顯示在頁(yè)面上)

* @param view

* @return

*/

public static Bitmap getCacheBitmapFromView(View view) {

final boolean drawingCacheEnabled = true;

view.setDrawingCacheEnabled(drawingCacheEnabled);

view.buildDrawingCache(drawingCacheEnabled);

final Bitmap drawingCache = view.getDrawingCache();

Bitmap bitmap;

if (drawingCache != null) {

bitmap = Bitmap.createBitmap(drawingCache);

view.setDrawingCacheEnabled(false);

} else {

bitmap = null;

}

return bitmap;

}

.

.

.

至于保存Bitmap到sd卡操作,雖然常見(jiàn)一些,代碼還是附在頂部工具類了。

三、代碼加載但是未顯示在界面的View

inf.gif

有一些View,我們是通過(guò)代碼加載出來(lái)的,但是沒(méi)有加載界面上,我們也可以對(duì)這種View生成圖片。

什么?既然沒(méi)有顯示在界面上,那還要加載來(lái)干嘛?

此言差矣,用處還是有的,YY即可。

如圖,按下截圖按鈕,我們做的主要邏輯如下:

// 本View是inflate加載而來(lái),不是Activity的xml本身的

View view = getLayoutInflater().inflate(R.layout.item_group,null);

ImageView mtv = (ImageView) view.findViewById(R.id.mIv);

ViewGroup.LayoutParams upPartLayoutParams = mtv.getLayoutParams();

int upPartMeasureHeight = View.MeasureSpec.makeMeasureSpec(upPartLayoutParams.height, View.MeasureSpec.EXACTLY);

mtv.setImageDrawable(getResources().getDrawable(R.drawable.ccc));

// 沒(méi)有顯示到界面上的view本身無(wú)大小可言,所以我們要手動(dòng)指定一下

SimpleUtils.layoutView(mtv,upPartMeasureHeight,upPartMeasureHeight);

// View生成截圖

Bitmap cacheBitmapFromView = SimpleUtils.getCacheBitmapFromView(mtv);

mIvResult.setImageBitmap(cacheBitmapFromView);

// 保存bitmap到sd卡

SimpleUtils.saveBitmapToSdCard(StyleTwoActivity.this,cacheBitmapFromView,"styleTwo");

.

.

.

代碼中,我們看到,我們按下截圖,inflate加載一個(gè)簡(jiǎn)單布局文件

android:orientation="vertical"

android:layout_width="200px"

android:layout_height="200px"

>

android:id="@+id/mIv"

android:layout_width="200px"

android:layout_height="200px"

android:background="#623512"

android:text="哇阿斯達(dá)撒大聲地哈哈哈就是這樣的按到"

android:textColor="#ffffff"

android:textSize="20sp"

/>

我們看到,里面就是一個(gè)ImagView,我們待會(huì)就是要給這個(gè)ImageView 設(shè)置一張圖片,然后對(duì)這個(gè)View進(jìn)行生成圖片,但是注意,這個(gè)ImageView從始至終都是沒(méi)有顯示在界面上的。

Paste_Image.png

這個(gè)ImageView并沒(méi)有加載到布局。我們想直接調(diào)用正常View的生成圖片方法,但是如果這樣會(huì)生成圖片失敗。

因?yàn)閯倓俰nflate的View是沒(méi)有經(jīng)過(guò)measure和layout的,沒(méi)有大小,所有我們需要指定一下大小。

所以我們調(diào)用layoutView方法指定大小

/**

* 手動(dòng)測(cè)量擺放View

* 對(duì)于手動(dòng) inflate 或者其他方式代碼生成加載的View進(jìn)行測(cè)量,避免該View無(wú)尺寸

* @param v

* @param width

* @param height

*/

public static 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());

}

public static int px2dip(Context context, float pxValue) {

final float scale = context.getResources().getDisplayMetrics().density;

return (int) (pxValue / scale + 0.5f);

}

有了大小,就可以生成圖片了。

四、WebView、ScrollView、ListView和RecyclerView

其實(shí)在開(kāi)篇的工具類都已經(jīng)介紹了,就不一一說(shuō)了。直接把demo的代碼一下就差不多了。

四.1、WebView 生成圖片

@RuntimePermissions

public class WebShotActivity extends BaseActivity {

private WebView mWeb;

private ImageView mIvResult;

@Override

protected void onCreate(@Nullable Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_web);

mWeb = (WebView) findViewById(R.id.mWeb);

mIvResult = (ImageView) findViewById(R.id.mIvResult);

mWeb.setDrawingCacheEnabled(true);

//支持javascript

mWeb.getSettings().setJavaScriptEnabled(true);

mWeb.getSettings().setUseWideViewPort(true);

mWeb.getSettings().setLoadWithOverviewMode(true);

//支持頁(yè)面縮放

//webView.getSettings().setBuiltInZoomControls(true);

//提升渲染優(yōu)先級(jí)

//webView.getSettings().setRenderPriority(WebSettings.RenderPriority.HIGH);

//不加載網(wǎng)絡(luò)中的圖片資源

//webView.getSettings().setBlockNetworkImage(true);

//HTML5 Cache

//*mWeb.getSettings().setDomStorageEnabled(true);

mWeb.getSettings().setAllowFileAccess(true);

mWeb.getSettings().setAppCacheEnabled(true);

//優(yōu)先從本地cache中載入,其次才是從網(wǎng)絡(luò)中載入,即使內(nèi)容已經(jīng)過(guò)期*//*

mWeb.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);

mWeb.setWebViewClient(new WebViewClient() {

@Override

public boolean shouldOverrideUrlLoading(WebView view, String url) {

view.loadUrl(url);

return super.shouldOverrideUrlLoading(view, url);

}

@Override

public void onPageStarted(WebView view, String url, Bitmap favicon) {

super.onPageStarted(view, url, favicon);

}

@Override

public void onPageFinished(WebView view, String url) {

super.onPageFinished(view, url);

}

@Override

public boolean shouldOverrideKeyEvent(WebView view, KeyEvent event) {

//Android TV中可以在這里返回true,按鍵交由onKeyDown方法處理

return super.shouldOverrideKeyEvent(view, event);

}

@Override

public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {

super.onReceivedError(view, errorCode, description, failingUrl);

}

});

mWeb.setWebChromeClient(new WebChromeClient() {

@Override

public void onProgressChanged(WebView view, int newProgress) {

super.onProgressChanged(view, newProgress);

}

@Override

public void onReceivedTitle(WebView view, String title) {

super.onReceivedTitle(view, title);

}

});

mWeb.loadUrl("https://m.baidu.com/?from=844b&vit=fps");

findViewById(R.id.mTvShot).setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

WebShotActivityPermissionsDispatcher.storageNeedWithCheck(WebShotActivity.this);

}

});

}

@NeedsPermission({Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE})

void storageNeed() {

int viewWidth = mWeb.getMeasuredWidth();

int viewHeight = mWeb.getMeasuredHeight();

if (viewWidth > 0 && viewHeight > 0) {

Bitmap b = Bitmap.createBitmap(viewWidth, viewHeight, Bitmap.Config.RGB_565);

Canvas cvs = new Canvas(b);

mWeb.draw(cvs);

mIvResult.setImageBitmap(b);

SimpleUtils.saveBitmapToSdCard(WebShotActivity.this,b,"styleWeb");

}

}

@OnShowRationale({Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE})

void storageRationale(final PermissionRequest request) {

showRationaleDialog("存儲(chǔ)權(quán)限是本程序必不可少的權(quán)限,請(qǐng)開(kāi)啟",request);

}

@OnPermissionDenied({Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE})

void storageDenied() {

openAppSetting("您拒絕了存儲(chǔ)權(quán)限,請(qǐng)授權(quán)");

}

@OnNeverAskAgain({Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE})

void storageAsk() {

openAppSetting("您拒絕了存儲(chǔ)權(quán)限,請(qǐng)授權(quán)");

}

}

代碼稍微長(zhǎng)了一下,是因?yàn)樽隽舜鎯?chǔ)權(quán)限檢查和一些WebView的配置,我們?cè)摵雎缘暮雎?#xff0c;核心就是傳入WebView生成圖片那么一句而已。

.

.

.

四.2、ScrollView 生成圖片

Paste_Image.png

public class StyleScrollView extends BaseActivity {

private ImageView mIvRet;

private ScrollView mScrollView;

@Override

protected void onCreate(@Nullable Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_scroll);

mIvRet = (ImageView) findViewById(R.id.mIvRet);

mScrollView = (ScrollView) findViewById(R.id.mScrollView);

findViewById(R.id.mTvShot).setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

Bitmap bitmap = SimpleUtils.shotScrollView(mScrollView);

mIvRet.setImageBitmap(bitmap);

}

});

}

}

四.3、ListView 生成圖片

Paste_Image.png

public class StyleLvActivity extends BaseActivity {

private ListView mLv;

private ImageView mIvRet;

@Override

protected void onCreate(@Nullable Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_lv);

mLv = (ListView) findViewById(R.id.mLv);

mLv.setAdapter(new MyAdapter());

mIvRet = (ImageView) findViewById(R.id.mIvRet);

findViewById(R.id.mTvShot).setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

Bitmap bitmap = SimpleUtils.shotListView(mLv);

mIvRet.setImageBitmap(bitmap);

}

});

}

class MyAdapter extends BaseAdapter{

@Override

public int getCount() {

return 10;

}

@Override

public Object getItem(int i) {

return null;

}

@Override

public long getItemId(int i) {

return 0;

}

@Override

public View getView(int i, View view, ViewGroup viewGroup) {

// 簡(jiǎn)答粗暴了一些,只是為演示

View vi = getLayoutInflater().inflate(R.layout.item_lv,null);

TextView textView = (TextView) vi.findViewById(R.id.mTv);

textView.setText(i+"");

return vi;

}

}

}

.

.

.

四.4、RecyclerView 生成圖片

Paste_Image.png

public class StyleRecyclerView extends BaseActivity {

private RecyclerView mRecycler;

private ImageView mIvRet;

private List mDatas;

private TestAdapter mAdapter;

@Override

protected void onCreate(@Nullable Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_rv);

initData();

mRecycler = (RecyclerView) findViewById(R.id.mRecycler);

mRecycler.setLayoutManager(new LinearLayoutManager(this));

mRecycler.setAdapter(mAdapter = new TestAdapter());

mIvRet = (ImageView) findViewById(R.id.mIvRet);

findViewById(R.id.mTvShot).setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

Bitmap bitmap = SimpleUtils.shotRecyclerView(mRecycler);

mIvRet.setImageBitmap(bitmap);

}

});

}

private void initData()

{

mDatas = new ArrayList();

DataBean dataBean = null;

for (int i = 0; i < 6; i++)

{

dataBean = new DataBean();

dataBean.title = "標(biāo)題  "+i;

dataBean.desc = "描述一下  "+i;

mDatas.add(dataBean);

}

}

class TestAdapter extends RecyclerView.Adapter{

// 孩子數(shù)

@Override

public int getItemCount() {

return mDatas.size();

}

// 創(chuàng)建視圖

@Override

public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

MyViewHolder myViewHolder = new MyViewHolder(LayoutInflater.from(StyleRecyclerView.this)

.inflate(R.layout.item_rv,parent, false));

return myViewHolder;

}

// 綁定視圖視圖 以前getView的事情 關(guān)鍵方法

@Override

public void onBindViewHolder(MyViewHolder holder, int position) {

DataBean dataBean = mDatas.get(position);

holder.mTvTitle.setText(dataBean.title);

holder.mTvDesc.setText(dataBean.desc);

}

// 必須實(shí)現(xiàn)的Holder

class MyViewHolder extends RecyclerView.ViewHolder

{

TextView mTvTitle;

TextView mTvDesc;

public MyViewHolder(View itemView) {

super(itemView);

mTvTitle = (TextView) itemView.findViewById(R.id.mTvTitle);

mTvDesc = (TextView) itemView.findViewById(R.id.mTvDesc);

}

}

}

}

如上,這么一些類型就介紹完了。

本篇完。

參考

總結(jié)

以上是生活随笔為你收集整理的Android仿简历生成图片功能,Android 根据View生成图片简易参考的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。