将view保存成图片,默认存储于sdcard/0/目录下
ViewUtils
package com.zhangyu.viewimage;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import androidx.annotation.NonNull;
import java.io.File;
import java.io.FileOutputStream;
public class ViewUtils {
private static final String TAG = "ViewUtils";
/**
* 将View保存到指定的文件中
*
* @param view 选定的view
* @return 保存到文件地址
*/
public static File view2File(View view) {
String dir = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "0";
if (!new File(dir).exists()) {
new File(dir).mkdirs();
}
String filePath = new File(dir, "view_" + System.currentTimeMillis() + ".png").getAbsolutePath();
return view2File(view, filePath);
}
/**
* 将view生成图片保存在默认的路径中(磁盘的根目录下)
*
* @param view 选择的view
* @return 最后保存的文件路径
*/
public static File view2File(View view, @NonNull String dstPath) {
// 把一个View转换成图片
Bitmap cachebmp = view2Bitmap(view);
FileOutputStream fos;
try {
// 判断手机设备是否有SD卡
boolean isHasSDCard = Environment.getExternalStorageState().equals(
android.os.Environment.MEDIA_MOUNTED);
Log.d(TAG, "isHasSDCard: " + isHasSDCard);
if (isHasSDCard) {
fos = new FileOutputStream(dstPath);
} else {
throw new Exception("创建文件失败!");
}
cachebmp.compress(Bitmap.CompressFormat.PNG, 100, fos);
fos.flush();
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
Log.e(TAG, "dstPath: " + dstPath);
return new File(dstPath);
}
/**
* 将view生成一个bitmap
*
* @param v 选定的view
* @return 生成的bitmap
*/
public static Bitmap view2Bitmap(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);
//不设置canvas颜色,则生成透明背景
//c.drawColor(Color.WHITE);
v.draw(c);
return bmp;
}
}
Activity(注意要动态授予读写磁盘的权限)
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
private void initView() {
tvHello = (TextView) findViewById(R.id.tv_hello);
tvHello.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
File file = ViewUtils.view2File(tvHello);
Log.e(TAG, "file: " + file.getAbsolutePath());
}
});
}