Autore Topic: stampa di un immagine  (Letto 1043 volte)

Offline bobo78

  • Utente junior
  • **
  • Post: 55
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus one
  • Sistema operativo:
    Win XP
stampa di un immagine
« il: 01 Ottobre 2010, 15:11:00 CEST »
0
Ciao a tutti,
sto cominciando a sviluppare per android...in realta' sto facendo un po' di prove con i vari tutorial.
Sto cercando di costruire la mia prima applicazione. Dovrebbe essere una cosa molto semplice: all'avvio stampo un'immagine di background con un logo (immagine png) e poi premendo il tasto menu si puo' accedere a due opzioni (Start e Info). Premendo start si apre una nuova schermata, che prevede un nuovo menu associato al tasto "menu" di android, e che stampa a video una scritta qualsiasi (in realta' vorrei stampare i dati letti dall'accelerometro...ma andiamo per gradi).

Al momento sto cercando di stampare l'immagine di background ma con scarso successo.

Vi posto il codice dei due file java: l'activity e la view.

Codice: [Seleziona]
package com.bobo78.sensorApp;

import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
import android.widget.TextView;

public class SensorData extends Activity {
   
    private SensorAppView sAppView;
   
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
               
        // turn off the window's title bar
        requestWindowFeature(Window.FEATURE_NO_TITLE);

        // tell system to use the layout defined in our XML file
        setContentView(R.layout.main);       

        // get handles to the SensorApp from XML, and its res
        sAppView = (SensorAppView) findViewById(R.id.SensorAppView);
        sAppView.drawBackground();
    }
}


Codice: [Seleziona]
package com.bobo78.sensorApp;

import com.bobo78.sensorApp.*;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class SensorAppView extends SurfaceView implements SurfaceHolder.Callback {
   
   /** Handle to the surface manager object we interact with */   
    private Bitmap mBackgroundImage;
    private SurfaceHolder holder;
    private Context mainContext;

   public SensorAppView(Context context, AttributeSet attrs) {
      super(context, attrs);
      // TODO Auto-generated constructor stub
     
      mainContext = context;
     
      // register our interest in hearing about changes to our surface
                holder = getHolder();
                holder.addCallback(this);           
   }
   
   public void drawBackground(){
      Canvas canv = null;
       
      try{
         canv = holder.lockCanvas(null);

         Resources res = mainContext.getResources();

         // load background image as a Bitmap instead of a Drawable b/c
         // we don't need to transform it and it's faster to draw this way
         mBackgroundImage = BitmapFactory.decodeResource(res,
               R.drawable.stbkg);

         // Draw the background image. Operations on the Canvas accumulate
         // so this is like clearing the screen.
         [b]canv.drawBitmap(mBackgroundImage, 0, 0, null);[/b]
      } finally {
         if (canv != null) {
            holder.unlockCanvasAndPost(canv);
         }
      }
     
   
   }

   @Override
   public void surfaceChanged(SurfaceHolder holder, int format, int width,
         int height) {
      // TODO Auto-generated method stub
     
   }

   @Override
   public void surfaceCreated(SurfaceHolder holder) {
      // TODO Auto-generated method stub
     
   }

   @Override
   public void surfaceDestroyed(SurfaceHolder holder) {
      // TODO Auto-generated method stub
     
   }

}


L'applicazione funziona (ovviamente non stampa l'immagine) se commento l'istruzione "canv.drawBitmap(mBackgroundImage, 0, 0, null);" altrimenti neanche parte.
Cosa potrebbe essere? Devo implementare per forza un thread anche se voglio solo stampare un'immagine?

Secondo, il mio, e' il modo giusto per costruire applicazioni android?

Grazie a tutti

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:stampa di un immagine
« Risposta #1 il: 01 Ottobre 2010, 15:36:54 CEST »
0
Se il problema è solo uello di assegnare un'immagine di background alla tua activity puoi fare semplicemente

Codice (Java): [Seleziona]
getWindow().setBackgroundDrawableResource(int resid)

Offline bobo78

  • Utente junior
  • **
  • Post: 55
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus one
  • Sistema operativo:
    Win XP
