JavascriptProva

giovedì 27 ottobre 2016

Considerazioni.

L'immagine sarebbe salvata come stringa.
Ecco JImage:
public class JImage {
    public String etichetta;
    public String categoria;
    public String immagine;
    public String tipo;
    public int coordX;
    public int coordY;
}


Per memorizzare il database:
STRING ETICHETTA
STRING CATEGORIA
STRING IMMAGINE
STRING TIPO


INT COORDX
INT COORDY


Riguardo il codice in cui il programma legge il database e carica le immagini nel controllo ImagView.
Per fare questo però la String deve essere ritradotta in immagine, e il codice non lo ricordo...
Vediamo...

Ecco, l'avevo già creata per la funzione di salvataggio da ImagePicker, insieme al suo reverse.
    public static String BitmapToString(Bitmap bmp, int quality){
        ByteArrayOutputStream stream=new ByteArrayOutputStream();
        bmp.compress(Bitmap.CompressFormat.JPEG, quality, stream);
        byte[] b=stream.toByteArray();
        String s= Base64.encodeToString(b,Base64.DEFAULT);
        return s;
    }

 public static Bitmap StringToBitmap(String stringImage){
        byte[] b=Base64.decode(stringImage,Base64.DEFAULT);
        Bitmap bmp=BitmapFactory.decodeByteArray(b,0,b.length);
        return bmp;
    }
Per convertire Bitmap a String bisogna trasformare una bitmap in un array di bytes.
Per riconvertire String a Bitmap bisogna trasformare la String in un array di bytes.

La trasformazione passa sempre per un array di bytes.

Il campo IMMAGINE nel database è il terzo, quindi considerando che c'è una chiave primaria devo estrarre il numero 3.
Modifico la chiamata della folderLayout aggiungendovi come terzo parametro la stringa IMMAGINE presa dal database:
FolderLayout folderLayout=new FolderLayout(this,isFolder,crs.getString(3));
e ora devo andare a modificarne di conseguenza il costruttore:
public FolderLayout(Context context,boolean isFolder,String stringImage) {
...
Nel corpo di folderLayout ripristino l'immagine attraverso la funzione che ho già creato:
    private boolean isFolder;
    public FolderLayout(Context context,boolean isFolder,String stringImage) {
        super(context);
        this.context=context;
        this.isFolder=isFolder;
        setWillNotDraw(false);

        if(isFolder) {
            this.setBackground(getResources().getDrawable(R.drawable.cartella));
        }else{
            this.setBackground(getResources().getDrawable(R.drawable.document));
        }

        Bitmap b=Funzioni.StringToBitmap(stringImage);
        ImageView immagine=new ImageView(context);
        immagine.setImageBitmap(b);
        this.addView(immagine);
    }

Ecco il risultato finale, dopo una serie di aggiustamenti estetici:
Ho rimaneggiato completamente il codice di folderLayout:
public class FolderLayout extends RelativeLayout {
    Context context;




    private boolean isFolder;
    public FolderLayout(Context context,boolean isFolder,String stringImage,String etichetta) {
        super(context);
        this.context=context;
        this.isFolder=isFolder;
        setWillNotDraw(false);

        if(isFolder) {
            this.setBackground(getResources().getDrawable(R.drawable.cartella));
        }else{
            this.setBackground(getResources().getDrawable(R.drawable.document));
        }


        Bitmap b=Funzioni.StringToBitmap(stringImage);
        ImageView immagine=new ImageView(context);
        immagine.setImageBitmap(b);
        this.addView(immagine);
        RelativeLayout.LayoutParams p=(RelativeLayout.LayoutParams) immagine.getLayoutParams();
        p.topMargin=30;
        p.height=180;
        p.width=180;
        p.addRule(RelativeLayout.CENTER_HORIZONTAL);

        TextView txtEtichetta=new TextView(context);
        txtEtichetta.setText(etichetta);
        txtEtichetta.setTextSize(15);
        txtEtichetta.setSingleLine(false);
        txtEtichetta.setAllCaps(true);
        txtEtichetta.setTypeface(null, Typeface.BOLD);
        this.addView(txtEtichetta);
        System.out.println(etichetta);
        RelativeLayout.LayoutParams params =(RelativeLayout.LayoutParams)txtEtichetta.getLayoutParams();
        params.topMargin=210;
        params.leftMargin=10;
        params.addRule(RelativeLayout.CENTER_HORIZONTAL);
        params.width=250;
        params.height=150;

    }
}
ed ecco la funzione che carica il database nella finestra, allo stato attuale:
    private void leggiDaDatabase(String categoria){

        Cursor crs=helper.query(categoria);
        crs.moveToFirst();
        do{
            boolean isFolder=false;
            if(crs.getString(4).equals("categoria")) isFolder=true;
            FolderLayout folderLayout=new FolderLayout(this,false,crs.getString(3),crs.getString(1));
            mainLayout.addView(folderLayout);
            RelativeLayout.LayoutParams flParams=(RelativeLayout.LayoutParams)folderLayout.getLayoutParams();
            flParams.leftMargin=crs.getInt(5);
            flParams.topMargin=crs.getInt(6);
            flParams.width=(int)(250);
            flParams.height=(int)(300);
            folderLayout.setOnTouchListener(onImageTouchListener);


        }while(crs.moveToNext());

    }

Quest'ultima funzione è la prima che deve partire.
O, meglio, ho ricostruito la sequenza.
Non appena si avvia il programma, con l'evento OnStart, parte questo codice:
    @Override
    protected void onStart(){
        super.onStart();
        mLucchettiChangeListener.onLucchettiChange(leftLock,rightLock);
        refreshScreen();
    }
Viene innescato l'evento onLucchettiChange... (che vedrò poi);
viene chiamata la funzione refreshScreen().
    //Ricarica la schermata.
    private void refreshScreen(){

        try {
            leggiDaDatabase(currentCat);
        }catch(Exception e){}ae
        txtBarraCategoria.setText(currentCat);
    }
Questo refreshScreen innesca leggiDaDatabase avendo per parametro currentCat, che sarebbe la categoria corrente.
In più, intitola la barra categoria con il nome di questa categoria corrente.

Importante: currentCat è impostata a "iniziale":
String currentCat="iniziale";
Ed ecco leggiDaDatabase.
    private void leggiDaDatabase(String categoria){

        Cursor crs=helper.query(categoria);
        crs.moveToFirst();
        do{
            boolean isFolder=false;
            if(crs.getString(4).equals("categoria")) isFolder=true;
            FolderLayout folderLayout=new FolderLayout(this,false,crs.getString(3),crs.getString(1));
            mainLayout.addView(folderLayout);
            RelativeLayout.LayoutParams flParams=(RelativeLayout.LayoutParams)folderLayout.getLayoutParams();
            flParams.leftMargin=crs.getInt(5);
            flParams.topMargin=crs.getInt(6);
            flParams.width=(int)(250);
            flParams.height=(int)(300);
            folderLayout.setOnTouchListener(onImageTouchListener);


        }while(crs.moveToNext());

    }
Questo scorre tutto il database selezionando le sole immagini che abbiano il campo categoria impostato al valore di currentCat.
Quindi inizialmente seleziona soltanto le immagini che appartengono alla schermata iniziale.

Per ogni record crea un folderLayout contenente un'immagine e un'etichetta.
E questo è il codice che ho rimaneggiato finora.

Nessun commento:

Posta un commento