2014-12-18 2 views
1

Я использовал пользовательский вид с классом ScaleGestureDectector. Моя проблема в том, что когда я увеличиваю масштаб в 4,5 раза, мой пользовательский макет не может быть уменьшен.Невозможно уменьшить масштаб после слишком большого увеличения при использовании ScaleGestureDetector

Вот мой код:

private class ScaleGestureListener 
      extends ScaleGestureDetector.SimpleOnScaleGestureListener { 

    @Override 
    public boolean onScale(ScaleGestureDetector detector) { 
     float scaleFactor = mScaleFactor * detector.getScaleFactor(); 

     mScaleFactor = scaleFactor; 
     setScaleX(getScaleX() * mScaleFactor); 
     setScaleY(getScaleY() * mScaleFactor); 

     invalidate(); 
     return true; 
    } 

Любые решения по этому вопросу? Я хочу, чтобы увеличить мой макет по крайней мере 4.5x

ответ

-1

Вместо:

float scaleFactor = mScaleFactor * detector.getScaleFactor(); 

ли это:

float scaleFactor = Math.max(4.5F, mScaleFactor * detector.getScaleFactor()); 

Это гарантирует, что минимальный коэффициент масштабирования масштаб 4,5

EDIT: Я неправильно понял ваш вопрос. Кажется, вы не должны отслеживать mScaleFactor. API-интерфейсы делают тяжелую работу для вас. Согласно API, getScaleFactor() возвращает the scaling factor from the previous scale event to the current event.

Итак, когда вы отслеживать mScaleFactor в поле, вот что идет не так:

// With these two lines, you're multiplying the variable mScaleFactor. 
// Suppose that it was 3, and we're zooming out by 0.66666666 
// Now, mScaleFactor is 2. 
float scaleFactor = mScaleFactor * detector.getScaleFactor(); 
mScaleFactor = scaleFactor; 

// Here, you're multiplying scaleX and scaleY by mScaleFactor (by 2. This effectively zooms in) 
// You should only be multiplying them by 0.666666666 (effectively zooming out). 
setScaleX(getScaleX() * mScaleFactor); 
setScaleY(getScaleY() * mScaleFactor); 

invalidate(); 
return true; 

Так что ваше тело должно быть просто так:

public boolean onScale(ScaleGestureDetector detector) { 
    float scaleFactor = detector.getScaleFactor(); 

    setScaleX(getScaleX() * scaleFactor); 
    setScaleY(getScaleY() * scaleFactor); 

    invalidate(); 
    return true; 
} 
+0

Это не работает, когда я увеличиваю масштаб в 3,5 раза, очень сложно уменьшить масштаб – knighthedspi

Смежные вопросы