Android自己定义截屏功能,相似QQ截屏

由于公司业务需求 须要对一个屏幕进行截屏。但自带的截屏功能是远远不够项目的功能需求 ,我们是做一个画板软件 。须要的像QQ那样截屏之后 ,能够看到我们自己定义的工具。有画笔,button等等 。android自带的功能非常easy,仅仅须要Intent隐式调用就全然足够了。但他是系统的应用 ,界面固定。无法定制改动。实现方法跟办法有非常多种,以下记录下我实现的方法 。我是这样一个思路 ,重写一个View组件 ,在OnDraw里面仅仅负责不绘图形(包含半透明的四个矩形,亮框矩形,亮框上的四个小圆点),Ontouch方法是不停的去改动亮框
的坐标点。然后又一次绘制 。

效果图:

我是把这个图片分解成以下这个图的形状的。

我们在onTouch里面就不停地去绘制矩形跟圆点。

详细代码实现主要思路:

1、图片绘制方法:

@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas); //不重写 图片无法出现
		if(mBitmap!=null){
//			drawNoLight(canvas);
			canvas.drawBitmap(mBitmap, iconLeft , iconTop, p_picture) ;
			//画高亮的边界
			drawRect(canvas) ;
			if(isDown)
				drawCircle(canvas) ;
		}

	}

2、图片坐标修改方法:

@Override
	public boolean onTouchEvent(MotionEvent event) {

		int action = event.getAction() ;
		float x = event.getX() ;
		float y = event.getY() ;
		switch (action) {
		case MotionEvent.ACTION_DOWN:
			startX = x ;
			startY = y ;
			//须要推断是在矩形的外边还是里面(推断是移动还是缩放)
			if(x>lightRect.left+OFFSET && x<lightRect.right -OFFSET && y>lightRect.top+OFFSET && y<lightRect.bottom -OFFSET){
				//是移动的状态
				isMove = true ;
				isScale = false ;
			}else if(x<lightRect.left-OFFSET || y<lightRect.top-OFFSET || x>lightRect.right+OFFSET || y>lightRect.bottom+OFFSET){
				isMove = false ;
				isScale = false ;
			}else {
				isMove = false ;
				isScale = true ; //缩放
				 point = getScalePoint(startX , startY);
			}
			if(!isScale)
				isDown = false ;
			break;

		case MotionEvent.ACTION_UP :
		case MotionEvent.ACTION_CANCEL:
			isDown = true ;
			break ;

		case MotionEvent.ACTION_MOVE:

			if(isMove){
				//移动
				float dx = x - startX ;
				float dy = y - startY ;
				moveLightRect(dx , dy) ;
				startX = x ;
				startY = y ;
				isDown = false ;
			}
			if(isScale){
				float dx = x - startX ;
				float dy = y - startY ;
				resetLightRect(dx , dy) ;
				startX = x ;
				startY = y ;
			}

			break ;

		default:
			break;
		}
		invalidate() ;
		return true;
	}

3、图片截取的方法:

public Bitmap getBitmap (){
		int x = (int)(lightRect.left - iconLeft) ;
		int y = (int)(lightRect.top - iconTop) ;
		int w = lightRect.right - lightRect.left ;
		int h = lightRect.bottom - lightRect.top ;
		Bitmap bitmap = Bitmap.createBitmap(mBitmap, x, y, w, h) ;
		return bitmap ;
	}

PS:这个仅仅是一个View   能够实现图片的截取,这时我们须要加一些自己定义的button进来。就使用一个布局文件 。把button布置进去 。举一个简单的样例:

<?xml version="1.0" encoding="utf-8"?

>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

    <com.example.imagedemo.ImageTailor
        android:id="@+id/tailor"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
         />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="8dp"
        android:layout_marginRight="8dp"
        android:layout_gravity="bottom"
        >
        <Button
        android:id="@+id/complete"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="right"
        android:text="完毕"
        />
        <Button
            android:id="@+id/cancel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="right"
        android:text="取消"
        />

    </LinearLayout>

</FrameLayout>

*:关键类和关键的方法我放在我的资源里,须要的朋友能够下载直接执行 看下效果。也能够看也这个Demo。 主要是ImageTailor.java这个类的实现 。有什么建议请大家提出来 ,共同学习。

时间: 2024-10-03 13:45:32

Android自己定义截屏功能,相似QQ截屏的相关文章

Android解决WebView的定位功能、视频全屏播放、下载功能、页面Url的处理、进度条处理

