Tacho, Drehzahlmesser animieren

G

GSUS24

Neues Mitglied
0
Hallo Leute,

bin neu in der App-Programmierung und lese mich gerade erst ein.
Unteranderem auch auf der Developerseite von Android.
Ein paar Mitstudenten und ich wollen eine App ähnlich Torque Pro schreiben.
Bei der verschiedene Signale(Drehzahl, Tacho, Bremsdruck, Längs-Querbeschleunigungen,...) vom Auto angezeigt werden sollen.
Meine Aufgabe in diesem Projekt ist die Anzeige.

Ich hab auch schon die Suchfunktion versucht, leider ohne Erfolg.
Das gleich gilt auch für Google. Möglicherweise benutze ich einfach die falschen Schlagwörter. Darum erhoffe ich mir hier eine Starthilfe.

Bei Torque sieht das ganze dann so aus
anzeigeinstrumente.PNG

Mir geht es jetzt hauptsächlich darum, wie ich solche Instrumente(Zeiger, Balken,...) animieren kann.

Danke
 
Würde ich ganz popelig machen:

Der Hintergrund wird als fertige Bitmap bereitgestellt.

Die Zeiger werden von einer CustomView drübergemalt. (diese können Bitmaps sein,
die je nach Wert gedreht und dann in den View gemalt werden).

Für die animierte Wertänderung kann man einen Thread starten, der den Wert kontinuierlich von "ist" auf "soll" an den View übergibt und diesen dann (mit postInvalidate()) zum neu Malen bringt.
 
  • Danke
Reaktionen: GSUS24
Mit der AChartEngine hab ich mir einen Tacho gebastelt. Zum Test läuft eine if-Schleife hoch. Die tatsächlichen Geschwindigkeiten kommen vom Bluetoothreceiver. Würd mich über ein Feedback freuen.

Der Tacho sieht doch billig aus, reicht für meine Zwecke aber völlig aus.


Code:
package com.dynamictacho;

import org.achartengine.GraphicalView;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;

public class DynamicTachoActivity extends Activity 
{

    private static GraphicalView view;
    private TachoGraph tacho = new TachoGraph();
    private static Thread thread;
        
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_dynamic_tacho);
        
        thread = new Thread()
        {            
            public void run()
            {   
                for (int i = 0; i < 281; i++) 
                {
                    try {
                        Thread.sleep(100);
                        } 
                    catch (InterruptedException e) 
                        {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                        }
                                    
                    Speed v = MockDataV.getDatafromReceiver(i);
                    tacho.addNewSpeeds(v);
                    view.repaint();
                                  
                }
                
            }
                            
        };
        
        thread.start();
        
    }   
               
    @Override
    public boolean onCreateOptionsMenu(Menu menu) 
    {
        getMenuInflater().inflate(R.menu.activity_dynamic_tacho, menu);
        return true;
    }
    
    @Override
    protected void onStart() 
    {
        super.onStart();
        view = tacho.getView(this);
        setContentView(view);
    }
     
}
Code:
package com.dynamictacho;

public class MockDataV 
{    
    public static Speed getDatafromReceiver(int z)
    {    
        return  new Speed(z);  
    }
}
Code:
package com.dynamictacho;

public class Speed 
{    
    private int v;
    
    public Speed(int v)
    {
        this.v = v;
    }
    
    public int getV() 
    {
        return v;
    }

}
Code:
package com.dynamictacho;

import org.achartengine.ChartFactory;
import org.achartengine.GraphicalView;
import org.achartengine.model.CategorySeries;
import org.achartengine.renderer.DialRenderer;
import org.achartengine.renderer.SimpleSeriesRenderer;
import org.achartengine.renderer.DialRenderer.Type;

import android.content.Context;
import android.graphics.Color;

public class TachoGraph 
{
    private GraphicalView view;
        
    CategorySeries category = new CategorySeries("Tacho");
    DialRenderer renderer = new DialRenderer();
    SimpleSeriesRenderer r = new SimpleSeriesRenderer();

