Autore Topic: tachimetro digitale  (Letto 1332 volte)

Offline F4L|{0

  • Nuovo arrivato
  • *
  • Post: 24
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Nexus S
  • Play Store ID:
    Jesi
  • Sistema operativo:
    Windows XP + ubuntu
tachimetro digitale
« il: 17 Maggio 2011, 17:33:10 CEST »
0
stavo sviluppando un'applicativo che mi leggesse e visualizzasse la velocità letta dal GPS in un display LCD

di seguito il codice xml
Codice: [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
           xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
           android:orientation="horizontal"
           android:layout_gravity="center_horizontal"
           android:background="@drawable/carbon">
           <RelativeLayout
                   android:id="@+id/layoutspeed"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                   android:orientation="horizontal"
                   android:layout_gravity="center_horizontal"
                   android:background="#FF220000">
            <it.android.TrackRace.CustomImageView
                    android:id="@+id/speedimg"
                    android:layout_width="fill_parent"
                    android:layout_height="160px"
                    android:gravity="center">
            </it.android.TrackRace.CustomImageView>
    </RelativeLayout>
</RelativeLayout>       


e qui la parte di codice che gestisce il tutto
Codice: [Seleziona]
package it.android.TrackRace;

import java.util.ArrayList;
import java.util.List;
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.View;

public class CustomImageView extends View {
       
        private Bitmap centinaiaBitmap = null;
        private Bitmap decineBitmap = null;
        private Bitmap unitaBitmap = null;
        private Bitmap dotBitmap = null;
        private Bitmap decimiBitmap = null;
        private Bitmap centesimiBitmap = null;
        private List<Integer> bitmapIDArray = null;
       
        private Resources res = null;
 
        public CustomImageView(Context context, AttributeSet attrs) {
                super(context, attrs);
                // load the images needed by the custoim view
                initialize(context);
                return;
        }

        @Override
        protected void onDraw(Canvas canvas)
        {
                int left = 0;
                canvas.drawBitmap(centinaiaBitmap, left, 0, null);
                left += 80;
                canvas.drawBitmap(decineBitmap, left, 0, null);
                left += 80;
                canvas.drawBitmap(unitaBitmap, left, 0, null);
                left += 70;
                canvas.drawBitmap(dotBitmap, left, 50, null);
                left += 40;
                canvas.drawBitmap(decimiBitmap, left, 0, null);
                left += 80;
                canvas.drawBitmap(centesimiBitmap, left, 0, null);
                return;
        }
       
        @Override
        protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec)
        {
                super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        }
       
        /**
         * This method loads the bitmaps used to show the tach on the screen
         */
        private void initialize(final Context context) {
                res = context.getResources();
       
                dotBitmap = BitmapFactory.decodeResource(res, R.drawable.red_colon);
                centinaiaBitmap = BitmapFactory.decodeResource(res, R.drawable.inactive_red);
                decineBitmap = BitmapFactory.decodeResource(res, R.drawable.inactive_red);
                unitaBitmap = BitmapFactory.decodeResource(res, R.drawable.inactive_red);
                decimiBitmap = BitmapFactory.decodeResource(res, R.drawable.inactive_red);
                centesimiBitmap = BitmapFactory.decodeResource(res, R.drawable.inactive_red);
                //carico un array di indici di risorsa per i numeri
                bitmapIDArray = new ArrayList<Integer>();
                bitmapIDArray.add(R.drawable.red0);
                bitmapIDArray.add(R.drawable.red1);
                bitmapIDArray.add(R.drawable.red2);
                bitmapIDArray.add(R.drawable.red3);
                bitmapIDArray.add(R.drawable.red4);
                bitmapIDArray.add(R.drawable.red5);
                bitmapIDArray.add(R.drawable.red6);
                bitmapIDArray.add(R.drawable.red7);
                bitmapIDArray.add(R.drawable.red8);
                bitmapIDArray.add(R.drawable.red9);
                return;
        }
       
        synchronized public void updateSpeed(String speed)
        {
                if(bitmapIDArray == null || bitmapIDArray.size() < 10)
                        return;
                //prendo la velocità
                float vel = (float) 0.0;
                try {vel = Float.parseFloat(speed); }catch(Exception ex){}finally{}
               
               
                int pos = (int)(vel / 100);
                if(pos > 0)
                        centinaiaBitmap = BitmapFactory.decodeResource(res, bitmapIDArray.get(pos));
               
                pos = (int)(vel / 10) % 10;
                if((int)(vel / 100) > 0 || pos > 0)
                        decineBitmap = BitmapFactory.decodeResource(res, bitmapIDArray.get(pos));
                pos = (int)(vel / 1) % 10;
                unitaBitmap = BitmapFactory.decodeResource(res, bitmapIDArray.get(pos));
                pos = (int)(((vel % 1) * 10));
                decimiBitmap = BitmapFactory.decodeResource(res, bitmapIDArray.get(pos));
                pos = (int)((((vel + 0.0005) % 1) * 100) % 10);
                centesimiBitmap = BitmapFactory.decodeResource(res, bitmapIDArray.get(pos));
                                return;
        }
}

tengo a precisare che la base di partenza è stato il progetto di un altro utente (il tachimetro a barre), e che il tutto è da ottimizzare e migliorare.

quello che non mi porta bene e che mentre l'editor xml di eclipse mi fa vedere che i numeri occupano tutto lo spazio disponibile come carico l'applicativo sul dispositivo ciò non e vero, infatti la porzione di layout  occupata è una piccola parte di quella a disposizione.

due, come posso inserire un bordo al relativelayout che uso per delimitare il display LCD?
 

grazie

ciao
« Ultima modifica: 17 Maggio 2011, 19:23:14 CEST da F4L|{0 »

Offline F4L|{0

  • Nuovo arrivato
  • *
  • Post: 24
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Nexus S
  • Play Store ID:
    Jesi
  • Sistema operativo:
    Windows XP + ubuntu
Re:display LCD
« Risposta #1 il: 17 Maggio 2011, 17:35:30 CEST »
0
altra cosina
come posso gestire al meglio questo metodo?

onMeasure(...)

Offline F4L|{0

  • Nuovo arrivato
  • *
  • Post: 24
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Nexus S
  • Play Store ID:
    Jesi
  • Sistema operativo:
    Windows XP + ubuntu
Re:display LCD
« Risposta #2 il: 17 Maggio 2011, 18:06:51 CEST »
0

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:display LCD
« Risposta #3 il: 17 Maggio 2011, 18:33:01 CEST »
0
questo è quello che ottengo sul dispositivo
http://www.facebook.com/photo.php?fbid=1854286391703&set=a.1738422255172.2089002.1077109426&type=1

Mmmm... non avendo facebook non posso vedere l'immagine... puoi metterla su uno dei servizi di pic hosting?  :-P
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline blackgin

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1387
  • Respect: +164
    • Google+
    • blackgins
    • blackginsoft
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Sistema operativo:
    Mac OSX 10.8
Re:display LCD
« Risposta #4 il: 17 Maggio 2011, 18:54:34 CEST »
0
1) Evita i post multipli
2) Usa un titolo significativo
Postate il LogCat LogCat LogCat LogCat LogCat

Offline F4L|{0

  • Nuovo arrivato
  • *
  • Post: 24
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Nexus S
  • Play Store ID:
    Jesi
  • Sistema operativo:
    Windows XP + ubuntu
Re:display LCD
« Risposta #5 il: 17 Maggio 2011, 19:17:30 CEST »
0
allora hai ragione ma in ufficio era l'unico modo per fare un upload di immagini

comunque riposto l'immagine



Uploaded with ImageShack.us

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:display LCD
« Risposta #6 il: 17 Maggio 2011, 19:23:14 CEST »
0
Temo sia dovuto al fatto che la customview viene disegnata con valori assoluti di pixel, senza tenere conto della risoluzione del display. Se è così, se usi un emulatore con stessa risoluzione del tuo telefono, dovrebbe mostrarti la stess anomalia.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store