文档章节

安卓实现自定义区域截屏

p
 pm-road
发布于 2014/12/17 14:21
字数 981
阅读 14
收藏 0

该文章属于原创,转载注明出处:http://www.pm-road.com/index.php/2014/10/29/140/

安卓可以通过Bitmap对象可以实现对整个屏幕的截屏,同时也可以通过该类实现对局部屏幕的截屏,

其中的主要原理就是通过手指对屏幕的onTouch操作:如按下屏幕,在屏幕上移动 ,从屏幕上起来等;

而一般性的截图在截图过程中,选中的屏幕颜色会改变,所以该功能在选取过程中,为了方便看到选择的屏幕大小,我们也会改变屏幕的颜色;

根据思路,如果要在屏幕选择过程中,某个局部显示的屏幕颜色不同,我们需要在当前View里面加入一个View对象,

所以我们应该先写一个类:ScreenShotView.java  该类应该继续View对象,具体代码如下:

package com.titan_geo.view;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.view.View;

public class ScreenShotView extends View {
private int x;//手指按下去的x坐标
private int y;//手指按下去的y坐标
private int m;//手指弹起的x坐标
private int n;//手指弹起的的y坐标
private boolean sign;//是否可以进行截屏操作
private Paint paint;//将选取的屏幕画颜色
public ScreenShotView(Context context) {
super(context);
paint = new Paint(Paint.FILTER_BITMAP_FLAG);
}

@Override
protected void onDraw(Canvas canvas) {
if(sign){
paint.setColor(Color.TRANSPARENT);//白
}else{
paint.setColor(Color.RED);//将选取的屏幕设置成红色
paint.setAlpha(80);//透明度80
canvas.drawRect(new Rect(x, y, m, n), paint);
}
super.onDraw(canvas);
}

public void setSeat(int x,int y,int m,int n){
this.x = x;
this.y = y;
this.m = m;
this.n = n;
}

public boolean isSign() {
return sign;
}

public void setSign(boolean sign) {
this.sign = sign;
}

}
 

该文章属于原创,转载注明出处:http://www.pm-road.com/index.php/2014/10/29/140/

然后在要截屏的activity中加入相应的代码:(比如说:MainActivity.java)

// 截图属性
private int screenshot_x;// 绘画开始的横坐标
private int screenshot_y;// 绘画开始的纵坐标
private int screenshot_m;// 绘画结束的横坐标
private int screenshot_n;// 绘画结束的纵坐标
private int screenshot_width;// 绘画的宽度
private int screenshot_height;// 绘画的高度
private Bitmap screenshot_bitmap;// 生成的位图
private ScreenShotView screenshotView;// 绘画选择区域
private String screenUrl;
private Context context;

private ImageView image1;//需要截图的图片

 

在此(MainActivity.java)的oncreate方法中增加如下代码:

//将截屏的view 要放在该activity中

screenshotView= new ScreenShotView(this);

image1 = (ImageView) findViewById(R.id.image1);//需要截屏的部分,可以是任何view对象

//声明一个对话框,提示可以开始截屏了

new AlertDialog.Builder(this)
.setMessage(“选取屏幕开始截屏”)
.setPositiveButton(“确定”,new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialoginterface,int i) {
screenshotView.setSign(true);//当按下确定按钮时,将截屏中的方法设置为true
if (myView.isSign()) {
screenshotView.setSeat(0, 0, 0, 0);
screenshotView.setSign(false);
} else {
screenshotView.setSign(true);
}
screenshotView.postInvalidate();
}
}).show();

//将截屏的内容放在该activity中
this.addContentView(screenshotView, new LayoutParams(
LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT));
 

 

然后对image1增加ontouch事件:

image1.setOnTouchListener(new ScreenShotListener());//声明一个内部类的事件

内部类代码如下:

class ScreenShotListener implements OnTouchListener {

@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
screenshot_x = 0;
screenshot_y = 0;
screenshot_width = 0;
screenshot_height = 0;
screenshot_x = (int) event.getX();
screenshot_y = (int) event.getY();
}
if (event.getAction() == MotionEvent.ACTION_MOVE) {
screenshot_m = (int) event.getX();
screenshot_n = (int) event.getY();
screenshotView.setSeat(screenshot_x, screenshot_y, screenshot_m,
screenshot_n);
screenshotView.postInvalidate();
}
if (event.getAction() == MotionEvent.ACTION_UP) {
if (event.getX() > screenshot_x) {
screenshot_width = (int) event.getX() – screenshot_x;
} else {
screenshot_width = (int) (screenshot_x – event.getX());
screenshot_x = (int) event.getX();
}
if (event.getY() > screenshot_y) {
screenshot_height = (int) event.getY() – screenshot_y;
} else {
screenshot_height = (int) (screenshot_y – event.getY());
screenshot_y = (int) event.getY();
}
new AlertDialog.Builder(context)
.setMessage(“确定截图”)
.setPositiveButton(“确定”,
new DialogInterface.OnClickListener() {
public void onClick(
DialogInterface dialoginterface,
int i) {
//截图完毕之后,会提示是否保存所需要的图片,如果点确定 ,则执行此方法
saveBitmap();//具体代码如下

}
}).setNegativeButton(“取消”, null).show();

}
if (screenshotView.isSign()) {
return false;
} else {
return true;
}
}

}

 

