Autore Topic: Creare una sequenza di immagini nella stessa activity  (Letto 844 volte)

Offline DamianFox

  • Nuovo arrivato
  • *
  • Post: 17
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S2
  • Sistema operativo:
    Windows 7
Creare una sequenza di immagini nella stessa activity
« il: 07 Gennaio 2014, 10:52:27 CET »
0
Ciao ragazzi! Non so se questa sia la sezione giusta.
Sto facendo un'applicazione come progetto di ricerca dell'università.
In questa applicazione dovrei mostrare una sequenza di immagini per un determinato periodo di tempo (l'app si compone in due parti, che si differenziano per il tempo di visualizzazione dell'immagine). Quando l'immagine sparisce dovrei visualizzare un EditText dove si inserisce la valutazione dell'immagine; questa sequenza si ripeterà per un pò d'immagini (il numero si deciderà in seguito).
Prima di ogni immagine dovrò visualizzare una croce rossa a forma di X e dopo ogni immagine si dovrà visualizzare un'immagine detta "maschera" per qualche millisecondo.

L'idea è di mettere tutte le immagini che mi servono dentro la cartella "drawable".
Quello che vorrei capire è come creare questa activity o, se mi conviene creare un'attività per immagine. Oppure se è necessario utilizzare i "fragment" o le "custom view".

Spero di essere stato abbastanza chiaro.
Grazie!

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Creare una sequenza di immagini nella stessa activity
« Risposta #1 il: 07 Gennaio 2014, 11:07:03 CET »
+1
Prima di ogni immagine dovrò visualizzare una croce rossa a forma di X e dopo ogni immagine si dovrà visualizzare un'immagine detta "maschera" per qualche millisecondo.

Intanto il "quanto minimo" è il tempo di refresh del frame, a 60Hz sono poco meno di 17ms. In ogni caso se quello che ti serve è un controllo stretto del ridisegno dei frame, immagino tu debba pensare a lavorare in openGL (un po' come se fosse un videogame).
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline DamianFox

  • Nuovo arrivato
  • *
  • Post: 17
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S2
  • Sistema operativo:
    Windows 7
Re:Creare una sequenza di immagini nella stessa activity
« Risposta #2 il: 07 Gennaio 2014, 14:58:06 CET »
0
Grazie della risposta!
Comincerò a cercare un pò di guide per l'OpenGL e vi farò sapere.

Offline DamianFox

  • Nuovo arrivato
  • *
  • Post: 17
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S2
  • Sistema operativo:
    Windows 7
Re:Creare una sequenza di immagini nella stessa activity
« Risposta #3 il: 10 Gennaio 2014, 15:55:07 CET »
0
Ho cercato qualche guida per implementare le librerie OpenGL, ma avendo trovato poco ho deciso implementare la sequenza di immagini con due fragment; nel primo è presente una ImageView mentre nel secondo è presente un EditText. Ecco il codice dell'activity che contiene i due fragment:
Codice (Java): [Seleziona]
public class Step1 extends Activity {
       
        ImageFragment myImageFragment;
        InputFragment myInputFragment;
        Drawable cross;
        ImageView myImageView;
        int i;
        int[] screenshots = {
                   R.drawable.googleplaybooks2
        };
               
        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.step1);
               
                initUI();
               
                startThread();
        }
       
        private void initUI(){
                myImageFragment = (ImageFragment)getFragmentManager().findFragmentById(R.id.imageFragment);
                myInputFragment = (InputFragment)getFragmentManager().findFragmentById(R.id.inputFragment);
               
                myImageView = (ImageView)myImageFragment.getView().findViewById(R.id.screenshotImageView);
                myImageView.setImageResource(R.drawable.cross300x300);;
               
                myInputFragment.getView().setVisibility(View.GONE);
        }
       
        private void startThread(){
               
                Runnable r1 = new Runnable() {
                public void run() {
                        myImageView.setImageResource(R.drawable.noise);
                        myImageView.getLayoutParams().width = LayoutParams.MATCH_PARENT;
                                myImageView.getLayoutParams().height = LayoutParams.MATCH_PARENT;
                }      
            };
               
                Runnable r = new Runnable() {
                public void run() {
                        myImageView.setImageResource(screenshots[i]);
                                myImageView.getLayoutParams().width = LayoutParams.MATCH_PARENT;
                                myImageView.getLayoutParams().height = LayoutParams.MATCH_PARENT;                              
                }      
            };     
           
            myImageView.postDelayed(r, 500);
            myImageView.postDelayed(r1, 100);    
        }
       
        @Override
        public void onBackPressed() {
                AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("Attenzione")
        .setMessage("Sei sicuro/a di voler uscire dall'applicazione?\n" +
                        "Confermando uscirai dall'applicazione e perderai \n" +
                        "tutti i dati raccolti finora.")
        .setCancelable(false)
        .setNegativeButton("No",new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
                dialog.cancel();
            }
        })
        .setPositiveButton("Si", new DialogInterface.OnClickListener()
        {
            @Override
            public void onClick(DialogInterface dialog, int whichButton)
            {
                Intent intent = new Intent(Intent.ACTION_MAIN);
                intent.addCategory(Intent.CATEGORY_HOME);
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(intent);
            }
        });
        AlertDialog alert = builder.create();
        alert.show();
        }
}

