Domanda

Qualcuno può aiutarmi alcune cose riguardanti mapview che sto cercando di costruire. Ho un rendering che prende la tela e ci attira una bitmap. Ho creato una vista e nel costruttore che creo:

bitmap = Bitmap.createBitmap(windowWidth, windowHeight, Bitmap.Config.ARGB_8888);
canvas = new Canvas(bitmap);
drawable = new BitmapDrawable(bitmap);
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
this.Render();

Nel metodo Ondraw ho questo:

super.onDraw(canvas);
canvas.save();
canvas.translate(mPosX, mPosY);
canvas.scale(mScaleFactor, mScaleFactor);
drawable.draw(canvas);
canvas.restore();

Ora vorrei implementare Pan and Zoom (attualmente sto lavorando senza piastrelle salvate) Ecco il mio ontouch:

mSCaleDetector.ontouchevent (ev);

final int action = ev.getAction();
switch (action & MotionEvent.ACTION_MASK) {

case MotionEvent.ACTION_DOWN: {
    this.hasPanned = false;
    final float x = ev.getX();
    final float y = ev.getY();

    mLastTouchX = x;
    mLastTouchY = y;
    mActivePointerId = ev.getPointerId(0);
    break;
}

case MotionEvent.ACTION_MOVE: {
    final int pointerIndex = ev.findPointerIndex(mActivePointerId);
    final float x = ev.getX(pointerIndex);
    final float y = ev.getY(pointerIndex);

    if (!mScaleDetector.isInProgress()) {
        final float dx = x - mLastTouchX;
        final float dy = y - mLastTouchY;

        mPosX += dx;
        mPosY += dy;

        invalidate();
    }

    mLastTouchX = x;
    mLastTouchY = y;

    break;
}

case MotionEvent.ACTION_UP: {
    mActivePointerId = INVALID_POINTER_ID;
    if (this.mDownTouchX != this.mLastTouchX && this.mDownTouchY != mLastTouchY)
        this.hasPanned = true;
    break;
}

case MotionEvent.ACTION_CANCEL: {
    mActivePointerId = INVALID_POINTER_ID;
    break;
}

case MotionEvent.ACTION_POINTER_UP: {
    final int pointerIndex = (ev.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK) 
            >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
    final int pointerId = ev.getPointerId(pointerIndex);
    if (pointerId == mActivePointerId) {
        final int newPointerIndex = pointerIndex == 0 ? 1 : 0;
        mLastTouchX = ev.getX(newPointerIndex);
        mLastTouchY = ev.getY(newPointerIndex);
        mActivePointerId = ev.getPointerId(newPointerIndex);
    }
    break;
}
}
return true;

Ecco cosa vorrei e problemi che ho:

  1. Quando vado, vorrei calcolare la distanza in pixel in modo da poter dire al mio rendering quando rende di nuovo l'immagine. Come si ottiene questo? Ricordando le coordinate su Action_Down e confrontando nuove coordinate in Action_up?
  2. Quando Pan è completo (e l'immagine viene resorizzata) vorrei riportare la tela (immagine) nella sua posizione originale. Attualmente rimane panoramico (a causa di Canvas.Translate?)
  3. Come gestisco i gesti zoom? Con questo codice quando si fa uno zoom con le dita, l'immagine viene "trascinata" verso l'angolo in alto a sinistra ...

Sono nuovo in Android (e Java), quindi qualsiasi aiuto è precoce.

Nessuna soluzione corretta

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