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;
}
}
}