2

UI に TextView、Button、ImageView、View などの 3 ~ 4 個のビューがあり、特定のビューのみをズームイン/ズームアウトしたい。この機能は達成しましたが、ピンチするとビューがちらつきます。同じための私のコードは次のとおりです:-参照用にこのチュートリアルに従いました

public void zoom(View v, Float scaleX, Float scaleY, PointF pivot) {
        v.setPivotX(pivot.x);
        v.setPivotY(pivot.y);
        v.setScaleX(scaleX);
        v.setScaleY(scaleY);
    }

    Matrix matrix = new Matrix();

    // We can be in one of these 3 states

    static final int DRAG = 1;

    // Remember some things for zooming
    PointF last = new PointF();
    PointF start = new PointF();
    float minScale = 1f;
    float maxScale = 3f;
    float[] m;

    float redundantXSpace, redundantYSpace;

    float width, height;
    static final int CLICK = 3;
    float saveScale = 1f;
    float right, bottom, origWidth, origHeight, bmWidth, bmHeight;

    // Definition of the touch states
    static final int NONE = 0;
    static final int ONE_FINGER_DRAG = 1;
    static final int TWO_FINGERS_DRAG = 2;
    int mode = NONE;

    PointF firstFinger;
    float lastScrolling;
    float distBetweenFingers;
    float lastZooming;

     PointF mid = new PointF();

     float oldDist = 1f;
     PointF oldDistPoint = new PointF();
    // We can be in one of these 2 states

    static final int ZOOM = 1;

    static final int MIN_FONT_SIZE = 10;
    static final int MAX_FONT_SIZE = 50;

    float scalex, scaley = 0;

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        switch (event.getAction() & MotionEvent.ACTION_MASK) {
        case MotionEvent.ACTION_DOWN: // Start gesture
            firstFinger = new PointF(event.getX(), event.getY());
            mode = ONE_FINGER_DRAG;
            break;
        case MotionEvent.ACTION_UP:
            mode = NONE;
            break;
        case MotionEvent.ACTION_POINTER_UP:
            mode = NONE;
            break;
        case MotionEvent.ACTION_POINTER_DOWN: // second finger
            oldDist = spacing(event);
            distBetweenFingers = spacing(event);
            // the distance check is done to avoid false alarms
            if (distBetweenFingers > 5f) {
                mode = TWO_FINGERS_DRAG;
            }
            break;
        case MotionEvent.ACTION_MOVE:

            if (mode == TWO_FINGERS_DRAG) {


                PointF newDist = spacingPoint(event);
                  float newD = spacing(event);
//                Log.e(TAG, "newDist=" + newDist);
                  float[] old = new float[9];
                  float[] newm = new float[9];
//                Log.e(TAG, "x=" + old[0] + ":&:" + old[2]);
//                Log.e(TAG, "y=" + old[4] + ":&:" + old[5]);
                  float scale = newD / oldDist;
                  float scalex = newDist.x / oldDistPoint.x;
                  float scaley = newDist.y / oldDistPoint.y;
                  zoom(v,scale, scale,new PointF(0, 0));



            }
            break;
        }
        return true;
    }

    private void scroll(float pan) {

    }

    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 PointF spacingPoint(MotionEvent event) {
          PointF f = new PointF();
          f.x = event.getX(0) - event.getX(1);
          f.y = event.getY(0) - event.getY(1);
          return f;
         }
4

0 に答える 0