逛论坛看到别人有这个需求,自己也是打酱油,就写了一把。

界面如下:

主要有一个半透明的矩形框,用作截取区域。一个ok按钮,确定截取。一个图片控件,显示图片。

功能需求:

1.多点放大缩小图片;

2.移动图片;

3.提供预览。

我一开始的思路是这样的:

用户放大缩小图片时,记住缩放比例,然后确定时,按照比例来截图。但是有个问题:如何确定是哪块处于半透明框中?因为可以移动图片的。这就不好计算了。

后来想到一个简单的方法:

用户放大或缩小图片之后,点OK时,截取屏幕的截图。然后再计算出半透明矩形框的位置,截图。这样就避免了繁琐的计算来确定截图位置。

实现过程:

1.截取屏幕图像:

// 获取Activity的截屏,this指向一个activity

private Bitmap takeScreenShot()

{

View view = this.getWindow().getDecorView();

view.setDrawingCacheEnabled(true);

view.buildDrawingCache();

return view.getDrawingCache();

}

2.获取状态栏、标题栏的高度

int statusBarHeight = 0;

int titleBarHeight = 0;

private void getBarHeight()

{

// 获取状态栏高度

Rect frame = new Rect();

this.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);

statusBarHeight = frame.top;

int contenttop = this.getWindow()

.findViewById(Window.ID_ANDROID_CONTENT).getTop();

// statusBarHeight是上面所求的状态栏的高度

titleBarHeight = contenttop - statusBarHeight;

}

3.多点缩放图片

4.创建半透明矩形区域

继承view,自绘。

@Override

protected void onDraw(Canvas canvas)

{

super.onDraw(canvas);

/*这里就是绘制矩形区域*/

int width = this.getWidth();

int height = this.getHeight();

Paint paint = new Paint();

paint.setColor(0xaa000000);

//top

canvas.drawRect(0, 0, width, height/3, paint);

//left

canvas.drawRect(0, height/3, (width - height/3)/2, height*2/3, paint);

//right

canvas.drawRect((width + height/3)/2, height/3, width ,  height*2/3, paint);

//bottom

canvas.drawRect(0, height*2/3, width, height, paint);

}

5. 截取图片

/*获取矩形区域内的截图*/

private Bitmap getBitmap()

{

getBarHeight();

Bitmap screenShoot = takeScreenShot();

clipview = (ClipView)this.findViewById(R.id.clipview);

int width = clipview.getWidth();

int height = clipview.getHeight();

Bitmap finalBitmap = Bitmap.createBitmap(screenShoot,

(width - height / 3) / 2, height / 3 + titleBarHeight + statusBarHeight, height / 3, height / 3);

return finalBitmap;

}

这些就是技术点了。其他的没有什么的。

重要的是想法。

源代码怎么添加??郁闷了。。。

