Android将自定义View保存为Bitmap图片

news/2025/2/19 12:25:53/

Android将自定义View保存为Bitmap图片

 private void createPdfImg() {//创建待分享的viewView view = LayoutInflater.from(getContext()).inflate(R.layout.ecg_pdf_view, null);PdfEcgWaveView waveView = view.findViewById(R.id.ecg_wave_view2);PdfEcgWaveView.DATA_PRE_SECOND = sampleRate;getAndSavePdfImg(view, waveView, 1);}int page;// 分页private void getAndSavePdfImg(View view, PdfEcgWaveView waveView, int i) {waveView.setGain(gain);waveView.setPagerSpeed(paperSpeed + 1);Log.d("列表大小", ecgWaveList.size() + "");//采样率是512个数据/秒,我们取8秒生成一张图,从而得到512*8=4096int dataSize = sampleRate * 8;page = (int) Math.ceil((double) ecgWaveList.size() / dataSize);List<Float> pdfItem = new ArrayList<>();for (int j = 0; j < page; j++) {pdfItem.clear();for (int k = j * dataSize; k < dataSize + dataSize * j; k++) {if (k < ecgWaveList.size()) {pdfItem.add(ecgWaveList.get(k));}}waveView.preparePoints(pdfItem);layoutView(view, waveView, pdfItem);getAndSaveBitmap(view, j);}Log.d("ecgsize", ecgWaveList.size() + "");}protected void layoutView(View v, PdfEcgWaveView waveView, List<Float> ecgItem) {int a = (int) (sampleRate * 8 * ecgWaveView.getDataSpacing());Log.d("viewSize", ecgItem.size() + "");Log.e("bitmap", "a=" + a + "-dataSpacing=" + ecgWaveView.getDataSpacing() + "-sampleRate=" + sampleRate);v.layout(0, 0, a, SizeUtils.dp2px(180));int measuredWidth = View.MeasureSpec.makeMeasureSpec(a, View.MeasureSpec.EXACTLY);int measuredHeight = View.MeasureSpec.makeMeasureSpec(SizeUtils.dp2px(180), View.MeasureSpec.EXACTLY);v.measure(measuredWidth, measuredHeight);v.layout(0, 0, v.getMeasuredWidth(), v.getMeasuredHeight());}/*** 创建和保存bitmap*/protected void getAndSaveBitmap(View v, int i) {Log.e("bitmap","width="+v.getWidth()+"height="+v.getHeight());Bitmap bitmap = Bitmap.createBitmap(v.getWidth(), v.getHeight(),Bitmap.Config.ARGB_8888);// 利用bitmap生成画布Canvas canvas = new Canvas(bitmap);// 把view中的内容绘制在画布上v.draw(canvas);saveBitmap(bitmap, i);}/*** 保存并压缩图片** @param bitmap*/public void saveBitmap(Bitmap bitmap, int i) {Log.d("hehe", "保存图片");singleThreadExecutor.execute(new Runnable() {@Overridepublic void run() {String path = Constants.PDF_IMG_ROTE_PATH + "/img" + i + ".png";File file = new File(path);try {FileOutputStream stream = new FileOutputStream(file);//压缩图片bitmap.compress(Bitmap.CompressFormat.JPEG, 80, stream);//释放资源stream.flush();stream.close();} catch (Exception e) {disProgressDialog();ToastUtil.showLongToast(StringUtils.getString(R.string.failed_report));Log.d("hehe", e.getLocalizedMessage());}}});}

exg_pdf_view.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:background="@color/write"android:layout_height="@dimen/dp_200"><com.kl.commonbase.views.ecg.EcgBackgroundViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:background="@color/write"app:largeGridColor="#ff0022"app:smallGridColor="#ff0033" /><com.kl.commonbase.views.ecg.PdfEcgWaveViewandroid:id="@+id/ecg_wave_view2"android:layout_width="wrap_content"android:layout_height="@dimen/dp_200"app:scrollable="true"app:waveColor="@color/black"app:waveStrokeWidth="@dimen/dp_1" />
</FrameLayout>

http://www.ppmy.cn/news/1300371.html

相关文章

2023年全国职业院校技能大赛(高职组)“云计算应用”赛项赛卷⑨

2023年全国职业院校技能大赛&#xff08;高职组&#xff09; “云计算应用”赛项赛卷9 目录 需要竞赛软件包环境以及备赛资源可私信博主&#xff01;&#xff01;&#xff01; 2023年全国职业院校技能大赛&#xff08;高职组&#xff09; “云计算应用”赛项赛卷9 模块一 …

Qt 窗口阴影边框

环境&#xff1a;Qt 5.15 VS2019 方法一&#xff1a;QGraphicsDropShadowEffect 实现方法参考链接&#xff1a;https://blog.csdn.net/goforwardtostep/article/details/99549750 使用此方法添加窗口阴影&#xff0c;会出现警告信息&#xff1a; 且窗口最大化与还原切换时会…

如何使用宝塔面板部署Inis博客并实现无公网ip环境远程访问

文章目录 前言1. Inis博客网站搭建1.1. Inis博客网站下载和安装1.2 Inis博客网站测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2 Cpolar稳定隧道&#xff08;云端设置&#xff09;2.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 3. 公网访问测试总…

kubernetes(一)概述与架构

云原生实战 语雀 官网 Kubernetes 文档 | Kubernetes 更新&#xff1a;移除 Dockershim 的常见问题 | Kubernetes B站课程&#xff1a;https://www.bilibili.com/video/BV13Q4y1C7hS/?p26 1.概述 概述 | Kubernetes 大规模容器编排系统 kubernetes具有以下特性&#xf…

Android - 串口通讯(SerialPort)

最早的博客Android 模拟串口通信过程_launch virtual serial port driver pro-CSDN博客里就是用过 Google 提供的 demo&#xff0c;最近想再写个其他的demo发现用起来有点麻烦&#xff0c;还需要导入其他 module&#xff0c;因此在网上找到了Android-SerialPort-API: https://g…

QT中的颜色如何表示?

使用预定义的颜色名称 QT 提供了一些预定义的颜色值&#xff0c;以下是其中一些常用的预定义颜色值&#xff1a; Qt::black: 黑色 Qt::white: 白色 Qt::red: 红色 Qt::green: 绿色 Qt::blue: 蓝色 Qt::cyan: 青色 Qt::magenta: 洋红色 Qt::yellow: 黄色 Qt::gray: 灰色 Qt::d…

2023年全国职业院校技能大赛(高职组)“云计算应用”赛项赛卷⑧

2023年全国职业院校技能大赛&#xff08;高职组&#xff09; “云计算应用”赛项赛卷8 目录 需要竞赛软件包环境以及备赛资源可私信博主&#xff01;&#xff01;&#xff01; 2023年全国职业院校技能大赛&#xff08;高职组&#xff09; “云计算应用”赛项赛卷8 模块一 …

【Vue技巧】Vue2和Vue3组件上使用v-model的实现原理

ChatGPT4.0国内站点&#xff0c;支持GPT4 Vision 视觉模型&#xff1a;海鲸AI 在Vue中&#xff0c;v-model 是一个语法糖&#xff0c;用于在输入框、选择框等表单元素上创建双向数据绑定。当你在自定义组件中实现 v-model 功能时&#xff0c;你需要理解它背后的原理&#xff1a…