    public TachoGraph()
    {
        category.add("Geschwindigkeit", 0);
        renderer.setChartTitleTextSize(20);
        renderer.setLabelsTextSize(15);
        renderer.setLegendTextSize(15);
        renderer.setMargins(new int[] {0, 0, 0, 0});
        r.setColor(Color.RED);
        renderer.addSeriesRenderer(r);
        renderer.setLabelsTextSize(10);
        renderer.setLabelsColor(Color.BLACK);
        renderer.setShowLabels(true);
        renderer.setVisualTypes(new DialRenderer.Type[] {Type.NEEDLE});
        renderer.setMinValue(0);
        renderer.setMaxValue(280);
        renderer.setMajorTicksSpacing(20);
        renderer.setShowLegend(false);
        renderer.setMinorTicksSpacing(10);
        
        renderer.setAngleMax(150);
        renderer.setAngleMin(360);
        
    }
        
    public GraphicalView getView(Context context) 
    {
        view =  ChartFactory.getDialChartView(context, category, renderer);
                return view;
    }
        
    public void addNewSpeeds(Speed v)
    {
        category.set(0,"Geschwindigkeit", v.getV());
    }

    
}
 
Ich versuche grad den Tacho und Drehzahlmesser in ActionBar Tabs zu packen. Im Fragment leg ich das Layout fest.
Wie kann ich die Tabs updaten?


Code:
@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        
        final TachoGraph tacho = new TachoGraph();
        final GraphicalView chart = tacho.getView(inflater.getContext());
        
        
        return chart;       
               
    }
 
Bin hier leider immer noch nicht weitergekommen!!!

Hat wirklich niemand eine Idee?
Das ganze soll so wie oben funktionieren, nur eben in Tabs.

Bin jetzt gute 2 Tage dran und bin nicht wirklich schlauer als zuvor.
 
Hallo,

ich habe mir jetzt nicht alles durchgelesen, aber vielleicht hilft dir mein Tutorial weiter: Android SDK: Creating a Rotating Dialer

Darin beschreibe ich, wie man Bitmaps animiert und dreht. Das Projekt dazu kannst du dir auch runterladen.
 
Das zweite Ziffernblatt war recht einfach einzubetten.

Code:
package com.dynamictacho;

import org.achartengine.GraphicalView;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.LinearLayout;

public class DynamicTachoActivity extends Activity 
{

    private static GraphicalView view;
    private TachoGraph tacho = new TachoGraph();
    
    private static GraphicalView view2;
    private RpmGraph rpm = new RpmGraph();
        
    private static Thread thread;
        
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_dynamic_tacho);
                   
        thread = new Thread()
        {            
            public void run()
            {   
                for (int i = 0, j=0; i < 201 && j<8001; i++,j+=40) 
                {
                    try {
                        Thread.sleep(100);
                        } 
                    catch (InterruptedException e) 
                        {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                        }
                                    
                    Speed v = MockDataV.getDatafromReceiver(i);
                    tacho.addNewSpeeds(v);
                    view.repaint();
                                        
                    EngSpeed w = MockDataW.getDatafromReceiver(j);
                    rpm.addNewEngSpeeds(w);
                    view2.repaint();
                                                     
                }
                
            }
                            
        };
        
        thread.start();
        
    }   
               
    @Override
    public boolean onCreateOptionsMenu(Menu menu) 
    {
        getMenuInflater().inflate(R.menu.activity_dynamic_tacho, menu);
        return true;
    }
    
    @Override
    protected void onStart() 
    {        
        super.onStart();
        
        LinearLayout layout1 = (LinearLayout) findViewById(R.id.tacho);
        view = tacho.getView(this);
        layout1.addView(view);    
        
        LinearLayout layout2 = (LinearLayout) findViewById(R.id.rpm);
        view2 = rpm.getView(this);
        layout2.addView(view2);
        
    }
     
}

Code:
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    >

    <LinearLayout

        android:id="@+id/tacho"
        android:layout_width="fill_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        />

    <LinearLayout

        android:id="@+id/rpm"
        android:layout_width="fill_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        />

</LinearLayout>

Ich will die Ziffernblätter und verschiedenen ProgressBars in Tabs packen.

Mit den ganzen Tutorials im Netz bekomm ich nur die erste View bei Start hin. Die Views upzudaten find ich einfach nichts im Netz.

Bin über jede Hilfestellung dankbar!!!
 

Ähnliche Themen

T
Antworten
2
Aufrufe
946
TimWeiland
T
SM-T110 UND GT-I9300
Antworten
3
Aufrufe
853
SM-T110 UND GT-I9300
SM-T110 UND GT-I9300
Zurück
Oben Unten