Domanda

I have the following code inside a custom view, it's an ScaleGestureDetector and what I want to do with this is change the widht and height of the view when you pinch on the screen, but always the ScaleFactor tends to be one, I don't know how to explain it, but for a seconds the ScaleFactor is lower/upper than one and then becames one again. You can see what I'm saying in the logCat output.

Code:

public class simpleOnScaleGestureListener extends SimpleOnScaleGestureListener {
    @Override
    public boolean onScale(ScaleGestureDetector detector) {
        float ScaleFactor = 1.0f;
        ScaleFactor *= detector.getScaleFactor();

        // Don't let the object get too small or too large.
          ScaleFactor = Math.max(0.1f, Math.min(ScaleFactor, 5.0f));


        Log.d("ScaleFactor", "The ScaleFactor is "+ScaleFactor);

    return true;
    }
    @Override
    public void onScaleEnd(ScaleGestureDetector detector) {

    }
}

LogCat output:

05-29 19:37:48.019: D/ScaleFactor(7279): The ScaleFactor is 1.0247091
05-29 19:37:48.059: D/ScaleFactor(7279): The ScaleFactor is 1.0090069
05-29 19:37:48.069: D/ScaleFactor(7279): The ScaleFactor is 1.0268435
05-29 19:37:48.109: D/ScaleFactor(7279): The ScaleFactor is 1.0389019
05-29 19:37:48.119: D/ScaleFactor(7279): The ScaleFactor is 1.0236202
05-29 19:37:48.159: D/ScaleFactor(7279): The ScaleFactor is 1.0267988
05-29 19:37:48.169: D/ScaleFactor(7279): The ScaleFactor is 1.0133468
05-29 19:37:48.199: D/ScaleFactor(7279): The ScaleFactor is 1.0230283
05-29 19:37:48.219: D/ScaleFactor(7279): The ScaleFactor is 1.003792
05-29 19:37:48.599: D/ScaleFactor(7279): The ScaleFactor is 1.0
05-29 19:37:48.629: D/ScaleFactor(7279): The ScaleFactor is 1.2110677
05-29 19:37:48.639: D/ScaleFactor(7279): The ScaleFactor is 1.2486423
05-29 19:37:48.679: D/ScaleFactor(7279): The ScaleFactor is 1.0709958
05-29 19:37:48.689: D/ScaleFactor(7279): The ScaleFactor is 1.094618
05-29 19:37:49.229: D/ScaleFactor(7279): The ScaleFactor is 1.0
05-29 19:37:49.259: D/ScaleFactor(7279): The ScaleFactor is 1.2032005
05-29 19:37:49.269: D/ScaleFactor(7279): The ScaleFactor is 1.1687788
05-29 19:37:49.309: D/ScaleFactor(7279): The ScaleFactor is 1.0600644
05-29 19:37:49.319: D/ScaleFactor(7279): The ScaleFactor is 1.0608224
05-29 19:37:50.049: D/ScaleFactor(7279): The ScaleFactor is 1.0
05-29 19:37:50.079: D/ScaleFactor(7279): The ScaleFactor is 1.3738323
05-29 19:37:50.089: D/ScaleFactor(7279): The ScaleFactor is 1.1507335
05-29 19:37:50.129: D/ScaleFactor(7279): The ScaleFactor is 1.2026775
05-29 19:37:50.899: D/ScaleFactor(7279): The ScaleFactor is 1.0
05-29 19:37:50.929: D/ScaleFactor(7279): The ScaleFactor is 1.5862415
05-29 19:37:50.939: D/ScaleFactor(7279): The ScaleFactor is 1.1621073
05-29 19:37:52.559: D/ScaleFactor(7279): The ScaleFactor is 1.0
05-29 19:37:52.599: D/ScaleFactor(7279): The ScaleFactor is 1.0097717
05-29 19:37:52.599: D/ScaleFactor(7279): The ScaleFactor is 1.0186267
È stato utile?

Soluzione 2

This code is from the Android Tutorial on Dragging and Scaling, but with one crucial difference: the 'ScaleFactor' local variable (sidenote - convention is to start variable names with a lower case letter) is declared as an instance/member variable mScaleFactor for the whole class in the original code (the 'm' stands for member in Android) .

The intended result is that the line:

ScaleFactor *= detector.getScaleFactor();

will accumulate the individual event scale factors into a meaningful value over the course of the gesture, whereas in your version it resets with each call to onScale(), so you only see the momentary values created by each individual scaling event.

If this is still a bit puzzling then check out a basic Java textbook for a description of the different types of variables and their scope.

Altri suggerimenti

with

float ScaleFactor = 1.0f;

you're reseting the scale at the start of every pinch. Try a global variable.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top