Autore Topic: traslare canvas su una View mentre viene scalata  (Letto 1420 volte)

Offline adri156

  • Nuovo arrivato
  • *
  • Post: 3
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    s3
  • Sistema operativo:
    4.3
traslare canvas su una View mentre viene scalata
« il: 30 Ottobre 2014, 00:42:43 CET »
0
Salve ragazzi ,

ho un problema con una mappa(View ) dove all'interno disegno dei marker (o punti di intesse) con il metodo canvas   canvas.drawBitmap(marker , x , y , null);

non ho problemi a traslare e ruotare i marker in base alla posizione della mappa quando viene traslata e ruotata manualmente
invece ho problemi quando la mappa viene scalata(zoom+/zoom-) perchè utlizzo il metodo:

canvas.scale(mScaleFactor , mScaleFactor , mFocusX , mFocusY);
il quale mi mantiene la posizione corretta dei marker ma me li scala(ingrandisce) in base al mScaleFactor

vorrei riposizionare i marker nella loro posizione sulla mappa non ingrandendo il marker.

C'è una soluzione ???  Grazie in anticipo

Offline tonno16

  • Utente storico
  • *****
  • Post: 1228
  • Respect: +59
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:traslare canvas su una View mentre viene scalata
« Risposta #1 il: 30 Ottobre 2014, 07:14:40 CET »
0
Non ti conviene aggiungere marker normalmente?

Offline adri156

  • Nuovo arrivato
  • *
  • Post: 3
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    s3
  • Sistema operativo:
    4.3
Re:traslare canvas su una View mentre viene scalata
« Risposta #2 il: 30 Ottobre 2014, 10:54:13 CET »
0
cioè ?? quelli di google ??    sto usando mappe interne di edifici

Offline arlabs

  • Utente normale
  • ***
  • Post: 434
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS6, Nexus5
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Re:traslare canvas su una View mentre viene scalata
« Risposta #3 il: 30 Ottobre 2014, 11:00:07 CET »
0
Scusa, ma nel canvas disegni sia la mappa che i marker o solo i marker?

Perché nel secondo caso potresti evitare di usare le trasformazioni del canvas (matrix o scale che sia) e trasformarti direttamente le coordinate x,y di ogni marker.
E cmq, potresti sempre riportari a questo secondo caso usando 2 canvas.

Ciao

Offline adri156

  • Nuovo arrivato
  • *
  • Post: 3
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    s3
  • Sistema operativo:
    4.3
Re:traslare canvas su una View mentre viene scalata
« Risposta #4 il: 30 Ottobre 2014, 12:14:00 CET »
0
questa è la classe TouchActivity
Codice (Java): [Seleziona]
public class TouchActivity extends Activity implements OnTouchListener {

        private Matrix mMatrix = new Matrix();
        public static float mScaleFactor = .4f;
    public static float mRotationDegrees = 0.f;
    public static float mFocusX = 0.f;
    public static float mFocusY = 0.f;  
    private int mAlpha = 255;
    private int mImageHeight, mImageWidth;
    private ScaleGestureDetector mScaleDetector;
    private RotateGestureDetector mRotateDetector;
    private MoveGestureDetector mMoveDetector;
    private ShoveGestureDetector mShoveDetector;

