0
이미지가 확대되는 위치에서 오류가 발생하지만 두 손가락의 중간 점으로 확대하는 대신 확대 축소됩니다. 원본 그림. 이것은 매우 부 자연스러운 사용자 인터페이스를 생성합니다. 내 onTouchEvent와이미지를 확대/축소 할 때 이미지가 중심이 아닌 모퉁이로 조정됩니다.
@Override
protected void onDraw(Canvas canvas) {
canvas.save();
canvas.translate(mPosX, mPosY);
canvas.scale(mScaleFactor, mScaleFactor);
super.onDraw(canvas);
canvas.restore();
}
의 myScale.onTouch는 (스케일하는 것은 아니고 (PX, 플로트 평을 부동, 플로트 SX, 플로트 SY) 정보를
@Override
public boolean onTouchEvent(MotionEvent event) {
super.onTouchEvent(event);
midPoint(mid,event);
myScale.onTouchEvent(event);
switch (event.getAction() & MotionEvent.ACTION_MASK){
case MotionEvent.ACTION_DOWN: {
final float x = event.getX();
final float y = event.getY();
mode=DRAG;
// Remember where we started
mLastTouchX = x;
mLastTouchY = y;
mActivePointerId = event.getPointerId(0);
break;
}
case MotionEvent.ACTION_POINTER_DOWN: {
final float gx = myScale.getFocusX();
final float gy = myScale.getFocusY();
mLastGestureX=gx;
mLastGestureY=gy;
mode=ZOOM;
break;
}
case MotionEvent.ACTION_MOVE: {
final int pointerIndex = event.findPointerIndex(mActivePointerId);
final float x = event.getX(pointerIndex);
final float y = event.getY(pointerIndex);
// Calculate the distance moved
if(!myScale.isInProgress()){
// Move the object
final float dx = x - mLastTouchX;
final float dy = y - mLastTouchY;
mPosX += dx;
mPosY += dy;
// Remember this touch position for the next move event
// Invalidate to request a redraw
invalidate();
}
mLastTouchX = x;
mLastTouchY = y;
break;
}
I have deleted action up and action pointer up because they have nothing to do with this problems
}
invalidate();
return true;
}
private float spacing(MotionEvent event) {
float x = event.getX(0) - event.getX(1);
float y = event.getY(0) - event.getY(1);
return FloatMath.sqrt(x * x + y * y);
}
private void midPoint(PointF point, MotionEvent event) {
float x = event.getX(0) + event.getX(1);
float y = event.getY(0) + event.getY(1);
point.set(x/2, y/2);
}
private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
@Override
public boolean onScale(ScaleGestureDetector detector) {
mScaleFactor *= detector.getScaleFactor();
// Don't let the object get too small or too large.
mScaleFactor = Math.max(0.1f, Math.min(mScaleFactor, 10.0f));
float currentdist=detector.getCurrentSpan();
float last=detector.getPreviousSpan();
float ratio = currentdist/last;
mScaleFactor = Math.max(0.1f, Math.min(mScaleFactor, 5.0f));
Matrix temp = new Matrix();
temp.postScale(ratio, ratio, mid.x,mid.y);
temp.preConcat(matrix);
matrix=temp;
invalidate();
return true;
}
}
구글이 문서의 무리를 작성합니다. 사람들이 제일 먼저가는 곳이 아니라는 것은 수치스러운 일입니다. http://developer.android.com/reference/android/graphics/Canvas.html#scale(float, float, float, float) – Simon