lunedì 2 aprile 2012

Stili in Android

Per definire gli stili di un elemento grafico in Android si puo' utilizzare il file styles.xml
Questo file non viene creato insieme al progetto Eclipse e deve essere generato inserendo nella directory /res/values un nuovo file Android XML Values File e nominandolo come style.xml
All'interno, un po' come fosse un Css in html, si crea uno stile con un determinato nome (in questo caso latlon)
-----------------------------------------------------------------------

<?xml version="1.0" encoding="utf-8"?>
<resources>
 <style name="latlon">
        <item name="android:textColor">#000000</item>
        <item name="android:textStyle">bold</item>
        <item name="android:textSize">16sp</item>
        
    </style>    
</resources>
---------------------------------------------------------------------------------------


per fare in modo che un elemento grafico usi lo style si puo' inserire nella definizione dell'oggetto. Per esempio


<TextView
             android:id="@+id/textView1"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_alignParentBottom="true"
             android:layout_centerHorizontal="true"
             android:text="@string/latlon"
             android:textAppearance="@style/latlon"
 />

RelativeLayout vs. LinearLayout

Normalmente i progetti di Android/Eclipse partono tutti con il LinearLayout, il modo piu' semplice (e meno potente) di disporre gli elementi grafici sullo schermo.

Impostando invece il RelativeLayout si ha il vantaggio di poter bloccare gli elementi grafici ad aree particolari dello schermo usando direttamente la composizione grafica del layout


Leggere file GPX in Android


Un esempio di come usare la classe java scaricabile qui per leggere i file gpx su Android


package com.gpx;


import android.app.Activity;


import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Iterator;


import java.util.List;


import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;


import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;


import android.location.Location;


import android.os.Bundle;
import android.util.Log;


class GpxReader
{
private static final SimpleDateFormat gpxDate = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");


public static List<Location> getPoints(File gpxFile)
{
    List<Location> points = null;
    try
    {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();


        FileInputStream fis = new FileInputStream(gpxFile);
        Document dom = builder.parse(fis);
        Element root = dom.getDocumentElement();
        NodeList items = root.getElementsByTagName("trkpt");


        points = new ArrayList<Location>();


        for(int j = 0; j < items.getLength(); j++)
        {
            Node item = items.item(j);
            NamedNodeMap attrs = item.getAttributes();
            NodeList props = item.getChildNodes();


            Location pt = new Location("test");


            pt.setLatitude(Double.parseDouble(attrs.getNamedItem("lat").getTextContent()));
            pt.setLongitude(Double.parseDouble(attrs.getNamedItem("lon").getTextContent()));


            for(int k = 0; k<props.getLength(); k++)
            {
                Node item2 = props.item(k);
                String name = item2.getNodeName();
                if(!name.equalsIgnoreCase("time")) continue;
                try
                {
                    pt.setTime((getDateFormatter().parse(item2.getFirstChild().getNodeValue())).getTime());
                }


                catch(ParseException ex)
                {
                    ex.printStackTrace();
                }
            }


            for(int y = 0; y<props.getLength(); y++)
            {
                Node item3 = props.item(y);
                String name = item3.getNodeName();
                if(!name.equalsIgnoreCase("ele")) continue;
                pt.setAltitude(Double.parseDouble(item3.getFirstChild().getNodeValue()));
            }


            points.add(pt);


        }


        fis.close();
    }


    catch(FileNotFoundException e)
    {
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }


    catch(ParserConfigurationException ex)
    {


    }


    catch (SAXException ex) {
    }


    return points;
}


public static SimpleDateFormat getDateFormatter()
  {
    return (SimpleDateFormat)gpxDate.clone();
  }


}






public class GpxActivity extends Activity {
    private List<Location> t;
private double lat;
private double lon;
private double alt;


/** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        File gpx = new File("/mnt/sdcard/malandrino.gpx");
        t = GpxReader.getPoints(gpx);
        Iterator<Location> it = t.iterator();
        while (it.hasNext())
        {
        Location value =  it.next();
        lat = value.getLatitude();
        lon = value.getLongitude();
        alt = value.getAltitude();
        Log.d("gpx",Double.toString(lat));
        Log.d("gpx",Double.toString(lon));
        Log.d("gpx",Double.toString(alt));
        }
    }
}

Visibilita' di un oggetto

Per settare se un oggetto e' visibile o meno a schermo si deve impostare la seguente proprieta'
per esempio se si vuole nascondere una immagine con nome imgview

imgview.setVisibility(View.INVISIBLE);


ed il suo ovvio opposto

venerdì 30 marzo 2012

Scaricare dati GPX da Garmin su Linux

Dovendo scaricare i dati (in formato GPX) dal Garmin 76CSx con interfaccia USB su Linux (Ubuntu)



la prima cosa da fare e' montare il modulo
modprobe garmin_gps
successivamente accendere il GPS

venerdì 23 marzo 2012

App full screen

Per evitare la scrittura del nome dell'applicazione nella parte alta dello schermo si puo' inserire nel Manifest.xml alla sezione application il comando

android:theme="@android:style/Theme.NoTitleBar.Fullscreen"


Change Detection with structural similarity

L'idea di base e' quella di cercare le differenze tra le due immagini sottostanti Non e' immediatamente visibile ma ci sono dei ...