android写代码截屏微信,微信等头像截取的实现 - 拉风的道长_Android之路 - OSCHINA - 中文开源技术交流社区...相关推荐

  1. android写代码截屏微信,android 模仿微信头像裁剪

    android 在android开发中经常会碰到修改头像的功能需求, 而在修改头像>中最难的部分就是在头像的裁剪功能.虽说网上一大堆裁剪的例子,但最重要的是要理解里面的实现原理,这样以后自己改起 ...

  2. mac电脑投屏到小米盒子_电脑投屏到小米盒子 - thomas_more的个人空间 - OSCHINA - 中文开源技术交流社区...

    无线显示技术 WiDi,需要英特尔Centrino Advanced-N 6200/6300/1000的无线网卡支持和显示适配器支持,在没有wifi网络的环境下可实现无限显示技术 无线投屏技术 Air ...

  3. 在单链表写入一组数据代码_第5章 第1节 链表 - osc_x8s7voop的个人空间 - OSCHINA - 中文开源技术交流社区...

    ● 请你说出几种基本的数据结构, 参考回答: 常见的基本的数据结构有链表.栈.队列.树(只列出面试常考的基本数据结构) 1.链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链 ...

  4. php 小程序 运动步数_小程序同步微信步数 - xiangqian1的个人空间 - OSCHINA - 中文开源技术交流社区...

    小程序获取微信运动步数,咱们看文档:https://developers.weixin.qq.com/miniprogram/dev/api/open-api/werun/wx.getWeRunDat ...

  5. 卡券php小程序,微信小程序领取卡券 - osc_88a08cel的个人空间 - OSCHINA - 中文开源技术交流社区...

    微信小程序领取卡券 标签(空格分隔): php 开发前需要准备的工作 1 小程序和公众号要有绑定 2 小程序和该公众号要绑定到同一个开发平台下 [https://open.weixin.qq.com/ ...

  6. 微信步数C语言程序,获取微信步数 - osc_1v2pb1nt的个人空间 - OSCHINA - 中文开源技术交流社区...

    const util = require('../../utils/util.js') Page({ /** * 页面的初始数据 */ data: { runData:[], }, /** * 生命周 ...

  7. php微信公众号无限制群发,微信公众号无限群发 - viki_php的个人空间 - OSCHINA - 中文开源技术交流社区...

    /* Author:yf 使用说明:微信公众号无线群发接口,使用实例: $test = new SendAllMsg("你的appId","你的appSecret&quo ...

  8. java构造函数重载继承_Java基础-继承 - 写代码换盆的个人空间 - OSCHINA - 中文开源技术交流社区...

    访问权限 Java 中有三个访问权限修饰符:private.protected 以及 public,如果不加访问修饰符,表示包级可见. 可以对类或类中的成员(字段和方法)加上访问修饰符. 类可见表示其 ...

  9. 小微商户申请php,微信小微商户申请入驻 - osc_r8q2esik的个人空间 - OSCHINA - 中文开源技术交流社区...

    public static string ApplyEnter(string Data) { if (string.IsNullOrWhiteSpace(Data)) return ProtocolM ...

  10. linux 输入法框架,常用输入法框架简介 - 微信公众号:算法与编程之美 - OSCHINA - 中文开源技术交流社区...

    前言 之前使用的一直都是ibus-sunpinyin中文输入法,但在使用的过程中发现很多的词组都找不到,比较麻烦,所以打算换一下ibus-googlepinyin输入法,还没用,也不知道具体的效果怎么 ...

最新文章

  1. python tkinter库、添加gui界面_使用Python中tkinter库简单gui界面制作及打包成exe的操作方法(二)...
  2. 长连接、短连接、短轮询、长轮询
  3. .net数据根据字段进行分类(linq语句)
  4. 丢人现眼……GitHub阿波罗11号代码仓库惨遭中文灌水
  5. NLTK基础教程学习笔记(一)
  6. DLNg[结构化ML项目]第二周迁移学习+多任务学习
  7. 使用MyBatis集成阿里巴巴druid连接池(不使用spring)
  8. Linux:分享50个实用的基础命令,欢迎收藏!
  9. 【ArcGIS遇上Python】使用add-in向导开发ArcGIS插件(1):add-in工具介绍及安装
  10. 扫雷游戏(洛谷P2670题题解,Java语言描述)
  11. 分享:MySQL 学习笔记(三)
  12. 小米不加入鸿蒙,是华为不给小米用鸿蒙,还是小米拒绝使用鸿蒙?
  13. 流量和延迟减半!挑战 TiDB 跨数据中心难题
  14. Linux系统下如何运行.sh文件
  15. model.load_state_dict(checkpoint[‘state_dict‘]) KeyError: ‘state_dict‘
  16. 电脑管家下载|腾讯电脑管家下载
  17. 嵌入式:ARM相关开发工具概述
  18. 企业对接Walmart平台常见报错
  19. JS实现视频录制-以Cesium为例
  20. java 捕获sigkill,如何杀死由kill或kill -9上的脚本启动的进程生成的所有子进程

热门文章

  1. Linux下qt程序部署到ARM开发板上: error: Upload of file “你的程序“ failed. The server said: “Failure
  2. CDR安装包下载+汉化简体中文版+安装教程
  3. JavaScript如何打开和使用JavaScript控制台
  4. 不花冤枉钱就能回家 --- 程序员教你如何高效抢票
  5. Android签名工具 AndroidMultitool使用方法
  6. 上传图片的方法(大白话讲解)
  7. 如何判断一个PCIe的capability是哪个capability
  8. 短按SOS键实现开始与停止白光LED灯闪烁状态
  9. 后缀数组(Suffix Array )
  10. 关于全国信息安全作品赛的了解