        @SuppressWarnings("deprecation")
        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);

                // Determine the center of the screen to center 'earth'
                Display display = getWindowManager().getDefaultDisplay();
                mFocusX = display.getWidth()/2f;
                mFocusY = display.getHeight()/2f;
               
                // Set this class as touchListener to the ImageView
                NMImageView view = (NMImageView) findViewById(R.id.imageView);
                view.image =  BitmapFactory.decodeResource(this.getResources(), R.drawable.mappa);
                view.setOnTouchListener(this);
               
                // Determine dimensions of 'earth' image
                Drawable d              = this.getResources().getDrawable(R.drawable.mappa);
                mImageHeight    = d.getIntrinsicHeight();
                mImageWidth     = d.getIntrinsicWidth();

                // View is scaled and translated by matrix, so scale and translate initially
        float scaledImageCenterX = (mImageWidth*mScaleFactor)/2;
        float scaledImageCenterY = (mImageHeight*mScaleFactor)/2;
       
                mMatrix.postScale(mScaleFactor, mScaleFactor);
                mMatrix.postTranslate(mFocusX - scaledImageCenterX, mFocusY - scaledImageCenterY);
                view.setImageMatrix(mMatrix);

                // Setup Gesture Detectors
                mScaleDetector  = new ScaleGestureDetector(getApplicationContext(), new ScaleListener());
                mRotateDetector = new RotateGestureDetector(getApplicationContext(), new RotateListener());
                mMoveDetector   = new MoveGestureDetector(getApplicationContext(), new MoveListener());
                mShoveDetector  = new ShoveGestureDetector(getApplicationContext(), new ShoveListener());
           
               
           
        }
       
        @SuppressWarnings("deprecation")
        public boolean onTouch(View v, MotionEvent event) {
        mScaleDetector.onTouchEvent(event);
        mRotateDetector.onTouchEvent(event);
        mMoveDetector.onTouchEvent(event);
        mShoveDetector.onTouchEvent(event);

        float scaledImageCenterX = (mImageWidth*mScaleFactor)/2;
        float scaledImageCenterY = (mImageHeight*mScaleFactor)/2;
       
       
        mMatrix.reset();
        mMatrix.postScale(mScaleFactor, mScaleFactor);
        mMatrix.postRotate(mRotationDegrees,  scaledImageCenterX, scaledImageCenterY);
        mMatrix.postTranslate(mFocusX - scaledImageCenterX, mFocusY - scaledImageCenterY);
       
                NMImageView view = (NMImageView) v;
                Point p = new Point();
                p.x = (int)scaledImageCenterX;
                p.y = (int) scaledImageCenterY;
                view.mTouches.add(p);
                view.setImageMatrix(mMatrix);
                //view.setAlpha(mAlpha);
               
                return true; // indicate event was handled
        }

        private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
                @Override
                public boolean onScale(ScaleGestureDetector detector) {
                        mScaleFactor *= detector.getScaleFactor(); // scale change since previous event
                       
                        // Don't let the object get too small or too large.
                        mScaleFactor = Math.max(0.1f, Math.min(mScaleFactor, 10.0f));
                       
                        return true;
                }
        }
       
        private class RotateListener extends RotateGestureDetector.SimpleOnRotateGestureListener {
                @Override
                public boolean onRotate(RotateGestureDetector detector) {
                        mRotationDegrees -= detector.getRotationDegreesDelta();
                        return true;
                }
        }      
       
        private class MoveListener extends MoveGestureDetector.SimpleOnMoveGestureListener {
                @Override
                public boolean onMove(MoveGestureDetector detector) {
                        PointF d = detector.getFocusDelta();
                        mFocusX += d.x;
                        mFocusY += d.y;        

                        // mFocusX = detector.getFocusX();
                        // mFocusY = detector.getFocusY();
                        return true;
                }
        }              
       
        private class ShoveListener extends ShoveGestureDetector.SimpleOnShoveGestureListener {
                @Override
                public boolean onShove(ShoveGestureDetector detector) {
                        mAlpha += detector.getShovePixelsDelta();
                        if (mAlpha > 255)
                                mAlpha = 255;
                        else if (mAlpha < 0)
                                mAlpha = 0;
                       
                        return true;
                }
        }      

}


e questa la classe NMImageView dove vado ad usare il canvas

Codice (Java): [Seleziona]
@SuppressLint({ "WrongCall", "ClickableViewAccessibility" })
public class NMImageView extends ImageView {

       

        private Bitmap mMarker;
        public Bitmap image;
        private Context context;
        private float x = 0, y = 0;
        private float gradi = 0, vx = 0, vy = 0, scala = 0, cont = 0;
        private float vxstart = 0, vystart = 0;
        private float vxstatic = 0, vystatic = 0;
        private float vxfinal = 0, vyfinal = 0;
        float[] vet = { 200, 500, 350, 630, 380, 500,450,500 };
        Bitmap marker = BitmapFactory.decodeResource(getResources(),
                        R.drawable.point);

       
        // Java constructor
        public NMImageView(Context context) {
                super(context);
                 this.context = context;
                init();
        }

        // XML constructor
        public NMImageView(Context context, AttributeSet attrs) {
                super(context, attrs);
                this.context = context;
                init();
        }

        private void init() {

               
        }

        @Override
        protected void onDraw(Canvas c) {
                // Let the image be drawn first
                super.onDraw(c);
                if (cont == 0) {
                        vxstart = TouchActivity.mFocusX;
                        vystart = TouchActivity.mFocusY;
                        cont++;
                }
               
               
                gradi = TouchActivity.mRotationDegrees;
                vx = TouchActivity.mFocusX;
                vy = TouchActivity.mFocusY;
                scala = TouchActivity.mScaleFactor;
               
               
               
                 c.rotate(gradi, vx, vy);
                 c.scale(scala,scala,vx,vy);
                       
               
               
                for (int i = 0; i < vet.length; i = i + 2) {

                          vxstatic = vet[i];
                         vystatic = vet[i + 1];
                        vxfinal = (vxstatic - (vxstart - vx));
                         vyfinal = (vystatic - (vystart - vy));
                                               
                        c.drawBitmap(marker, vxfinal, vyfinal, null);                          

                }
               
               
                invalidate();

               
        }

}

questo è il codice . mi servirebbe riposizionare i punti quando la mappa viene scalata,
 al posto della funzione canvas.scale() che mi riposiziona e ingrandisce i punti