Android 截圖控件實現

整個控件代碼貼出,使用的時候先調用
imageview.setSrcImageMap(bitmat),伸縮移動選中截圖區域後調用shotScreen()返回截取的bitmap


public class shotScreenImageview extends ImageView implements
      OnGlobalLayoutListener, OnScaleGestureListener, OnTouchListener {


   private boolean IsLoadPic = false;
   private float initScale = 1.0f;
   private float minScale;
   private float maxscale;
   private Matrix initMatrix;
   ScaleGestureDetector gestureDetector;
   private boolean enableMove;
   private boolean enableScroll;
   private float lastScaleFactor=1.0f;
   float lastX, lastY;
   Bitmap srcImageMap;
   int slop;


   Paint paint;




   public shotScreenImageview(Context context, AttributeSet attrs, int defStyle) {
      super(context, attrs, defStyle);


      initMatrix = new Matrix();
      slop = ViewConfiguration.getTouchSlop();
      setScaleType(ScaleType.MATRIX);
      gestureDetector = new ScaleGestureDetector(getContext(), this);
      setOnTouchListener(this);
      paint=new Paint();
      paint.setAlpha(50);
      paint.setColor(Color.parseColor("#50000000"));
   }


   public shotScreenImageview(Context context, AttributeSet attrs) {
      this(context, attrs, 0);
   }


   public shotScreenImageview(Context context) {
      this(context, null);
   }


   public  void setEnableMove(boolean move){
      enableMove=move;


   }




   public void setSrcImageMap(Bitmap bitmap){
      srcImageMap=bitmap;
      minScale=0.5f;
      maxscale=1.5f;
      setImageBitmap(bitmap);


   }




   @Override
   public void onGlobalLayout() {


      if (!IsLoadPic) {
               initBitmap();
         IsLoadPic = true;
      }


   }






   public void initBitmap(){


      int viewWidth = getWidth();


      int viewHeight = getHeight();


      Drawable drawable = getDrawable();
      if(drawable==null){
         return;
      }


      int drawWidth = drawable.getIntrinsicWidth();


      int drawHeight = drawable.getIntrinsicHeight();


      float scale = 1.0f;


      if (drawWidth > viewWidth && drawHeight < viewHeight) {


         scale = viewWidth * 1.0f / drawWidth;


      } else if (drawHeight > viewHeight && drawWidth < viewHeight) {


         scale = viewHeight * 1.0f / drawHeight;
      } else if (drawHeight > viewHeight && drawWidth > viewWidth) {


         scale = Math.max(viewHeight * 1.0f / drawHeight, viewWidth
               * 1.0f / drawWidth);


      } else if (drawHeight < viewHeight && drawWidth < viewWidth) {


         scale = Math.max(viewHeight * 1.0f / drawHeight, viewWidth
               * 1.0f / drawWidth);
      }






      initScale = scale;
      minScale = initScale;
      maxscale = initScale * 3.5f;
      int dx = viewWidth / 2 - drawWidth / 2;
      int dy = viewHeight / 2 - drawHeight / 2;
      initMatrix.postTranslate(dx, dy);
      initMatrix.postScale(initScale, initScale, getWidth() / 2,
            getHeight() / 2);


      setImageMatrix(initMatrix);


   }


   int smallWidth;
   int smallHeight;
   @Override
   protected void onDraw(Canvas canvas) {
      super.onDraw(canvas);
          smallWidth =getMeasuredWidth()/5;
        smallHeight=getMeasuredHeight()/4;
      //畫4塊陰影凸顯中間的白塊作爲截圖區域
      //top陰影
      canvas.drawRect(0,0,getMeasuredWidth(),smallHeight,paint);
      //left陰影
      canvas.drawRect(0, smallHeight, smallWidth, getMeasuredHeight() - smallHeight, paint);
        //right陰影
      canvas.drawRect(getMeasuredWidth() - smallWidth, smallHeight, getMeasuredWidth(), getMeasuredHeight() - smallHeight, paint);
      //bottom陰影
      canvas.drawRect(0, getMeasuredHeight() - smallHeight, getMeasuredWidth(), getMeasuredHeight(), paint);


   }


   public void setEnableScroll(boolean enableScroll){
      this.enableScroll=enableScroll;
   }


   public float getCurrentScale() {


      float[] values = new float[9];
         initMatrix=getImageMatrix();
      initMatrix.getValues(values);
      return values[Matrix.MSCALE_X];


   }


   @Override
   protected void onAttachedToWindow() {
      super.onAttachedToWindow();
      getViewTreeObserver().addOnGlobalLayoutListener(this);
   }


   @Override
   protected void onDetachedFromWindow() {
      super.onDetachedFromWindow();
      getViewTreeObserver().removeGlobalOnLayoutListener(this);
   }


   @Override
   public boolean onScale(ScaleGestureDetector detector) {




      if(!isMoreTwo){
         return true;
      }


      float curScale = getCurrentScale();
      float scalefactor = detector.getScaleFactor();
      if (getDrawable() == null) {
         return true;
      }
      if (curScale*scalefactor > maxscale|curScale *scalefactor <minScale) {
               if((lastScaleFactor>1&scalefactor>lastScaleFactor)|(lastScaleFactor<1&scalefactor<lastScaleFactor)){
               return true;
            }
         }
          lastScaleFactor=scalefactor;
         Matrix initMatrix = new Matrix();

         initMatrix.set(getImageMatrix());

//使圖像的伸縮能夠平滑的進行,1.01和0.99是調試出來的

         if(scalefactor>=1.0f){
  initMatrix.postScale(1.01f, 1.01f, gestureDetector.getFocusX(), gestureDetector.getFocusY());
  }else {
  initMatrix.postScale(0.99f, 0.99f, gestureDetector.getFocusX(), gestureDetector.getFocusY());
  }
         setImageMatrix(initMatrix);
         return false;
      }


   public boolean onScaleBegin(ScaleGestureDetector detector) {
      return true;
   }


   public void onScaleEnd(ScaleGestureDetector detector) {


   }

//確保滑動擡起時圖像不抖動

private boolean isMoreTwo=false;
private boolean isFirstMove=true;
   public boolean onTouch(View v, MotionEvent event) {


      RectF rectF1 = getViewsRect();
      switch (event.getAction()) {
      case MotionEvent.ACTION_DOWN:
         lastX = event.getX();
         lastY = event.getY();




         break;


      case MotionEvent.ACTION_MOVE:
         gestureDetector.onTouchEvent(event);
            if(isFirstMove){
            isFirstMove=false;
            if(event.getPointerCount()!=1){
               isMoreTwo=true;
            }else {
               isMoreTwo=false;
            }
         }
         float x = event.getX();
         float y = event.getY();
         if (getDrawable() != null&&!isMoreTwo) {
            double dis = Math.sqrt((x - lastX) * (x - lastX) + (y - lastY)
                  * (y - lastY));
            if (dis > slop) {
               //checkLeftAndRight = checkTopAndBottom = true;
               float deltx = x - lastX;
               float dely = y - lastY;
                       Matrix initMatrix=new Matrix();
                  initMatrix.set(getImageMatrix());
                  initMatrix.postTranslate(deltx, dely);
                  setImageMatrix(initMatrix);
                  lastX = x;
                  lastY = y;
            }
         }
         break;
      case MotionEvent.ACTION_UP:
         isMoreTwo=false;
         isFirstMove=true;
         gestureDetector.onTouchEvent(event);
        //    checkBorderWhenTranslate();
            break;
      }


      return true;
   }










   private RectF getViewsRect() {


      Matrix matrix = getImageMatrix();
      RectF rectF = new RectF();
      Drawable drawable = getDrawable();
      if (drawable != null) {
         rectF.set(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
         matrix.mapRect(rectF);
      }
      return rectF;
   }


//獲取截圖
   public Bitmap shotScreen(){
      //截圖框左上右下座標點
      Point shotSrnStart=new Point();
      shotSrnStart.set(smallWidth,smallHeight);
      Point shotSrnEnd=new Point();
      shotSrnEnd.set(getMeasuredWidth()-smallWidth,getMeasuredHeight()-smallHeight);


      //圖片的矩形框
      RectF rectF=getViewsRect();
      //截取圖片的左上角圖片
      Point shotStart=new Point();
      Point shotEnd=new Point();
      //確定截取圖片的左上角座標
      if(rectF.left>shotSrnStart.x){
         shotStart.x=(int)(rectF.left);
      }else {
         shotStart.x=shotSrnStart.x;
      }


      if(rectF.top>shotSrnStart.y){
         shotStart.y=(int)(rectF.top);
      }else{
         shotStart.y=shotSrnStart.y;
      }
      //確定截取圖片的右下角座標
      if(rectF.right<shotSrnEnd.x){
         shotEnd.x=(int)(rectF.right);
      }else {
         shotEnd.x=shotSrnEnd.x;
      }


      if(rectF.bottom<shotSrnEnd.y){
         shotEnd.y=(int)(rectF.bottom);
      }else{
         shotEnd.y=shotSrnEnd.y;
      }


      //檢查截取點是否在截圖框裏
      if((shotStart.x>=shotSrnStart.x&&shotStart.y>=shotSrnStart.y)&&(shotEnd.x<=shotSrnEnd.x&&shotEnd.y<=shotSrnEnd.y)&&(shotStart.x<shotEnd.x&&shotStart.y<shotEnd.y)){
      int width=shotEnd.x-shotStart.x;
      int height=shotEnd.y-shotStart.y;
//       Drawable drawable=getDrawable();
//       BitmapDrawable bitmapDrawable=(BitmapDrawable)drawable;
//        Bitmap b=bitmapDrawable.getBitmap();
      Bitmap b=Bitmap.createBitmap(srcImageMap,0,0,srcImageMap.getWidth(),srcImageMap.getHeight(),getImageMatrix(),false);
         int stx=(int)(shotStart.x+1-rectF.left);
         int sty=(int)(shotStart.y+1-rectF.top);
         return  Bitmap.createBitmap(b,stx,sty,width,height);
      //return   b.createBitmap(b,stx,sty,width,height);
      }else{
         return  null;
      }


   }


}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章