Re:stampa di un immagine
« Risposta #2 il: 01 Ottobre 2010, 15:40:48 CEST »
0
Ti ringrazio per la risposta.
In realta' volevo sapere perche' il modo che ho utilizzato io non funziona e volevo avere un feedback da voi programmatori esperti sulla struttura della mia applicazione. Se e' corretta o se a tuo avviso andrebbe fatta in altro modo.

Grazie ancora per l'aiuto

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:stampa di un immagine
« Risposta #3 il: 01 Ottobre 2010, 19:04:21 CEST »
0
In realta' volevo sapere perche' il modo che ho utilizzato io non funziona e volevo avere un feedback da voi programmatori esperti sulla struttura della mia applicazione.

In realtà bisognerebbe capire che errore restituisce quando la vai ad eseguire, quindi se possibile posta l'output di logcat :)

Per quanto riguarda la struttura non ho ben capito perchè hai scelto di usare SurfaceView... Quello che hai descritto si poteva fare anche in modo con un linearlayout :)

Offline bobo78

  • Utente junior
  • **
  • Post: 55
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus one
  • Sistema operativo:
    Win XP
Re:stampa di un immagine
« Risposta #4 il: 01 Ottobre 2010, 20:54:25 CEST »
0
Dunque, ho scelto di impostarlo in quel modo perche' sono partito da LunarLander...
Pensavo che SurfaceView mi desse degli strumenti per la grafica, considerando che poi il programma evolvera'.
Tu mi sconsigli di usare SurfaceView?

Urca, logcat non ho ancora imparato ad usarlo. Come posso fare per ricavare il log dell'errore? Hai un suggerimento?

Grazie infinite!  :-)

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:stampa di un immagine
« Risposta #5 il: 01 Ottobre 2010, 21:07:17 CEST »
0
Citazione
Pensavo che SurfaceView mi desse degli strumenti per la grafica, considerando che poi il programma evolvera'.
Tu mi sconsigli di usare SurfaceView?

Per essere sincero io non ho mai avuto modo di usare SurfaceView percui non sono molto esperto in materia.
Da quanto ho capito però è un componente che ti permette di disegnare arbitrariamente su di esso. Questa proprietà quindi può tornare utile appunto nel caso tu debba disegnare a runtime qualcosa. Se devi semplicemente impostare un'immagine forse è un pochino sprecata. Ma lascio a qualche collega più esperto in materia una risposta più esaustiva.

Citazione
Urca, logcat non ho ancora imparato ad usarlo. Come posso fare per ricavare il log dell'errore? Hai un suggerimento?

Se utilizzi eclipse devi andare tramite il menu Window -> Open Prospective -> DDMS e successivamente portarti nella schema Logcat. Se non dovesse esserci di default puoi attivarla tramite Window ->Show View -> Logcat

In alternativa puoi utilizzarlo da shell facendo "adb logcat". Una googlata ti potrà fornire tutti i dettagli :)

Offline bobo78

  • Utente junior
  • **
  • Post: 55
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus one
  • Sistema operativo:
    Win XP
Re:stampa di un immagine
« Risposta #6 il: 04 Ottobre 2010, 16:08:37 CEST »
0
Ciao a tutti. Dopo ore di prove sono riuscito a stmapare l'immagine ma usando una View anziche' una SurfaceView. Penso di aver capito che la SurfaceView necessiti di un thread per gestire il surface Holder usato per la gestion dei "Drawing".
C'e' qualcuno che puo' confermare?  :-[

Questa modalita'  puo' essere comoda nelle applicazioni in cui si vogliono "manipolare" le immagini durante l'esecuzione dell'app.

Per ora continuo usando la View ed ora cerco di aggiungere il menu che mi permette di cambiare visualizzazione. Infatti dopo aver premuto ad esempio la voce del menu "Next" vorrei che mi si aprisse un'altra vista con un menu diverso e con un layout differente.
Sapreste come fare? C'e' un tutorial che mi consigliereste?

Grazie mille per i consigli e per l'aiuto


p.s.: logCat mi e' servito per capire un sacco di cose. Grazie Ricky