Autore Topic: Touch Event su disegno canvas  (Letto 2281 volte)

Offline menion83

  • Nuovo arrivato
  • *
  • Post: 45
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Motorola Milestone - Samsung Galaxy Tab - Samsung Galaxy S - LG Optimus One - HTC Dream
  • Sistema operativo:
    Windows 7 Ultimate 32/64 - Ubuntu 10.10
Touch Event su disegno canvas
« il: 27 Settembre 2012, 18:16:30 CEST »
0
Ciao Ragazzi!
Sto cercando di disegnare una planimetria di una casa e la mia intenzione è quella di creare la pianta della casa attraverso le coordinate e la misura dei muri e poi cliccando su uno degli ambienti, caricare la foto reale della stanza.
Per il momento ho fatto due activity, quella principale

Codice (Java): [Seleziona]
 
public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new MyView(this));
    }

e quella che contiene il disegno degli ambienti

Codice (Java): [Seleziona]
public class MyView extends View {
 
 Paint paint;
 Path path;

 public MyView(Context context) {
  super(context);  
 }
 
 public MyView(Context context, AttributeSet attrs) {
  super(context, attrs);
 }
 
 public MyView(Context context, AttributeSet attrs, int defStyle) {
  super(context, attrs, defStyle);
 }
 
 @Override
 protected void onDraw(Canvas canvas) {
  // TODO Auto-generated method stub     
  super.onDraw(canvas);

        paint = new Paint();
        path= new Path();
       
        //BAGNO        
        paint.setColor(Color.RED);
        paint.setStyle(Paint.Style.FILL);
        path.moveTo(320,0);
        path.lineTo(320,229);
        path.lineTo(578,229);
        path.lineTo(578,0);        
        canvas.drawPath(path, paint);
        path.reset();                  
 }
}

In questo modo riesco a disegnare l'ambiente con le coordinate reali della planimetria. Come posso fare però a differenziare lo schermo in modo tale da cliccare su un ambiente e aprirne il dettaglio?
Sono giorni che ci sto combattendo e spero vivamente in un vostro aiuto!
CIAOO!

Offline topix93

  • Utente junior
  • **
  • Post: 84
  • Respect: +1
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    LG Optimus ONE
  • Sistema operativo:
    Windows 7 Professional 64 bit, Ubuntu 11.04
Re:Touch Event su disegno canvas
« Risposta #1 il: 28 Settembre 2012, 16:34:17 CEST »
0
postresti fare un rettangolo per ogni ambiente... ogni rettangolo lo salvi in un arraylist.
nell'activity dove imposti la tua View fai una cosa del genere:
Codice (Java): [Seleziona]
public class AAA extends Activity {

        private MyView view;

        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                gestureDetector = new GestureDetector(new MyGestureDetector());
                gestureListener = new View.OnTouchListener() {

                        public boolean onTouch(View v, MotionEvent event) {
                                return gestureDetector.onTouchEvent(event);
                        }
                };

                view = new MyView();
                view.setOnTouchListener(gestureListener);
                setContentView(MyView);
        }

class MyGestureDetector extends SimpleOnGestureListener {
               
        @Override
        public boolean onSingleTapUp(MotionEvent event) {

                float touchX = event.getX();
                 float touchY = event.getY();


                ArrayList<RectF> rettangoli = ripianoView.getRettangoli();

                while (i < rettangoli.size()-1 && !rettangoli.get(i).contains(touchX, touchY)){
               // .......
                //.......
                }
                //qua fai quello che devi fare
        }
}

Offline menion83

  • Nuovo arrivato
  • *
  • Post: 45
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Motorola Milestone - Samsung Galaxy Tab - Samsung Galaxy S - LG Optimus One - HTC Dream
  • Sistema operativo:
    Windows 7 Ultimate 32/64 - Ubuntu 10.10
Re:Touch Event su disegno canvas
« Risposta #2 il: 28 Settembre 2012, 16:55:37 CEST »
0
Ciao,
il problema è capire le coordinate dei rettangoli perchè si corre il rischio di sovrapporre ambienti adiacenti...
Stavo pensando di utilizzare questo codice qua..

Codice (Java): [Seleziona]
 public boolean onTouchEvent(MotionEvent event){
            int action = event.getAction();
            int x = (int)event.getX();  // or getRawX();
            int y = (int)event.getY();  // or getRawY();

            switch(action){
            case MotionEvent.ACTION_DOWN:
                if (x >= 100 && x < 400 && y >= 400 && y < 400) {                  
                        Intent i = new Intent(this, bagno.class);
                        startActivity(i);
                   return false;
                }
                break;
            }
                return false;
        }

Con questo riesco ad aprire il dettaglio ma ho messo a mano delle coordinate per provare il codice di onTouchEvent... al posto dei valori manuali dovrei mettere invece il perimetro dell'oggetto che disegno ma non so che pesci pigliare..

Qualche aiuto in merito?
L'idea di suddividere in rettangoli va bene ma forse posso riuscire salvando il canvas creato come immagine e mettere il touch event sull'immagine... sinceramente non so neanche se si può fare...

Grazie per l'aiuto!
Proverò il codice! ;)
CIAO!

Offline topix93

  • Utente junior
  • **
  • Post: 84
  • Respect: +1
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    LG Optimus ONE
  • Sistema operativo:
    Windows 7 Professional 64 bit, Ubuntu 11.04
Re:Touch Event su disegno canvas
« Risposta #3 il: 28 Settembre 2012, 17:09:04 CEST »
0
il problema è anche che con quel metodo diventa un po complicato gestire tutti gli if else

