Autore Topic: ereditare da una custom view gli oggetti dell'activity principale  (Letto 312 volte)

Offline bomber83

  • Nuovo arrivato
  • *
  • Post: 1
  • Respect: 0
    • Mostra profilo
0
Buongiorno a tutti, premetto che mi sono avvicinato da poco al mondo di android, e ho iniziato a sviluppare qualche applicazioncina.

In particolare, volevo sviluppare un applicazione che muovesse un immagine sullo schermo ed ogni volta che l'utente clicca sull'immagine viene incrementato il punteggio e visualizzato in una textView.

Girando qua e la per la rete ho trovato il modo di farlo,la mia activity principale è fatta in questa maniera:

Codice (Java): [Seleziona]
public class DroidzActivity extends Activity implements OnClickListener{
    /** Called when the activity is first created. */
        private static final String TAG = DroidzActivity.class.getSimpleName();

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.main);
        Log.d(TAG, "View added");
    }

       @Override
        protected void onDestroy() {
                Log.d(TAG, "Destroying...");
                super.onDestroy();
        }

        @Override
        protected void onStop() {
                Log.d(TAG, "Stopping...");
                super.onStop();
        }
   
   
}
nel main.xml:
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:orientation="vertical"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
   android:weightSum="1">
    <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/linearLayout1">
        <Button android:text="Restart" android:id="@+id/buttonRestart" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
        <TextView android:text="-" android:layout_width="wrap_content" android:id="@+id/textViewPunteggio" android:textAppearance="?android:attr/textAppearanceLarge" android:layout_height="wrap_content"></TextView>
    </LinearLayout>
    <net.obviam.droidz.MainGamePanel android:layout_height="match_parent" android:id="@+id/mainGamePanel1" android:layout_width="323dp"></net.obviam.droidz.MainGamePanel>
</LinearLayout>

Ho aggiunto un layout custom chiamato MainGamePanel che è fatto in questa maniera;

Codice (Java): [Seleziona]
public  class MainGamePanel extends SurfaceView implements
                SurfaceHolder.Callback {

        private static final String TAG = MainGamePanel.class.getSimpleName();
    private MainThread thread;
        private Droid droid;
        private int score=0;
   
   

   
        public MainGamePanel(Context context, AttributeSet attr) {
                super(context,attr);
                // adding the callback (this) to the surface holder to intercept events
                getHolder().addCallback(this);
                // create droid and load bitmap
                droid = new Droid(BitmapFactory.decodeResource(getResources(), R.drawable.chicco), 50, 50);
   
                // create the game loop thread
                thread = new MainThread(getHolder(), this);
        setFocusable(true);
        }
 
       
       
        public Droid getDroid() {
                return droid;
        }



        public void setDroid(Droid droid) {
                this.droid = droid;
        }



        public void render(Canvas canvas) {
                canvas.drawColor(Color.BLACK);
                droid.draw(canvas);
        }
        public void update() {

                // check collision with right wall if heading right
                if (droid.getSpeed().getxDirection() == Speed.DIRECTION_RIGHT
                                && droid.getX() + droid.getBitmap().getWidth() / 4 >= getWidth()) {
                        droid.getSpeed().toggleXDirection();
                }
                // check collision with left wall if heading left
                if (droid.getSpeed().getxDirection() == Speed.DIRECTION_LEFT
                                && droid.getX() - droid.getBitmap().getWidth() / 4 <= 0) {
                        droid.getSpeed().toggleXDirection();
                }
                // check collision with bottom wall if heading down
                if (droid.getSpeed().getyDirection() == Speed.DIRECTION_DOWN
                                && droid.getY() + droid.getBitmap().getHeight() / 4 >= getHeight()) {
                        droid.getSpeed().toggleYDirection();
                }
                // check collision with top wall if heading up
                if (droid.getSpeed().getyDirection() == Speed.DIRECTION_UP
                                && droid.getY() - droid.getBitmap().getHeight() / 4 <= 0) {
                        droid.getSpeed().toggleYDirection();
                }
                // Update the lone droid
                droid.update();
        }

        public void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {
        }


        public void surfaceCreated(SurfaceHolder holder) {
                // at this point the surface is created and
                // we can safely start the game loop
                thread.setRunning(true);
                thread.start();
        }
   
       

        public void surfaceDestroyed(SurfaceHolder holder) {
                Log.d(TAG, "Surface is being destroyed");
                // tell the thread to shut down and wait for it to finish
                // this is a clean shutdown
                boolean retry = true;
                while (retry) {
                        try {
                                thread.join();
                                retry = false;
                        } catch (InterruptedException e) {
                                // try again shutting down the thread
                        }
                }
                Log.d(TAG, "Thread was shut down cleanly");
        }

        @Override
        public boolean onTouchEvent(MotionEvent event) {

                if (event.getAction() == MotionEvent.ACTION_DOWN) {
                        // delegating event handling to the droid
                        droid.handleActionDown((int) event.getX(), (int) event.getY());
                        if (droid.isTouched()) {
                                score++;
                                Log.d(TAG, "Punteggio:" + score);
                                }
                }

                if (event.getAction() == MotionEvent.ACTION_UP) {
                        // touch was released
                        if (droid.isTouched()) {
                                droid.setTouched(false);
                        }
                }
                return true;
        }

       


        public int getScore() {
                return score;
        }



        public void setScore(int score) {
                this.score = score;
        }


       
        @Override
        protected void onDraw(Canvas canvas) {
                // fills the canvas with black
                canvas.drawColor(Color.BLACK);
                droid.draw(canvas);
        }
}

La classe Main thread è semplicemente un treadh infinito che richiama il metodo update e il metodo rendere ciclicamente.

Quello che mi piacerebbe fare ora, (e ci sto sbattendo la testa da un po di tempo ) è settare la textWiew del main.xml (textViewPunteggio) con il punteggio attuale del'utente, ho provato con findViewBy id dentro il metodo onTouchEvent, ma mi restituisce un valore nullo, probabilmente perche sono in una sottovista e non riesco a recupare gli oggetti del main.xml.

Qualcuno sa darmi un aiuto o ha un idea su come poterlo fare?

Grazie mille a tutti








« Ultima modifica: 03 Ottobre 2011, 16:38:59 CEST da Ricky` »