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

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

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

文章图片
 
我是把这个图片分解成以下这个图的形状的。
我们在onTouch里面就不停地去绘制矩形跟圆点。
Android自己定义截屏功能,相似QQ截屏

文章图片


详细代码实现主要思路:

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这个类的实现 。有什么建议请大家提出来 ,共同学习。
Android自己定义截屏功能,相似QQ截屏

文章图片



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

















    推荐阅读