一、前言

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