Però la sequenza che crea questo codice è: Cross -> Maschera -> Screenshot, ma dovrebbe essere Cross -> Screenshot -> Maschera.
Perchè?
« Ultima modifica: 11 Gennaio 2014, 10:45:57 CET da DamianFox »

Offline DamianFox

  • Nuovo arrivato
  • *
  • Post: 17
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S2
  • Sistema operativo:
    Windows 7
Re:Creare una sequenza di immagini nella stessa activity
« Risposta #4 il: 13 Gennaio 2014, 17:19:26 CET »
0
Sono riuscito a risolvere cambiando il timer di ogni Runnable:

Codice (Java): [Seleziona]
myImageView.postDelayed(r, 250);
myImageView.postDelayed(r1, 750);
myImageView.postDelayed(r2, 1000);


"r2" si occupa si far sparire l'ImageView e far comparire l'EditText.

Adesso però sorge un altro problema: questa sequenza (Cross, Screeshot e Maschera) deve continuare per un determinato numero di volte. Come posso fare ciò? In particolare come faccio a passare al passo successivo quando viene premuto il tasto "Invio" della tastiera?

Offline DamianFox

  • Nuovo arrivato
  • *
  • Post: 17
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S2
  • Sistema operativo:
    Windows 7
Re:Creare una sequenza di immagini nella stessa activity
« Risposta #5 il: 15 Gennaio 2014, 15:03:53 CET »
0
Sono riuscito più o meno a creare la sequenza che volevo:

Codice (Java): [Seleziona]
private void startThread(final int i){
                               
                if(i < length){
                        handler.postDelayed(new TaskScreenshot(i), i*1500 + 250);
                handler.postDelayed(new TaskNoise(), i*1500 + 750);
                handler.postDelayed(new TaskEditText(), i*1500 + 1000);
       
                myEditText.setOnKeyListener(new View.OnKeyListener(){
                        public boolean onKey(View v, int keyCode, KeyEvent event) {
                        if((keyCode == KeyEvent.KEYCODE_ENTER)) {
                            if(myEditText.getText().toString().equals("")){
                                Toast.makeText(getApplicationContext(), "Inserire un numero da 1 a 9", Toast.LENGTH_SHORT).show();
                                return false;
                            } else if (Integer.parseInt(myEditText.getText().toString()) >= 1 &&
                                        Integer.parseInt(myEditText.getText().toString()) <= 9){
                                System.out.println(i);
                                startThread(i+1);
                                return true;
                            }
                        }
                        return false;
                    }
                });
               
                }      
        }

Codice (Java): [Seleziona]
class TaskScreenshot implements Runnable{

                int j;
               
                public TaskScreenshot(int _i){
                        this.j = _i;
                }
               
                @Override
                public void run() {
                        System.out.println("Screenshot");
                        myEditText.setText("");
                        myEditText.setVisibility(View.GONE);
                        myImageFragment.getView().setVisibility(View.VISIBLE);
                        myImageView.setImageResource(screenshots[j]);
                        myImageView.getLayoutParams().width = LayoutParams.MATCH_PARENT;
                        myImageView.getLayoutParams().height = LayoutParams.MATCH_PARENT;
                }
}
       
class TaskNoise implements Runnable{
               
                @Override
                public void run() {
                        System.out.println("Noise");
                myImageView.setImageResource(R.drawable.noise);
                myImageView.getLayoutParams().width = LayoutParams.MATCH_PARENT;
                        myImageView.getLayoutParams().height = LayoutParams.MATCH_PARENT;
                }
}
       
class TaskEditText implements Runnable{

