zoukankan      html  css  js  c++  java
  • 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这个类的实现 。有什么建议请大家提出来 ,共同学习。

    得意


  • 相关阅读:
    DevC++手动开栈
    二分图|网络流建模复习
    C++常用数据类型范围
    卡常剪贴板
    AcWing 2425. 奇怪的计算器
    AcWing 153. 双栈排序 震惊 !2^n 过 1000
    AcWing 352. 闇の連鎖
    AcWing 246. 区间最大公约数
    AcWing 221. 龙哥的问题
    AcWing 381. 有线电视网络
  • 原文地址:https://www.cnblogs.com/lytwajue/p/6749003.html
Copyright © 2011-2022 走看看