在android中,旋转图像超出了范围

在android中,旋转图像超出了范围,android,Android,在我的代码中,图像旋转、缩放和拖动都是成功的。但当我旋转图像时,它超出了边界。请帮我旋转带有边框的图像 我的代码如下 这是我的头巾 @Override public void onDraw(Canvas canvas) { // TODO Auto-generated method stub canvas.save(); canvas.drawBitmap(image, matrix, new Paint()); canvas.drawRect(getBound

在我的代码中,图像旋转、缩放和拖动都是成功的。但当我旋转图像时,它超出了边界。请帮我旋转带有边框的图像

我的代码如下

这是我的头巾

@Override
public void onDraw(Canvas canvas) {
    // TODO Auto-generated method stub
    canvas.save();

    canvas.drawBitmap(image, matrix, new Paint());
    canvas.drawRect(getBounds() , borderPaint);

    canvas.restore();

}
以及touchEvent方法

static final int NONE = 0;
static final int DRAG = 1;
static final int ZOOM = 2;
int mode = NONE;

@Override
public boolean onTouchEvent(MotionEvent event) {
    boolean handled = false;
    int x = 0;
    int y = 0;
    Log.d("SimpImageView", "(int)event.getX() " + (int)event.getX());
    Log.d("SimpImageView", "(int)event.getY() " + (int)event.getY());

    if(isTouchedInBounds((int)event.getX(), (int)event.getY())){
        Log.d("SimpImageView", "Touched in Bounds");
        handled = true;

        switch (event.getAction() & MotionEvent.ACTION_MASK) {
        case MotionEvent.ACTION_DOWN:
            start.set(event.getX(), event.getY());
            lastPosition.x = getBounds().left;
            lastPosition.y = getBounds().top;
            savedMatrix.set(matrix);
            Log.d("VerticalLabelView", "mode=DRAG");
            mode = DRAG;
            break;
        case MotionEvent.ACTION_POINTER_DOWN:
            mode = ZOOM;
            savedMatrix.set(matrix);
            oldScale = spacing(event);
            midPoint(mid, event);
            Log.d("VerticalLabelView", "mode=ZOOM");
            oldRotation = rotation(event);

            break;
        case MotionEvent.ACTION_UP:
            mode = NONE;
            break;
        case MotionEvent.ACTION_POINTER_UP:
            mode = NONE;
            Log.d("VerticalLabelView", "mode=NONE");
            break;
        case MotionEvent.ACTION_MOVE:
            if (mode == DRAG) {
                matrix.set(savedMatrix);
                 x = (int)(event.getX() - start.x);
                 y = (int)(event.getY() - start.y);
                //  setPosition((int)lastPosition.x + x, (int)lastPosition.y + y,getImage().getWidth(),getImage().getHeight());
                //matrix.setTranslate(lastPosition.x + x, lastPosition.y + y);
                    matrix.postTranslate(event.getX() - start.x, event.getY()
                            - start.y);

                     float[] values = new float[9];
                        matrix.getValues(values);
                        float globalX = values[2];
                        float globalY = values[5];
                        float imageWidth = values[0]* image.getWidth();
                        float imageHeight = values[4] *image.getHeight();
                     setPosition((int)globalX, (int)globalY, (int)imageWidth, (int)imageHeight);
            }else if(mode == ZOOM){

            //  if(newWidth < 500){
                newScale = spacing(event);
                newRotation = rotation(event);
                angle = newRotation - oldRotation;
                //Matrix matrix = new Matrix();
                float scale =newScale/oldScale;
                int width = image.getWidth();
                int height = image.getHeight();
                newWidth = (int) (image.getWidth()*scale);
                newHeight  = (int) (image.getHeight()*scale);
                Log.d("new Widht ", "new widht="+image.getWidth()*scale);
                matrix.set(savedMatrix);
                float scaleWidth = 0;
                float scaleHeight;
                    scaleWidth = ((float) newWidth) / width;
                    scaleHeight= ((float) newHeight) / height;

                    matrix.postScale(scaleWidth, scaleHeight,mid.x,mid.y);
                matrix.postRotate(angle,mid.x,mid.y);
                float[] values = new float[9];
                matrix.getValues(values);
                float globalX = values[2];
                float globalY = values[5];
                float imageWidth = values[0]* image.getWidth();
                float imageHeight = values[4] *image.getHeight();
                setBounds((int)globalX, (int)globalY, (int)imageWidth,(int)imageHeight);    
                Log.d("VerticalLabelView", "AAAAAAAAAAA==globalX="+globalX);
                Log.d("VerticalLabelView", "AAAAAAAAAAA==globalY="+globalY);
                Log.d("VerticalLabelView", "AAAAAAAAAAA==width="+width);
                Log.d("VerticalLabelView", "AAAAAAAAAAA==height="+height);

                Log.d("VerticalLabelView", "AAAAAAAAAAA==values[1]="+values[1]);
                Log.d("VerticalLabelView", "AAAAAAAAAAA==values[3]="+values[3]);
                Log.d("VerticalLabelView", "AAAAAAAAAAA==values[6]="+values[6]);
                Log.d("VerticalLabelView", "AAAAAAAAAAA==values[7]="+values[7]);



            }
            break;
        //  }
        }

    }


   /* Log.d("VerticalLabelView", "AAAAAAAAAAA==globalX="+image.getWidth());
    Log.d("VerticalLabelView", "AAAAAAAAAAA==globalY="+globalY);
    Log.d("VerticalLabelView", "AAAAAAAAAAA==width="+width);
    Log.d("VerticalLabelView", "AAAAAAAAAAA==height="+height);*/


    return handled;

}
static final int NONE=0;
静态最终整数阻力=1;
静态最终整数缩放=2;
int模式=无;
@凌驾
公共布尔onTouchEvent(运动事件){
布尔值=假;
int x=0;
int y=0;
Log.d(“SimpImageView”,“int)event.getX()”+(int)event.getX());
Log.d(“SimpImageView”,“int)event.getY()”+(int)event.getY());
if(isTouchedInBounds((int)event.getX(),(int)event.getY()){
Log.d(“SimpImageView”、“边界接触”);
已处理=正确;
开关(event.getAction()&MotionEvent.ACTION\u掩码){
case MotionEvent.ACTION\u DOWN:
set(event.getX(),event.getY());
lastPosition.x=getBounds().left;
lastPosition.y=getBounds().top;
savedMatrix.set(矩阵);
Log.d(“VerticalLabelView”,“mode=DRAG”);
模式=拖动;
打破
case MotionEvent.ACTION\u指针\u向下:
模式=缩放;
savedMatrix.set(矩阵);
oldScale=间距(事件);
中点(中点,事件);
Log.d(“垂直视图”,“模式=缩放”);
oldRotation=旋转(事件);
打破
case MotionEvent.ACTION\u UP:
模式=无;
打破
case MotionEvent.ACTION\u指针\u向上:
模式=无;
Log.d(“VerticalLabelView”,“mode=NONE”);
打破
case MotionEvent.ACTION\u移动:
如果(模式==拖动){
矩阵集(savedMatrix);
x=(int)(event.getX()-start.x);
y=(int)(event.getY()-start.y);
//setPosition((int)lastPosition.x+x,(int)lastPosition.y+y,getImage().getWidth(),getImage().getHeight());
//矩阵.setTranslate(lastPosition.x+x,lastPosition.y+y);
postTranslate(event.getX()-start.x,event.getY())
-开始(y);
浮点[]值=新浮点[9];
矩阵。获取值(值);
float globalX=值[2];
float globalY=值[5];
float imageWidth=值[0]*image.getWidth();
float imageHeight=值[4]*image.getHeight();
设置位置((int)globalX,(int)globalY,(int)imageWidth,(int)imageHeight);
}else if(模式==缩放){
//如果(新宽度<500){
新闻比例=间隔(事件);
新旋转=旋转(事件);
角度=新旋转-旧旋转;
//矩阵=新矩阵();
浮动比例=新比例/旧比例;
int width=image.getWidth();
int height=image.getHeight();
newWidth=(int)(image.getWidth()*比例);
newHeight=(int)(image.getHeight()*比例);
Log.d(“new widt”,“new widt=“+image.getWidth()*scale”);
矩阵集(savedMatrix);
浮动刻度宽度=0;
浮标重量;
scaleWidth=((float)newWidth)/宽度;
缩放高度=((浮动)新高度)/高度;
矩阵。后标度(标度宽度、标度高度、中x、中y);
矩阵。旋转后(角度,中间x,中间y);
浮点[]值=新浮点[9];
矩阵。获取值(值);
float globalX=值[2];
float globalY=值[5];
float imageWidth=值[0]*image.getWidth();
float imageHeight=值[4]*image.getHeight();
设置边界((int)globalX,(int)globalY,(int)imageWidth,(int)imageHeight);
Log.d(“垂直视图”,“aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;
Log.d(“垂直视图”,“aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;
Log.d(“垂直视图”,“aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;
Log.d(“垂直视图”,“aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;
Log.d(“VerticalLabelView”,“aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;
Log.d(“VerticalLabelView”,“aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;
Log.d(“VerticalLabelView”,“aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;
Log.d(“VerticalLabelView”,“aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;
}
打破
//  }
}
}
/*Log.d(“VerticalLabelView”,“aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;
Log.d(“垂直视图”,“aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;
Log.d(“垂直视图”,“aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;
Log.d(“垂直视图”,“aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*/
处理退货;
}

尝试以下将图像旋转90度的代码

Matrix matrix = new Matrix();
matrix = collisionImage.getImageMatrix();
//collisionImage is ImageView
Log.i("matrix coordinate rotate 1 collision ", "" + matrix.toString());
Matrix maxMatrix = new Matrix();
maxMatrix.setRotate(ROTATIONByNinety, collisionBitmap.getWidth() / 2, collisionBitmap.getHeight() / 2);
Bitmap newBitmap = Bitmap.createBitmap(collisionBitmap, 0, 0, (int) collisionBitmap.getWidth(), (int) collisionBitmap.getHeight(), maxMatrix, true);
collisionImage.setImageBitmap(newBitmap);
ROTATIONByNinety = ROTATIONByNinety + 90;
if (ROTATIONByNinety == 360) {
    ROTATIONByNinety = 0;
}
// changeImage(newBitmap);
Log.i("maxMatrix coordinate rotate 2 collision", maxMatrix.toString());
Log.i("matrix coordinate rotate 2 collision", matrix.toString());
collisionImage.setImageMatrix(matrix);
collisionImage.invalidate();

我正在使用SurfaceView而不是ImageView检查此问题。