Creare una sequenza di immagini nella stessa activity

di il
6 risposte

Creare una sequenza di immagini nella stessa activity

Ciao ragazzi! Non so se questa sia la sezione giusta.
Sto facendo un'applicazione android 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". Facendo delle ricerche online c'è anche la possibilità di utilizzare OpenGL.

Spero di essere stato abbastanza chiaro.
Grazie!

6 Risposte

  • Re: Creare una sequenza di immagini nella stessa activity

    Ciao!!
    Dunque io escluderei a priori le openGL: troppo complicate e "a basso livello" per l'applicazione che devi fare..tanto più che non avrai bisogno di performance elevate, per cui secondo me non ne vale la pena di impelagarsi in quel mondo per "così poco"
    Successivamente escluderei anche il fatto di creare 1 activity per ogni immagine: una activity rappresenta una schermata con tutte le sue funzionalità; è un po' come se per ogni immagine dovessi aprire una nuova finestra, quindi è molto dispendioso a livello di risorse. Inoltre sorge un problema pratico: se hai un numero indefinito di immagini (ad esempio perché le scarichi da un sito e non sai a priori quante ce ne saranno) non potresti usare questo metodo poiché le activity vanno tutte elencate all'interno di un file (il manifest) prima della compilazione..

    L'approccio che userei io, quindi, è quello di creare una singola activity per la visualizzazione delle immagini, con un qualche meccanismo (qua ne trovi uno) per la gestione del cambio immagine.

    Per quanto riguarda il layout ultimamente (da android 3.0 in poi) si tende ad usare i fragment, perché maggiormente compatibili con le dimensioni dei tablet, ma nessuno ti vieta di usare i classici layout "relative"/"grid"/"linear"/... Per quanto riguarda il discorso "custom view" cosa intendi? questa opzione oppure ?
  • Re: Creare una sequenza di immagini nella stessa activity

    Grazie della risposta!
    Ho deciso di implementare l'activity con i fragment. Vi farò sapere quando finisco.
  • Re: Creare una sequenza di immagini nella stessa activity

    Sto avendo dei problemi con la sequenza di immagini che devo creare.
    La sequenza dovrebbe essere la seguente: Cross -> Screenshot -> Maschera, ma non il codice che ho scritto la sequenza è: Cross -> Maschera -> Screenshot, ma non riesco a capire perchè.
    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);   
    	}
    Quando viene inizializzata la GUI, viene impostata anche l'immagine della ImageView:
    myImageView.setImageResource(R.drawable.cross300x300);
  • Re: Creare una sequenza di immagini nella stessa activity

    Sono riuscito a risolvere cambiando il timer di ogni Runnable:
    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?
  • Re: Creare una sequenza di immagini nella stessa activity

    Sono riuscito più o meno a creare la sequenza che volevo:
    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;
    	            }
    	      	});
    	      	
    		}	
    	}
    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?
  • Re: Creare una sequenza di immagini nella stessa activity

    Ho aggiornato il codice:
    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!
Devi accedere o registrarti per scrivere nel forum
6 risposte