Offline undead

  • Utente senior
  • ****
  • Post: 666
  • Respect: +113
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S6
  • Play Store ID:
    DrKappa
  • Sistema operativo:
    Windows 10 64-bit, Windows 8.1 64-bit
Re:Touch Event su disegno canvas
« Risposta #4 il: 28 Settembre 2012, 17:28:37 CEST »
0
Io farei così:

1- crei una bitmap della dimensione dello schermo
2- la filli di nero cioè 0.
3- per ogni rettangolo che disegni su schermo disegni un rettangolo anche nella tua bitmap ma lo disegni con colore N. Cioè il primo rettangolo ha colore 1, il secondo colore 2 il terzo colore 3.
4- quando leggi un evento touch alle coordinate x,y tu fai una getpixel dalla bitmap alle coordinate x,y e "automaGicamente" hai il numero della stanza, con test preciso al pixel (potrebbe funzionare per stanze circolari, a punta, a stella, per stanze che si intersecano etc). Il tutto senza nemmeno un if.

 ;-)

Offline menion83

  • Nuovo arrivato
  • *
  • Post: 45
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Motorola Milestone - Samsung Galaxy Tab - Samsung Galaxy S - LG Optimus One - HTC Dream
  • Sistema operativo:
    Windows 7 Ultimate 32/64 - Ubuntu 10.10
Re:Touch Event su disegno canvas
« Risposta #5 il: 01 Ottobre 2012, 12:30:24 CEST »
0
Io farei così:

1- crei una bitmap della dimensione dello schermo
2- la filli di nero cioè 0.
3- per ogni rettangolo che disegni su schermo disegni un rettangolo anche nella tua bitmap ma lo disegni con colore N. Cioè il primo rettangolo ha colore 1, il secondo colore 2 il terzo colore 3.
4- quando leggi un evento touch alle coordinate x,y tu fai una getpixel dalla bitmap alle coordinate x,y e "automaGicamente" hai il numero della stanza, con test preciso al pixel (potrebbe funzionare per stanze circolari, a punta, a stella, per stanze che si intersecano etc). Il tutto senza nemmeno un if.

 ;-)

Ciao!
automaGicamente brevettalo prima che te lo ruba l'Apple ahaha
Stavo "giocando" con quello che hai detto di fare, l'idea mi piace però mi sto impantanando..
Ho creato la bitmap nera prendendo le misure dello schermo.
Disegno i locali della planimetria come nel primo post ma poi mi blocco quando devo disegnarlo sul bitmap.
Qualche esempio?
;)
Grazie per l'aiuto!

Offline undead

  • Utente senior
  • ****
  • Post: 666
  • Respect: +113
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S6
  • Play Store ID:
    DrKappa
  • Sistema operativo:
    Windows 10 64-bit, Windows 8.1 64-bit
Re:Touch Event su disegno canvas
« Risposta #6 il: 01 Ottobre 2012, 14:47:37 CEST »
0
eheheh.

Allora è molto semplice.
Crei la bitmap poi crei un canvas passando la bitmap al costruttore.

Tipo:

Codice (Java): [Seleziona]
Canvas myCanvas = new Canvas(myBitmap);
A quel punto puoi tranquillamente disegnare sul canvas esattamente con le stesse funzioni che useresti per il canvas dello schermo.  ;-)

Offline menion83

  • Nuovo arrivato
  • *
  • Post: 45
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Motorola Milestone - Samsung Galaxy Tab - Samsung Galaxy S - LG Optimus One - HTC Dream
  • Sistema operativo:
    Windows 7 Ultimate 32/64 - Ubuntu 10.10
Re:Touch Event su disegno canvas
« Risposta #7 il: 02 Ottobre 2012, 11:03:33 CEST »
0
Ciao!
Forse sbaglio qualcosa ma quando provo a disegnare lo schermo è sempre nero...

Cosi mi preparo la bitmap

Codice (Java): [Seleziona]
 Bitmap.Config conf = Bitmap.Config.ARGB_8888;
 Bitmap bmp = Bitmap.createBitmap(screenWidth,screenHeight, conf);             
 canvas = new Canvas(bmp);

e cosi mi disegno il locale della planimetria

Codice (Java): [Seleziona]
//BAGNO
  paint.setColor(Color.RED);
  paint.setStyle(Paint.Style.FILL);
  path.moveTo(bagnoPath[0].x, bagnoPath[0].y);
  for (int i = 1; i < bagnoPath.length; i++) {
        path.lineTo(bagnoPath[i].x, bagnoPath[i].y);
        }
  canvas.drawPath(path, paint);
  path.reset();

Lo schermo però rimane sempre nero...
dove sbaglio?
CIAOO

Offline undead

  • Utente senior
  • ****
  • Post: 666
  • Respect: +113
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S6
  • Play Store ID:
    DrKappa
  • Sistema operativo:
    Windows 10 64-bit, Windows 8.1 64-bit
Re:Touch Event su disegno canvas
« Risposta #8 il: 02 Ottobre 2012, 12:43:26 CEST »
0
Non sbagli nel senso che la bitmap ti serve solo per poi rileggere il numero della stanza.
La bitmap non si deve vedere.

Tu disegni sullo schermo e poi disegni anche sulla bitmap con un colore differente in modo poi da rileggerti il numero di stanza con una getpixel sulla bitmap "nascosta".  ;-)

Offline c47

  • Nuovo arrivato
  • *
  • Post: 9
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Tab 2 10"
  • Sistema operativo:
    Windows 8
Re:Touch Event su disegno canvas
« Risposta #9 il: 17 Maggio 2013, 17:00:52 CEST »
0
Come si fa a disegnare un rettangolo sulla Bitmap? Per il canvas so che si usa il drawRect(..)