/**
* 保存位图
*
* @param activity
* @return
*/
private void saveBitmap() {

View view = this.getWindow().getDecorView();
view.setDrawingCacheEnabled(true);
view.buildDrawingCache();
screenshot_bitmap = view.getDrawingCache();
Rect frame = new Rect();
this.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
int toHeight = frame.top;
screenshot_bitmap = Bitmap.createBitmap(screenshot_bitmap,
screenshot_x, screenshot_y + 2 * toHeight, screenshot_width,
screenshot_height);
try {
FileOutputStream fout = new FileOutputStream(screenUrl);//这里screenUrl是保存图片的路径 ,在这里需要声明一下,否则会报错
screenshot_bitmap.compress(Bitmap.CompressFormat.PNG, 100, fout);
if(fout != null){
fout.close();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
view.setDrawingCacheEnabled(false);

}
 

代码完毕,该文章属于原创,转载注明出处:http://www.pm-road.com/index.php/2014/10/29/140/

本文转载自:http://rqlipeng.iteye.com/blog/2152461

p
粉丝 6
博文 69
码字总数 638
作品 0
海淀
私信 提问
Android开源中国客户端学习 截屏模块

这次分享的功能比较简单,是osc的截屏模块,效果如下 这个功能用户体验还是不错的,在很多软件都也都内置了这个功能 这个功能的原理是: 1.在需要截屏的activity的window上覆盖一个ScreenShotVie...

SuShine
2013/07/07
560
0
Android8.1 MTK平台 截屏功能分析

前言 涉及到的源码有 frameworksbaseservicescorejavacomandroidserverpolicyPhoneWindowManager.java vendormediatekproprietarypackagesappsSystemUIsrccomandroidsystemuiscreenshotTake......

cczheng
08/16
0
0
Android 开发中,与屏幕有关的三个小众知识

宽屏适配、禁止截屏和保持屏幕常亮,这三个与屏幕有关的 Android 开发小众知识,说不定什么时候就派上用场。 宽屏适配 越来越多的手机厂商趋向于全面屏设计,比如今年出厂的 18.5:9 屏幕比例...

亦枫
2018/10/29
0
0
Android开源中国客户端学习 截屏模块

这次分享的功能比较简单,是osc的截屏模块,效果如下 ![图片说明文字][1] 这个功能用户体验还是不错的,在很多软件都也都内置了这个功能 这个功能的原理是: 1.在需要截屏的activity的window上覆...

sisuad
2013/07/17
286
1
Android小白,关于手机截屏和模拟操作

准备做天天爱消除的外挂。。。。,算法已经想了一个,想实现出来。 但对于android只是helloworld的级别,对java熟悉。 首先需要手机截屏,并识别出图形矩阵,然后执行模拟点击或模拟划动的操...

黄正文
2013/08/21
190
1

没有更多内容

加载失败,请刷新页面

加载更多

CentOS 7 搭建源码包搭建LNMP环境

1,安装epel源 yum install -y epel-release 2, 安装需要的软件 yum install -y gcc automake autoconf libtool make gcc-c++ glibc libxslt-devel \libjpeg libjpeg-devel libpng libpng......

hansonwong
35分钟前
5
0
基于 K8s 做应用发布的工具那么多, 阿里为啥选择灰姑娘般的 Tekton ?

作者 | 邓洪超,阿里云容器平台工程师, Kubernetes Operator 第二人,云原生应用标准交付与管理领域知名技术专家 导读:近年来,越来越多专门给 Kubernetes 做应用发布的工具开始缤纷呈现,...

阿里巴巴云原生
36分钟前
2
0
ZStack的普惠云计算到底是“随大流”还是真功夫?(转自社区)

作为一名深耕技术圈的“老男人”,也算是经历过云计算领域的成长。近些年云计算技术不断成熟,百行百业开始云上之路,各大云计算厂商开始逐渐意识到云计算是一项“普惠”技术。 我一直很看好...

ZStack社区版
37分钟前
3
0
一个备份MySQL数据库的简单Shell脚本

Shell脚本是我们写不同类型命令的一种脚本,这些命令在这一个文件中就可以执行。我们也可以逐一敲入命令手动执行。如果我们要使用shell脚本就必须在一开始把这些命令写到一个文本文件中,以后...

旺仔大战肥五花
42分钟前
1
0
TiDB Binlog 源码阅读系列文章(四)Pump server 介绍

作者: satoru 在 上篇文章 中,我们介绍了 TiDB 如何通过 Pump client 将 binlog 发往 Pump,本文将继续介绍 Pump server 的实现,对应的源码主要集中在 TiDB Binlog 仓库的 pump/server.go...

TiDB
46分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部