当我旋转位图时,它会在android中自动缩放
我试图设置最小和最大比例因子,但当我设置它时,在某种程度上旋转会自动缩放位图。我如何解决这个问题 以下是我在位图上对TouchEvent执行的代码:当我旋转位图时,它会在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) {
@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()时,位图在画布上绘制。这只是视图的一部分。好的,请随意使用。