Autore Topic: SurfaceView con schermo nero solo per alcuni valori di weight  (Letto 627 volte)

Offline Alextave

  • Nuovo arrivato
  • *
  • Post: 4
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung galaxy S
  • Sistema operativo:
    Sabayon Linux 7
SurfaceView con schermo nero solo per alcuni valori di weight
« il: 09 Agosto 2012, 18:33:10 CEST »
0
Salve a tutti, sto scrivendo una app che, puntando la fotocamera,  mostra sullo schermo tutti i comuni italiani che ci sono nel raggio di un tot di km. Ho il problema con questo raggio d'azione, per determinare la sua ampiezza voglio usare una SeekBar verticale e ho creato il suo LinearLayout nello stesso LinearLayout che contiene anche quello della SurfaceView.
Il problema è dato dal campo layout_weight dei due LinearLayout. L'unico caso in cui la SurfaceView non è nera è quando c'è layout_weight="0.8" nel LinearLayout della SeekBar e layout_weight="0.2" in quello della SurfaceView. Se ad esempio scrivo 0.9 nella SeekBar e 0.1 nella Surface mi ritrovo quel'ultima completamente nera. Ho provato anche manualmente a modificare i due layout ma non ho risolto nulla. Con 0.8 avrei una SeekBar troppo grossa e brutta da vedere ecco perchè voglio restringere quel layout.
Mi è molto utile una SeekBar verticale perchè mi aiuta a ridurre l'effetto "schiacciato" che hanno le immagini visualizzate nella SurfaceView.

Questo è il file .xml:
Codice (XML): [Seleziona]
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:orientation="vertical" >
   
     <LinearLayout
       android:layout_width="fill_parent"
       android:layout_height="fill_parent"
       android:orientation="horizontal"
       android:layout_weight="0.2">
       
       <!-- Layout della SeekBar -->
        <LinearLayout
           android:id="@+id/seek_bar"
           android:layout_width="fill_parent"
           android:layout_height="fill_parent"
           android:orientation="vertical"
           android:layout_weight="0.8"> <!-- Attributo che dà i problemi -->
        </LinearLayout>
       
        <!-- Layout della fotocamera -->
        <SurfaceView
           android:id="@+id/camera_surface"
           android:layout_width="fill_parent"
           android:layout_height="fill_parent"
           android:layout_weight="0.2" > <!-- Attributo che dà i problemi -->
        </SurfaceView>        
    </LinearLayout>

    <LinearLayout
       android:layout_width="fill_parent"
       android:layout_height="fill_parent"
       android:orientation="vertical"
       android:layout_weight="0.8">
       
         <TextView
         android:id="@+id/latitude"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:text="@string/lati"/>
       
         <TextView
         android:id="@+id/longitudine"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:text="@string/longi"/>
         
         <TextView
         android:id="@+id/interrogazione"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:text="@string/SQL"/>
         </LinearLayout>
</LinearLayout>

E questo è il codice .java:
Codice (Java): [Seleziona]
public class VideoCamera extends Activity implements SurfaceHolder.Callback {
  private int intero=0;
  private SurfaceView mSurfaceView;
  private SurfaceHolder mSurfaceHolder;
  private Camera mCamera;
  private boolean mPreviewRunning;
  private LocationManager LM; /*Il Location Manager è uno strumento con cui è possibile ricevere notifiche sulla posizione del dispositivo.*/
  private TextView Latitudine; /*TextView per visualizzare la latitudine*/
  private TextView Longitudine;/*TextView per visualizzare la longitudine*/
  private TextView ris;
  private Double lat; /*Coordinate della mia posizione*/
  private Double lng;
  private MioDataBaseHelper DB=new MioDataBaseHelper(this);
  private Cursor cursore;
  private String nome;