解决WebView的定位功能.视频全屏播放.下载功能.页面Url的处理.进度条处理 事先说明: 定位功能在安卓6.0需要用户手动确认权限后才能使用 若需在安卓6.0适配WebView的定位功能,则需要在WebView中手动增加用户权限访问 详细可百度安卓6.0权限管理系统,或者采用第三方封装好的权限管理类进行编写(如Bmob) 如果对内容不理解的话,可参考最后的整个类的代码 如果对BaseActivity这个抽象类不理解的话,可以查看下面一篇文章对BaseActivity的介绍 步骤一:webv

小胖说事22-----iOS开发技巧之取消键盘响应和截屏功能

1.UILable内容模糊 在非Retina的iPad mini 的屏幕上,一个UILable的frame的origin值如果是有小数位(如0.5),就会造成显示模糊,所以最好还是用整数值的origin. 2.取消键盘响应 取消键盘响应事件,一般都会用到resignFirstResponder,但是还有三种方法可以取消键盘的响应. 第一种:重载UIViewcontroller中的touchesBegin方法,然后在里边执行 [self.view endEditing:YES]:这样单击UIVie

Android自定义截屏功能,类似QQ截屏

因为公司业务需求 需要对一个屏幕进行截屏,但自带的截屏功能是远远不够项目的功能需求 ,我们是做一个画板软件 ,需要的像QQ那样截屏之后 ,可以看到我们自定义的工具,有画笔,按钮等等 .android自带的功能非常简单,只需要Intent隐式调用就完全足够了,但他是系统的应用 ,界面固定,无法定制修改.实现方法跟办法有很多种,下面记录下我实现的方法 .我是这样一个思路 ,重写一个View组件 ,在OnDraw里面只负责不画图形(包括半透明的四个矩形,亮框矩形,亮框上的四个小圆点),Ontouch方

Android项目实战(十七):QQ空间实现(二)—— 分享功能 / 弹出PopupWindow

原文:Android项目实战(十七):QQ空间实现(二)-- 分享功能 / 弹出PopupWindow 这是一张QQ空间说说详情的截图. 分析: 1.点击右上角三个点的图标,在界面底部弹出一个区域,这个区域有一些按钮提供给我们操作 2.当该区域出现的时候,详情界面便灰了,也说成透明度变化了 3.当任意选了一个按钮或者点击了该区域以外的部分,该区域消失,灰色界面变回亮白色,并执行点击的按钮对应的操作 显然,这个功能我们需要用PopupWindow实现更好~ --------------------

通过view.getDrawableCache实现截屏功能

最近公司要做一些需要截屏的APP,职场菜鸟什么都不会,于是就在网上找了些资料.东拼西凑的大致了解了一下,其实还是很简单的,但是尝试的过程中遇到了一些些小问题,于是就想到要不要记录下来,于是就有了这篇文章.技术小白,大神请无视. 就如网上到处都能搜到的view.getDrawableCache()的用法一样,在调用view.getDrawableCache()之前需要调用view.setDrawingCacheEnabled(true)的方法,设置为true之后返回的bitmap就不会是null,

Atitit截屏功能的设计解决方案

自己实现.... 使用快捷键.. 弹出自己的win,,背景是屏幕快照 点击鼠标光标变成十字状态 出现截屏窗口调整截屏窗口位置与大小 释放鼠标,三个btn,,  复制到clip,取消,保存文件..双击,退出截屏窗口..与back win... 使用C:\360Downloads\Software\屏幕截图精灵_1.0\screener_plugin.exe 走ok paip.截屏功能流程说明 点击"开始截屏",出现MASC层将下边的窗口灰掉鼠标光标变成十字状态单击鼠标,出现截屏窗口调整截

java swing开发的图像生成器demo实例源代码下载,实现绘制图像,截屏功能。

一个类似于画画的javase程序 绘制图形 原文:java swing开发的图像生成器demo实例源代码下载,实现绘制图像,截屏功能. java源代码下载地址:http://www.zuidaima.com/share/1550463330028544.htm 获取屏幕 打开调色板

使用laravel框架与phantomjs实现截屏功能

在网上看到的关于phantomjs实现截屏功能很多都是与node结合在一起使用,并需要输入命令才能执行.因此我想要实现输入网址即可截屏并输出图片的功能. 一:下载并安装phantomjs 二:装后台集成环境Appserv 三:安装laravel开发框架 三:实现代码及注意事项 1.phantomjs很好安装,http://phantomjs.org/官网下载到任意目录(注意:如果为了省事,最好安装到本地环境变量的目录下  如下图),如果不想下载到此目录下,可下载完后到计算机属性的环境变量增加ph

Cocos2d-x 截屏功能集成

1.集成到Director这里选择把截屏功能继承到Director中,让全局的导演来执行截屏功能是一个很好的主意. void Director::saveScreenshot(const std::string& fileName,const std::function<void(const std::string&)>& callback) { Image::Format format; //进行后缀判断 if(std::string::npos != fileNam