热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

Android中布局保存成图片实例代码

一、前言 有一个朋友问做过截屏的小功能没,自己没有做过。但是想了一下,实现的过程。实现截屏就是为了截取咱们应用中的部分布局,然后实现将保存

一、前言

有一个朋友问做过截屏的小功能没,自己没有做过。但是想了一下,实现的过程。实现截屏就是为了截取咱们应用中的部分布局,然后实现将保存在本地,或将其分享,或将其通过第三方的平台分享出去。自己可能是受了截屏这两个字的影响,想当然的去梳理自己的实现思路。

1:截屏,调用系统的截屏功能区实现截屏。

2:对图片进行处理:截屏是截取的手机的全屏,因为我们是需要截取我们的应用的某一部分,所以我们需要去通过剪切裁剪,去裁剪出自己想要保留的一部分(实质也就是保存布局)。

3:后续也许还要处理系统截屏功能本身所有的分享等其他的功能。反正就是会有各种问题。

上面有一个词儿是“保存布局”。意思就是将我们的布局保存成为图片。我听到这个之后,今天到公司的第一件事儿就是自己去实现一下所谓的截屏这个功能。

二、实现流程以及实现代码

0:设置权限


1:获取布局

relativeLayout = (RelativeLayout) findViewById(R.id.layout_rl);

2:设置布局相关设置

 // 获取图片某布局
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() {
        // 要在运行在子线程中
        final Bitmap bmp = relativeLayout.getDrawingCache(); // 获取图片
        savePicture(bmp, "test.jpg");// 保存图片
        relativeLayout.destroyDrawingCache(); // 保存过后释放资源
      }
    },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();

  }

}

三、总结

很显然,如果利用保存布局的方式去解决这个问题,我们就算是第一次做,也用不到三十分钟就能搞定,如果去用调用系统截屏的方案去解决的话,同样是第一次做,估计一天也很危险,同时也会存在有很多未知的问题和局限性。

这个问题虽然很小,但是让我收到的感触确实很大。感触就是在我们解决问题之前,一定要定义好自己的问题。就以这个问题,如果这个问题换个问法。保存布局,而不是截屏。估计我们每个人都能会想到以上的解决方案。所以在在我们定义问题的时候一定要完全弄明白是怎么回事儿。虽然同样是可以解决问题,但是有可能会出现一些杀鸡用牛刀的现象。问题的定义也就是数模的转换。

第二就是处理问题一定要去做出几个不同的预选备案,从而再去选择一个嘴适合自己的去处理问题。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • 本文介绍如何在 Android 中通过代码模拟用户的点击和滑动操作,包括参数说明、事件生成及处理逻辑。详细解析了视图(View)对象、坐标偏移量以及不同类型的滑动方式。 ... [详细]
  • 深入理解OAuth认证机制
    本文介绍了OAuth认证协议的核心概念及其工作原理。OAuth是一种开放标准,旨在为第三方应用提供安全的用户资源访问授权,同时确保用户的账户信息(如用户名和密码)不会暴露给第三方。 ... [详细]
  • 本文总结了2018年的关键成就,包括职业变动、购车、考取驾照等重要事件,并分享了读书、工作、家庭和朋友方面的感悟。同时,展望2019年,制定了健康、软实力提升和技术学习的具体目标。 ... [详细]
  • 在计算机技术的学习道路上,51CTO学院以其专业性和专注度给我留下了深刻印象。从2012年接触计算机到2014年开始系统学习网络技术和安全领域,51CTO学院始终是我信赖的学习平台。 ... [详细]
  • CSS 布局:液态三栏混合宽度布局
    本文介绍了如何使用 CSS 实现液态的三栏布局,其中各栏具有不同的宽度设置。通过调整容器和内容区域的属性,可以实现灵活且响应式的网页设计。 ... [详细]
  • Linux 系统启动故障排除指南:MBR 和 GRUB 问题
    本文详细介绍了 Linux 系统启动过程中常见的 MBR 扇区和 GRUB 引导程序故障及其解决方案,涵盖从备份、模拟故障到恢复的具体步骤。 ... [详细]
  • 本文介绍了如何使用jQuery根据元素的类型(如复选框)和标签名(如段落)来获取DOM对象。这有助于更高效地操作网页中的特定元素。 ... [详细]
  • 本文将详细介绍如何使用剪映应用中的镜像功能,帮助用户轻松实现视频的镜像效果。通过简单的步骤,您可以快速掌握这一实用技巧。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 本文介绍如何在 Xcode 中使用快捷键和菜单命令对多行代码进行缩进,包括右缩进和左缩进的具体操作方法。 ... [详细]
  • 本文介绍了一款用于自动化部署 Linux 服务的 Bash 脚本。该脚本不仅涵盖了基本的文件复制和目录创建,还处理了系统服务的配置和启动,确保在多种 Linux 发行版上都能顺利运行。 ... [详细]
  • 在Linux系统中配置并启动ActiveMQ
    本文详细介绍了如何在Linux环境中安装和配置ActiveMQ,包括端口开放及防火墙设置。通过本文,您可以掌握完整的ActiveMQ部署流程,确保其在网络环境中正常运行。 ... [详细]
  • Android 渐变圆环加载控件实现
    本文介绍了如何在 Android 中创建一个自定义的渐变圆环加载控件,该控件已在多个知名应用中使用。我们将详细探讨其工作原理和实现方法。 ... [详细]
  • 如何在WPS Office for Mac中调整Word文档的文字排列方向
    本文将详细介绍如何使用最新版WPS Office for Mac调整Word文档中的文字排列方向。通过这些步骤,用户可以轻松更改文本的水平或垂直排列方式,以满足不同的排版需求。 ... [详细]
  • 本文总结了在使用Ionic 5进行Android平台APK打包时遇到的问题,特别是针对QRScanner插件的改造。通过详细分析和提供具体的解决方法,帮助开发者顺利打包并优化应用性能。 ... [详细]
author-avatar
手机用户2502904917
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有