ANDROID - Прокрутка, мультитач, панорамирование ImageView в виджете Галерея - PullRequest
3 голосов
/ 01 апреля 2011
public class PageGallery extends Gallery implements OnScaleGestureListener, OnGestureListener{

private static final String TAG = "Multitouch eventi";
static final int NONE = 0;
static final int DRAG = 1;  
int mode = NONE;

private Context c;
private final LayoutInflater mInflater;

private ScaleGestureDetector mScaleDetector;
private GestureDetector mDetector;
private float mScaleFactor = 1.f;

float nuova_distanza_tocchi, vecchia_distanza_tocchi, init_x, init_y;

Matrix matrix = new Matrix();
Matrix savedMatrix = new Matrix();

PointF mid = new PointF();
PointF start = new PointF();

ImageView pagina;


public PageGallery(Context context, AttributeSet atSet) {
    super(context, atSet);
    mInflater = LayoutInflater.from(context);
    c = context;
    mDetector = new GestureDetector(c,this);
    mScaleDetector = new ScaleGestureDetector(c, this);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    pagina = (ImageView) super.getSelectedView();

    if (mDetector.onTouchEvent(event)) { // gesure detector per i movimenti
        Log.d("onTouchEvent", "--[ MOVIMENTO ]--");
        switch (event.getAction() & MotionEvent.ACTION_MASK) {
        case MotionEvent.ACTION_DOWN:
            init_x = event.getX();
            init_y = event.getY();
            midPoint(mid, event);
            savedMatrix.set(matrix);
            start.set(event.getX(), event.getY());
            mode = DRAG;
            break;
        case MotionEvent.ACTION_MOVE:
            if (mode == DRAG) {
                matrix.set(savedMatrix);
                matrix.postTranslate(event.getX() - start.x, event.getY() - start.y);
            }
            break;
        }

        pagina = (ImageView) super.getSelectedView();
        pagina.setImageMatrix(matrix);

        return true;
    }
    else if(mScaleDetector.onTouchEvent(event)) { // scale detector per lo zoom
        Log.d("onTouchEvent", "--[ SCALE ]--");
        return true;
    }
    else 
        return false;
}


public boolean onScaleBegin(ScaleGestureDetector detector) {
    Log.d(TAG, "-- onScaleBegin --");
    matrix = pagina.getImageMatrix();
    savedMatrix.set(matrix);
    start.set(init_x, init_y);
    return true;
}

public boolean onScale(ScaleGestureDetector detector) {

    mScaleFactor *= detector.getScaleFactor();
    mScaleFactor = Math.max(0.1f, Math.min(mScaleFactor, 5.0f));

    if (nuova_distanza_tocchi > 10f) {
        matrix.set(savedMatrix);
        matrix.postScale(mScaleFactor, mScaleFactor, mid.x, mid.y);
        Log.d("ZOOMMING",matrix.toShortString());
    }
    else {
        matrix.set(savedMatrix);
        matrix.postTranslate(init_x - start.x, init_y - start.y);
        Log.d("PANNING",matrix.toShortString());
    }

    pagina.setImageMatrix(matrix);

    pagina.invalidate();

    Log.d("MATRIX", matrix.toString());
    return true;
}

public void onScaleEnd(ScaleGestureDetector detector) {
    Log.d(TAG, "-- onScaleEnd --");
    vecchia_distanza_tocchi = detector.getPreviousSpan();
    nuova_distanza_tocchi = detector.getCurrentSpan();
}


@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
    Log.d(TAG, "-- onFling --");

    float velMax = 2500f;
    float velMin = 1000f;
    float velX = Math.abs(velocityX);
    if (velX > velMax) {
      velX = velMax;
    } else if (velX < velMin) {
      velX = velMin;
    }
    velX -= 600;
    int k = 500000;
    int speed = (int) Math.floor(1f / velX * k);
    setAnimationDuration(speed);

    int kEvent;
    if (isScrollingLeft(e1, e2)) {
      kEvent = KeyEvent.KEYCODE_DPAD_LEFT;
    } else {
      kEvent = KeyEvent.KEYCODE_DPAD_RIGHT;
    }
    onKeyDown(kEvent, null);

    return true;
}

@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
    Log.d(TAG, "-- onScroll --");
    return super.onScroll(e1, e2, distanceX, distanceY);
}


private boolean isScrollingLeft(MotionEvent e1, MotionEvent e2){
    return e2.getX() > e1.getX();
}


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);
}
}

Я расширяю Галерею, которая реализует onScaleGestureListener, и я устанавливаю onItemClickListener в основной деятельности.

Этот код работает нормально: я могу ущипнуть, чтобы увеличить все изображения в моей галерее, и я могу панорамировать изображение, которое я увеличил. Но как я могу отключить прокрутку галереи, когда я увеличиваю изображение, а затем включаю тоже? Извините за мой плохой английский Thnks!

1 Ответ

1 голос
/ 28 июня 2011

Я думаю, что вы должны использовать вызов метода dispatchTouchEvent() в классе, который вы хотите обработать событие 'touch', вместо Gallery

...