全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

一、前言

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

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

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

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

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

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

0:设置权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

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  # 布局保存图片  # 图片布局  # Android布局自定义Shap圆形ImageView可以单独设置背景与图片  # Android代码实现图片和文字上下布局  # Android实现加载广告图片和倒计时的开屏布局  # 自己的  # 这个问题  # 将其  # 做过  # 解决问题  # 为空  # 有一个  # 几个  # 让我  # 是在  # 会有  # 也会  # 就能  # 有很多  # 都能  # 每个人  # 是怎么  # 其他的  # 杀鸡  # 要在 


相关文章: 建站上传速度慢?如何优化加速网站加载效率?  智能起名网站制作软件有哪些,制作logo的软件?  专业网站制作服务公司,有哪些网站可以免费发布招聘信息?  网站制作的软件有哪些,制作微信公众号除了秀米还有哪些比较好用的平台?  如何在万网自助建站中设置域名及备案?  建站之星下载版如何获取与安装?  如何快速重置建站主机并恢复默认配置?  如何通过VPS建站无需域名直接访问?  长沙做网站要多少钱,长沙国安网络怎么样?  深圳企业网站制作设计,在深圳如何网上全流程注册公司?  高端网站建设与定制开发一站式解决方案 中企动力  视频网站制作教程,怎么样制作优酷网的小视频?  存储型VPS适合搭建中小型网站吗?  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  黑客入侵网站服务器的常见手法有哪些?  电商网站制作价格怎么算,网上拍卖流程以及规则?  html制作网站的步骤有哪些,iapp如何添加网页?  Android自定义listview布局实现上拉加载下拉刷新功能  如何获取开源自助建站系统免费下载链接?  建站之星如何实现五合一智能建站与营销推广?  大连网站制作公司哪家好一点,大连买房网站哪个好?  建站之星如何快速生成多端适配网站?  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  如何注册花生壳免费域名并搭建个人网站?  高端建站如何打造兼具美学与转化的品牌官网?  简单实现Android文件上传  已有域名能否直接搭建网站?  为什么Go需要go mod文件_Go go mod文件作用说明  如何在宝塔面板中修改默认建站目录?  如何通过虚拟主机快速搭建个人网站?  定制建站是什么?如何实现个性化需求?  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  如何在建站宝盒中设置产品搜索功能?  如何生成腾讯云建站专用兑换码?  如何制作算命网站,怎么注册算命网站?  如何在Ubuntu系统下快速搭建WordPress个人网站?  如何在Golang中实现微服务服务拆分_Golang微服务拆分与接口管理方法  如何优化Golang Web性能_Golang HTTP服务器性能提升方法  如何通过可视化优化提升建站效果?  企业网站制作公司网页,推荐几家专业的天津网站制作公司?  网站制作难吗安全吗,做一个网站需要多久时间?  北京企业网站设计制作公司,北京铁路集团官方网站?  建站IDE高效指南:快速搭建+SEO优化+自适应模板全解析  建站之星logo尺寸如何设置最合适?  Python文件管理规范_工程实践说明【指导】  网站制作话术技巧,网站推广做的好怎么话术?  兔展官网 在线制作,怎样制作微信请帖?  c# F# 的 MailboxProcessor 和 C# 的 Actor 模型  建站之星代理费用多少?最新价格详情介绍  手机网站制作与建设方案,手机网站如何建设? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。