                @Override
                public void run() {
                        System.out.println("EditText");
                        myEditText.setVisibility(View.VISIBLE);
                myImageFragment.getView().setVisibility(View.GONE);
                }
}

Ma succede qualcosa di strano: la prima immagine viene visualizzata correttamente, viene premuto il tasto "Enter", compare la seconda immagine e successivamente la terza; viene premuto di nuovo il tasto "Enter" e vengono visualizzate la quarta e la quinta immagine in sequenza.
Non riesco a capire perchè avviene questa situazione. Qualcuno sa dove sbaglio?

Offline DamianFox

  • Nuovo arrivato
  • *
  • Post: 17
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S2
  • Sistema operativo:
    Windows 7
Re:Creare una sequenza di immagini nella stessa activity
« Risposta #6 il: 20 Gennaio 2014, 13:54:09 CET »
0
Ho aggiornato il codice:

Codice (Java): [Seleziona]
public class Step1Training extends Activity {
       
        ImageFragment myImageFragment;
        InputFragment myInputFragment;
        Drawable cross;
        ImageView myImageView;
        EditText myEditText;
        Button continueButton;
        int length;
        int i = 0;
        String rating;
        Handler handler;
        boolean continueTask;
        int[] screenshots = {
                   R.drawable.googleplaybooks2,
                   R.drawable.aldiko1,
                   R.drawable.chaton2,
                   R.drawable.cinetrailer1,
                   R.drawable.fanpage1
        };
        String filePATH;
        Intent intent;
        File root;
        boolean fileDeleted;
        TextHandler textHandler;
        int participantID;
               
        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.step1_training);
               
                fileDeleted = false;
                root = Environment.getExternalStorageDirectory();
                textHandler = new TextHandler();
                intent = getIntent();
                filePATH = intent.getStringExtra("file_path");
                participantID = intent.getIntExtra("participant_ID", participantID);
                System.out.println(filePATH);
                System.out.println(participantID);
               
                handler = new Handler();
                length = screenshots.length;
               
                initUI();
               
                startThread();
               
                addListenerOnContinueButton();
        }
       
        private void initUI(){
                myImageFragment = (ImageFragment)getFragmentManager().findFragmentById(R.id.imageFragment);
                myInputFragment = (InputFragment)getFragmentManager().findFragmentById(R.id.inputFragment);
               
                myImageView = (ImageView)myImageFragment.getView().findViewById(R.id.screenshotImageView);
                myImageView.setImageResource(R.drawable.cross300x300);
               
                continueButton = (Button) myInputFragment.getView().findViewById(R.id.continueButton);
                continueButton.setVisibility(View.GONE);
               
                myEditText = (EditText) myInputFragment.getView().findViewById(R.id.ratingEditText);
                myEditText.setText("");
                myEditText.setOnKeyListener(new OnKeyListener(){
                public boolean onKey(View arg0, int arg1, KeyEvent event) {
                // If the event is a key-down event on the "enter" button
                if ( (event.getAction() == KeyEvent.ACTION_DOWN  ) &&
                     (arg1           == KeyEvent.KEYCODE_ENTER)   )
                {              
                        InputMethodManager imm = (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
                        imm.hideSoftInputFromWindow(myEditText.getWindowToken(), 0);  
                        return true;
                }
                return false;
             }
        });
               
                myEditText.setVisibility(View.GONE);
                myEditText.setOnKeyListener(null);
        }
       
        private void startThread(){
                handler.postDelayed(new TaskScreenshot(0), 300);
                handler.postDelayed(new TaskNoise(), 800);
                handler.postDelayed(new TaskEditText(), 1050);
               
                myEditText.setOnKeyListener(new View.OnKeyListener(){
                        public boolean onKey(View v, int keyCode, KeyEvent event) {
                        if((keyCode == KeyEvent.KEYCODE_ENTER)) {
                            if(myEditText.getText().toString().equals("")){
                                Toast.makeText(getApplicationContext(), "Inserire un numero da 1 a 9", Toast.LENGTH_SHORT).show();
                                return false;
                            } else if (Integer.parseInt(myEditText.getText().toString()) >= 1 &&
                                        Integer.parseInt(myEditText.getText().toString()) <= 9){
                                // System.out.println(i);
                                startThread2(i+1);
                                return true;
                            }
                        }
                        return false;
                    }
                });
        }
       
        private void startThread2(final int i){
               
                if(i < length){
                        handler.postDelayed(new TaskCross(), 300);
                        handler.postDelayed(new TaskScreenshot(i), 600);
                        handler.postDelayed(new TaskNoise(), 1100);
                        handler.postDelayed(new TaskEditText(), 1350);
       
                myEditText.setOnKeyListener(new View.OnKeyListener(){
                        public boolean onKey(View v, int keyCode, KeyEvent event) {
                        if((keyCode == KeyEvent.KEYCODE_ENTER)) {
                            if(myEditText.getText().toString().equals("")){
                                Toast.makeText(getApplicationContext(), "Inserire un numero da 1 a 9", Toast.LENGTH_SHORT).show();
                                return false;
                            } else if (Integer.parseInt(myEditText.getText().toString()) >= 1 &&
                                        Integer.parseInt(myEditText.getText().toString()) <= 9){
                                System.out.println(i);
                                startThread2(i+1);
                                if(i == length-1 && myEditText.getVisibility() == View.VISIBLE){
                                                continueButton.setVisibility(View.VISIBLE);
                                        }
                                return true;
                            }
                        }
                        return false;
                    }
                });            
                }
        }
       
        private void addListenerOnContinueButton() {
                         
                continueButton.setOnClickListener(new OnClickListener() {
 
                        @Override
                        public void onClick(View arg0) {
                                Intent intent = new Intent(Step1Training.this, MainSession1.class);
                                intent.putExtra("file_path", filePATH);
                                intent.putExtra("participand_ID", participantID);
                                startActivity(intent);
                        }
                });
        }
       
        @Override
        public void onBackPressed() {
                AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("Attenzione")
        .setMessage("Sei sicuro/a di voler uscire dall'applicazione?\n" +
                        "Confermando uscirai dall'applicazione e perderai \n" +
                        "tutti i dati raccolti finora.")
        .setCancelable(false)
        .setNegativeButton("No",new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
                dialog.cancel();
            }
        })
        .setPositiveButton("Si", new DialogInterface.OnClickListener()
        {
            @Override
            public void onClick(DialogInterface dialog, int whichButton)
            {
                fileDeleted = textHandler.deleteFile(filePATH);
                if(fileDeleted){
                        System.out.println("CANCELLATO!!");
                } else {
                        System.out.println("NON CANCELLATO!!");
                }
                Intent intent = new Intent(Intent.ACTION_MAIN);
                intent.addCategory(Intent.CATEGORY_HOME);
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(intent);
            }
        });
        AlertDialog alert = builder.create();
        alert.show();
        }
       
        class TaskScreenshot implements Runnable{

                int j;
               
                public TaskScreenshot(int _i){
                        this.j = _i;
                }
               
                @Override
                public void run() {
                        System.out.println("Screenshot");
                        myEditText.setText("");
                        myEditText.setVisibility(View.GONE);
                        myImageFragment.getView().setVisibility(View.VISIBLE);
                myImageView.setImageResource(screenshots[j]);
                        myImageView.getLayoutParams().width = LayoutParams.MATCH_PARENT;
                        myImageView.getLayoutParams().height = LayoutParams.MATCH_PARENT;
                }
        }
       
        class TaskNoise implements Runnable{
               
                @Override
                public void run() {
                        System.out.println("Noise");
                myImageView.setImageResource(R.drawable.noise);
                myImageView.getLayoutParams().width = LayoutParams.MATCH_PARENT;
                        myImageView.getLayoutParams().height = LayoutParams.MATCH_PARENT;
                }
        }
       
        class TaskEditText implements Runnable{

                @Override
                public void run() {
                        System.out.println("EditText");
                        myEditText.setVisibility(View.VISIBLE);
                myImageFragment.getView().setVisibility(View.GONE);
                }
        }
       
        class TaskCross implements Runnable{

                @Override
                public void run() {
                        System.out.println("Cross");
                        myEditText.setVisibility(View.GONE);
                        myImageFragment.getView().setVisibility(View.VISIBLE);
                        myImageView.getLayoutParams().width = 60;
                        myImageView.getLayoutParams().height = 60;
                        myImageView.setImageResource(R.drawable.cross300x300);
                }
        }
}

Questo codice funziona parzialmente perchè avendo 5 immagini, vengono visualizzate la 1°, la 3° e la 5°. Perchè? C'è qualcosa di sbagliato con l'indice "i"?
Se qualcuno può aiutarmi, è da un pò di giorni che provo risolvere questo problema..
Grazie!