  private LocationListener LL=new LocationListener() {
    public void onLocationChanged(Location location) {
      lat=location.getLatitude(); /*Ricevo la latitudine della mia posizione*/
      lng=location.getLongitude(); /*Ricevo la longitudine della mia posizione*/
      Latitudine.setText("Latitudine: "+Double.toString(lat)); /*Stampo le coordiante a video*/
      Longitudine.setText("Longitudine: "+Double.toString(lng));
      if(intero==0) { /*Modo artigianale per stampare il Toast una volta sola*/
        Toast.makeText(VideoCamera.this, "Posizione calcolata", Toast.LENGTH_LONG).show();
        intero=1;
      }
      else { }
     
      cursore=DB.Query(lat, lng);
        // looping through all rows and adding to list
        if (cursore.moveToFirst()) { /*Muovo il cursore sulla prima colonna della tabella*/
          do {
            nome=cursore.getString(0); /*Prima colonna ha indice 0*/
            Log.d("", "Query: "+nome+"");
          } while (cursore.moveToNext());
        }
     }

    public void onProviderDisabled(String provider) { /*Metodo invocato quando il provider (GPS) è disabilitato*/
      Toast.makeText(VideoCamera.this, "GPS disabilitato", Toast.LENGTH_SHORT).show();
    }

    public void onProviderEnabled(String provider) { /*Metodo invocato quando il provider (GPS) è abilitato*/
      Toast.makeText(VideoCamera.this, "GPS abilitato", Toast.LENGTH_SHORT).show();
    }

    public void onStatusChanged(String provider, int status, Bundle extras) {
      Toast.makeText(VideoCamera.this, "On status changed "+provider+" status: "+status+"", Toast.LENGTH_SHORT).show();
    }
  };
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
     
      getWindow().setFormat(PixelFormat.TRANSLUCENT); /*aggiungo il traslucido*/
      requestWindowFeature(Window.FEATURE_NO_TITLE); //no barra titolo
      getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); //full screen
      setContentView(R.layout.activity_main);
     
      DB.ApriDataBase();
      Toast toast=new Toast(VideoCamera.this);
      toast.setDuration(3000);
      toast.makeText(VideoCamera.this, "Sto calcolando le coordinate della tua posizione", toast.LENGTH_LONG).show();
       
      Latitudine=(TextView) findViewById(R.id.latitude); /*Importo le TextView del camera.xml*/
      Longitudine=(TextView) findViewById(R.id.longitudine);
      ris=(TextView) findViewById(R.id.interrogazione);
       
      LM=(LocationManager) getSystemService(Context.LOCATION_SERVICE);
      LM.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, LL);
                           
      mSurfaceView=(SurfaceView)findViewById(R.id.camera_surface);
      mSurfaceHolder=mSurfaceView.getHolder(); //recupero l'holder della surfaceview
      mSurfaceHolder.addCallback(this); //faccio la bind alla nostra activity
      mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); //tipo di surface, suggerito nei tutorial ufficiali
    } /*FINE DEL METODO OnCreate()*/

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

    PictureCallback jpegCallback = new PictureCallback() {
      public void onPictureTaken(byte[] _data, Camera _camera) { //riparte la preview della camera
        mCamera.startPreview();                    
      }
    };

    public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
      if (mPreviewRunning)
        mCamera.stopPreview();
                   
      /*Setto i parametri*/
      Camera.Parameters p = mCamera.getParameters();  /*Prendo i parametri della fotocamera*/
      p.setPreviewSize(arg2, arg3);
      ArrayList<Size> list = (ArrayList<Size>) p.getSupportedPictureSizes();  /*Recupero le risoluzioni supportate*/
      int picture_width = list.get(list.size()-1).width;
      int picture_height = list.get(list.size()-1).height;
      p.setPictureSize(picture_width, picture_height); /*Risoluzione più bassa*/
      p.setJpegQuality(80);  /*Compressione JPEG*/
     
      /*Salvo i parametri*/
      mCamera.setParameters(p);
      try { /*lancio la preview*/
        mCamera.setPreviewDisplay(arg0);        
        mCamera.startPreview();
        mPreviewRunning = true;
      } catch (IOException e) { }      
    }

    public void surfaceCreated(SurfaceHolder holder) {
      mCamera = Camera.open();              
    }

    public void surfaceDestroyed(SurfaceHolder holder) {
      mCamera.stopPreview();
      mPreviewRunning = false;
      mCamera.release();                
    }
}

Vi ringrazio dell'aiuto e dei consigli!
Andrea