Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/235.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当我旋转位图时,它会在android中自动缩放_Android_Bitmap_Rotation_Scale - Fatal编程技术网

当我旋转位图时,它会在android中自动缩放

当我旋转位图时,它会在android中自动缩放,android,bitmap,rotation,scale,Android,Bitmap,Rotation,Scale,我试图设置最小和最大比例因子,但当我设置它时,在某种程度上旋转会自动缩放位图。我如何解决这个问题 以下是我在位图上对TouchEvent执行的代码: @Override public boolean onTouchEvent(MotionEvent event) { int action = MotionEventCompat.getActionMasked(event); boolean handled = true; switch (action) {

我试图设置最小和最大比例因子,但当我设置它时,在某种程度上旋转会自动缩放位图。我如何解决这个问题

以下是我在位图上对TouchEvent执行的代码:

@Override
public boolean onTouchEvent(MotionEvent event) {
    int action = MotionEventCompat.getActionMasked(event);
    boolean handled = true;

    switch (action) {

        case MotionEvent.ACTION_POINTER_DOWN:
            oldDis = spacing(event);
            if (oldDis > 10f) {
                savedMatrix.set(matrix);
                midPoint(event);
                lastRotateDegree = rotation(event);
                isPointerDown = true;
            } else {
                isPointerDown = false;
            }
            isInSide = false;
            isInResize = false;
            break;

        case MotionEvent.ACTION_POINTER_UP:
            isPointerDown = false;
            break;

        case MotionEvent.ACTION_MOVE:
            if (isPointerDown) {
                matrix.set(savedMatrix);

                //Two-finger rotate
                if(event.getPointerCount() == 2) {
                    float newRot = rotation(event);
                    float r = newRot - lastRotateDegree;
                    matrix.postRotate(r, mid.x, mid.y);
                }

                //Two-finger scaling
                float scale;
                float disNew = spacing(event);
                if (disNew == 0 || disNew < 10f) {
                    scale = 1;
                } else {
                    scale = disNew / oldDis;
                }
                matrix.postScale(scale, scale, mid.x, mid.y);

                matrix.getValues(arrayOfMatrix);
                float scaleX = arrayOfMatrix[Matrix.MSCALE_X];
                float scaleY = arrayOfMatrix[Matrix.MSCALE_Y];

                if(scaleX <= 0.7f || scaleY <= 0.7f) {
                    matrix.postScale((0.7f)/scaleX, (0.7f)/scaleY, mid.x, mid.y);
                } else if(scaleX >= 2.5f || scaleY >= 2.5f) {
                    matrix.postScale((2.5f)/scaleX, (2.5f)/scaleY, mid.x, mid.y);
                }

                invalidate();

            }
            break;
    }

public void midPoint(MotionEvent event) {
    float x = event.getX(0) + event.getX(1);
    float y = event.getY(0) + event.getY(1);
    mid.set(x / 2, y / 2);
}

private float rotation(MotionEvent event) {
    double delta_x = (event.getX(0) - event.getX(1));
    double delta_y = (event.getY(0) - event.getY(1));
    double radians = Math.atan2(delta_y, delta_x);
    return (float) Math.toDegrees(radians);
}

private float spacing(MotionEvent event) {
    if (event.getPointerCount() == 2) {
        float x = event.getX(0) - event.getX(1);
        float y = event.getY(0) - event.getY(1);
        return (float) Math.sqrt(x * x + y * y);
    } else {
        return 0;
    }
}
@覆盖
公共布尔onTouchEvent(运动事件){
int action=MotionEventCompat.getActionMasked(事件);
布尔值=真;
开关(动作){
case MotionEvent.ACTION\u指针\u向下:
oldDis=间隔(事件);
如果(oldDis>10f){
savedMatrix.set(矩阵);
中点(事件);
LastRotateGreee=旋转(事件);
isPointerDown=真;
}否则{
isPointerDown=假;
}
isInSide=假;
isInResize=假;
打破
case MotionEvent.ACTION\u指针\u向上:
isPointerDown=假;
打破
case MotionEvent.ACTION\u移动:
如果(isPointerDown){
矩阵集(savedMatrix);
//双指旋转
if(event.getPointerCount()==2){
float newRot=旋转(事件);
浮动r=新旋转-最后旋转梯度;
矩阵。旋转后(r、中间x、中间y);
}
//双指标度
浮标;
float disNew=间隔(事件);
如果(disNew==0 | | disNew<10f){
比例=1;
}否则{
比例=新/旧DIS;
}
矩阵。后标度(标度、标度、中x、中y);
矩阵。获取值(arrayOfMatrix);
float scaleX=arrayOfMatrix[Matrix.MSCALE_X];
float scaleY=arrayOfMatrix[Matrix.MSCALE_Y];
如果(scaleX=2.5f){
矩阵。后标度((2.5f)/scaleX,(2.5f)/scaleY,mid.x,mid.y);
}
使无效();
}
打破
}
公共无效中点(MotionEvent事件){
float x=event.getX(0)+event.getX(1);
float y=event.getY(0)+event.getY(1);
中置(x/2,y/2);
}
专用浮点旋转(MotionEvent){
double delta_x=(event.getX(0)-event.getX(1));
double delta_y=(event.getY(0)-event.getY(1));
双弧度=Math.atan2(δy,δx);
返回(浮点)数学到度(弧度);
}
专用浮动间距(MotionEvent事件){
if(event.getPointerCount()==2){
float x=event.getX(0)-event.getX(1);
float y=event.getY(0)-event.getY(1);
返回(浮点)数学sqrt(x*x+y*y);
}否则{
返回0;
}
}

您的代码中没有位图实例,位图实例在onDraw()方法中,这里我们不需要位图实例。当使用矩阵调用invalidate()时,位图在画布上绘制。这只是视图的一部分。好的,请随意使用。