wolfgang146 Δημοσ. 10 Νοεμβρίου 2012 Δημοσ. 10 Νοεμβρίου 2012 (επεξεργασμένο) Καλησπέρα παιδιά. Έχω μια ερώτηση για Andoid πάλι Προσπαθώ να περάσω την τιμή μιας public μεταβλητής από μια custom Κλάση σε μια Δραστηριότητα. Οι δυο τελευταίες χρησιμοποιούν κοινό xml layout. Στην κλάση ζωγραφίζω κάποια πράγματα με αφή σε ένα ImageView και θέλω να περάσω την τιμή της συντεταγμένης Χ του σημείου αφής στην Δραστηριότητα όταν ο χρήστης αγγίζει ένα σημείο. Σκέφτηκα να κάνω μια μεθοδο get στην κλάση και δημιουργώντας ένα αντικείμενο της κλάσης στην δραστηριότητα να την καλώ και να παίρνω το Χ. Δυστηχώς όμως δεν δουλεύει όπως θα περίμενα, καθώς επιστρέφει μόνο την αρχικοποιημένη τιμή του Χ που παίρνει στο Constructor και μετά δεν αλλάζει. Μήπως υπάρχει κάτι που δεν λαμβάνω υπόψη και δεν δουλεύει; Υπάρχει κάτι άλλο που θα μπορούσα να δοκιμάσω; Μπορώ να ποστάρω και κώδικα αν ευκολύνει. Ιδού το Main Activity: > public class TargetPractise extends Activity{ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.target_form); ImageView1 value = new ImageView1(TargetPractise.this); float x = value.getx(); Log.d("x",String.valueOf(x)); } } Και εδώ το Custom Class: > public class ImageView1 extends View { Context context; public float x=0; public float y=0; public float getx() { return this.x; } public ImageView1(Context context) { super(context); this.context=context; setFocusable(true); } public ImageView1(Context context, AttributeSet attrs) { super(context, attrs); this.context=context; setFocusable(true); } @Override public boolean onTouchEvent(MotionEvent event){ switch (event.getAction()){ case (MotionEvent.ACTION_DOWN): { x = event.getX(); y = event.getY(); } return true; } } @Override public void onDraw(Canvas canvas){ super.onDraw(canvas); .... } } Επεξ/σία 10 Νοεμβρίου 2012 από wolfgang146
nilosgr Δημοσ. 10 Νοεμβρίου 2012 Δημοσ. 10 Νοεμβρίου 2012 Nαι, για δωσε λιγο κωδικα... Θα μας γλυτωσει απ το να "μαντεψουμε" το λαθος...
wolfgang146 Δημοσ. 10 Νοεμβρίου 2012 Μέλος Δημοσ. 10 Νοεμβρίου 2012 Επεξεργάστηκα το αρχικό μηνυμα και πρόσθεσα λίγο κώδικα.
Directx Δημοσ. 11 Νοεμβρίου 2012 Δημοσ. 11 Νοεμβρίου 2012 Καλησπέρα παιδιά. Έχω μια ερώτηση για Andoid πάλι Προσπαθώ να περάσω την τιμή μιας public μεταβλητής από μια custom Κλάση σε μια Δραστηριότητα. Οι δυο τελευταίες χρησιμοποιούν κοινό xml layout. Στην κλάση ζωγραφίζω κάποια πράγματα με αφή σε ένα ImageView και θέλω να περάσω την τιμή της συντεταγμένης Χ του σημείου αφής στην Δραστηριότητα όταν ο χρήστης αγγίζει ένα σημείο. Σκέφτηκα να κάνω μια μεθοδο get στην κλάση και δημιουργώντας ένα αντικείμενο της κλάσης στην δραστηριότητα να την καλώ και να παίρνω το Χ. Δυστηχώς όμως δεν δουλεύει όπως θα περίμενα, καθώς επιστρέφει μόνο την αρχικοποιημένη τιμή του Χ που παίρνει στο Constructor και μετά δεν αλλάζει. Μήπως υπάρχει κάτι που δεν λαμβάνω υπόψη και δεν δουλεύει; Υπάρχει κάτι άλλο που θα μπορούσα να δοκιμάσω; Μπορώ να ποστάρω και κώδικα αν ευκολύνει. Ιδού το Main Activity: > public class TargetPractise extends Activity{ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.target_form); ImageView1 value = new ImageView1(TargetPractise.this); float x = value.getx(); Log.d("x",String.valueOf(x)); } } Και εδώ το Custom Class: > public class ImageView1 extends View { Context context; public float x=0; public float y=0; public float getx() { return this.x; } public ImageView1(Context context) { super(context); this.context=context; setFocusable(true); } public ImageView1(Context context, AttributeSet attrs) { super(context, attrs); this.context=context; setFocusable(true); } @Override public boolean onTouchEvent(MotionEvent event){ switch (event.getAction()){ case (MotionEvent.ACTION_DOWN): { x = event.getX(); y = event.getY(); } return true; } } @Override public void onDraw(Canvas canvas){ super.onDraw(canvas); .... } } Καταρχήν θα πρέπει να δέσεις το class σου (ImageView1) με το προβαλλόμενο View του Activity σου, για να το κάνεις αυτό χρειάζεσαι το View που έχει γίνει SetContentView κατά το onCreate. Μια γρήγορη λύση σε αυτό το ζήτημα είναι να φορτώσεις μόνος σου το R.layout.main σε ένα View (viewMain) και ύστερα να το περάσεις στον constructor της class σου ως View (view) -εννοείται ότι ενημερώνεις κατάλληλα τον constructor της class σου ώστε πλην context να δέχεται και ένα View. Μετά εντός του constructor της class σου αρκεί να ορίσεις έναv view.setOnTouchListener(this) -εξυπακούεται ότι το class σου implements το View.OnTouchListener (και το ανάλογο event του, δηλαδή το onTouch). Από εκεί και πέρα κάθε φορά που ο χρήστης κάνει κλικ πάνω στο View θα ενημερώνεσαι μέσο του .OnTouch event για την θέση του κλπ. Τώρα, για να ενημερώνεις το Activity σου για τα motion events του χρήστη θα μπορούσες να χρησιμοποιήσεις ένα δικό σου (custom) Interface (πχ. TargetInterface) όπου μέσο μιας μεθόδου του (πχ. OnTouchEventDown) θα γνωστοποιείς στο Activity σου τα περιεχόμενα του View.onTouchEvent που θεωρείς χρήσιμα όταν το τελευταίο παράγεται από το σύστημα -φυσικά θα δέσεις αυτό το Interface με το Activity σου. Για παράδειγμα: -TargetPractice: >import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.View; public class TargetPractice extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); final View viewMain; setContentView((viewMain = View.inflate(this, R.layout.main, null))); new MyImageView(this, viewMain, new TargetInterface() { @Override public void OnTouchEventDown(float x, float y) { Log.w("MYPRG", String.format("%f, %f", x, y)); } }); } } -TargetInterface: > public interface TargetInterface { public void OnTouchEventDown(float x, float y); } -MyImageView: > import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import android.view.View; public class MyImageView extends View implements View.OnTouchListener { Context context; private TargetInterface iTarget = null; public float x=0; public float y=0; public float getx() { return this.x; } public MyImageView(Context context, View view, TargetInterface iTarget) { super(context); this.context=context; this.iTarget=iTarget; // bind TargetInterface setFocusable(true); view.setOnTouchListener(this); } @Override public boolean onTouch(View arg0, MotionEvent event) // OnTouchListener event { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: { x = event.getX(); y = event.getY(); iTarget.OnTouchEventDown(x, y); // Call TargetInterface.. return true; } } return false; } } Αν όλα πάνε καλά κάθε φορά που θα κάνεις κλικ επάνω στο View του Activity σου θα πρέπει να λαμβάνεις στο LogCat κάτι σαν αυτό: > 11-11 07:11:15.163: W/MYPRG(658): 91.000000, 153.000000 11-11 07:11:16.573: W/MYPRG(658): 222.000000, 234.000000 11-11 07:11:17.283: W/MYPRG(658): 276.000000, 122.000000 11-11 07:11:18.273: W/MYPRG(658): 55.999996, 343.000000 11-11 07:11:18.723: W/MYPRG(658): 27.000000, 183.000000
wolfgang146 Δημοσ. 11 Νοεμβρίου 2012 Μέλος Δημοσ. 11 Νοεμβρίου 2012 ΟΚ! Όντως δουλεύει! Απλά για να μου δουλέψει και η onDraw, άφησα την onTouchEvent απείραχτη και πρόσθεσα ένα implementation του onTouch όπως πρότεινες. Να εκθέσω τα ευχαριστήριά μου για τις ώρες διαβάσματος που μου γλίτωσες. Cheers!
wolfgang146 Δημοσ. 11 Νοεμβρίου 2012 Μέλος Δημοσ. 11 Νοεμβρίου 2012 Κάτι αλλο τώρα, έχεις μήπως να μου προτείνεις καμιά ιδεά για όταν θέλω να σταματήσει να στέλνει τιμές;
Directx Δημοσ. 11 Νοεμβρίου 2012 Δημοσ. 11 Νοεμβρίου 2012 Κάτι αλλο τώρα, έχεις μήπως να μου προτείνεις καμιά ιδεά για όταν θέλω να σταματήσει να στέλνει τιμές; Μια γρήγορη σκέψη, μπορείς να ορίσεις ένα flag (boolean) στο class σου, σαν διακόπτη, όταν είναι true (on) θα επεξεργάζεσαι τις τιμές, όταν είναι false (off) όχι.
wolfgang146 Δημοσ. 12 Νοεμβρίου 2012 Μέλος Δημοσ. 12 Νοεμβρίου 2012 Αχά! Και γω κάτι τέτοια σκέφτηκα. Ευχαριστώ και πάλι!
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα