Tacho, Drehzahlmesser animieren

  • Antworten:18
Pider Parker
  • Forum-Beiträge: 11

27.08.2012, 01:49:19 via Website

Hi Leute

will für eine App einen Tacho und Drehzahlmesser animieren.
Das ist ja nix anderes als eine Analog-Uhr und wurde bestimmt schonmal programmiert. Kennt jemand Links zu fertigem Code?
Hab mich schon dumm und dämlich gesucht, aber nix gefunden.

Will jetzt zuerstmal auf eine Tachoscheibe einen Zeiger legen und dann per Button im Kreis drehen(links, rechts) lassen.

Erhoff mir hier ein Anregung, d.h. mit welchen Methoden man das realisieren kann.

Ich muss noch dazu sagen, dass ich völliger Neuling in der Anroid-Programmierung bin.
Und bis auf ein paar Tutorials nix vorzuweisen hab.


Dank euch schonmal.

— geändert am 27.08.2012, 01:59:53

Antworten
Pider Parker
  • Forum-Beiträge: 11

27.08.2012, 09:15:41 via Website

Ja genau, wie hier im ersten Bild zusehen ist

https://www.nextpit.de/de/android/market/apps/app/de.asltd.fuelbook.android/Tankbuch-Mobil-Pro

Wie funktioniert das ganze?

Bei den Downloads gibt es eine Demo Source Code (der einige Fehler enthält und im Emulator nicht ausgeführt werden kann), java documentation und binary build libary. Steh wirklich noch am Anfang und kann damit leider nix anfangen.
Aber wir sind schon auf dem richtigen Weg :D

Antworten
Gelöschter Account
  • Forum-Beiträge: 694

27.08.2012, 09:53:12 via Website

Wir sind auf dem richtigen Weg

Ja, da gratuliere ich Euch aber.

* AChartEngine ins eigene Projekt einbinden

* Ich gehe mal davon aus das Ihr den LocationManager schon habt der Euch mit den Daten füttert (um z.B. die km/h zu berechnen).

* Ein LinearLayout mit einer eigener ID in die Ressourcen packen damit später die View von der AChartEngine dort angehangen werden kann.

* Benötigt werden:

CategorySeries (km/h)
DialRenderer (Needle)
SimpleSeriesRenderer (Color Red)

* Wenn Ihr die Chart habt dann lasst Ihr Euch aus der ChartFactory mit getDialChartView das Ergebnis geben und hängt das an das LinearLayout (s.o.).

* Der Update der Needle erfolgt dann durch setzen der km/h in der CategorySeries und einem repaint des dialChartViews.

Es gibt eine komplette Demo hierzu in den Samples der AChartEngine - daraus habe ich das auch gelernt. Ist nicht schwer - ist sauber aufgebaut.

— geändert am 27.08.2012, 09:53:24

Antworten
Pider Parker
  • Forum-Beiträge: 11

27.08.2012, 11:12:33 via Website

Danke Harald für deinen Einsatz. Aber ich versteh nur Bahnhof!!! Sorry
Bei mir hakts schon am ersten Punkt.

* AChartEngine ins eigene Projekt einbinden
Java Build Path - Libraries - Add external JARs?

* LocationManager
gibt es noch nicht

.....

Den Code der Samples versteh ich auch kein Stück, da fehlen mir einfach die Kenntnisse.
Wenn du mir das Beispiel nennen kannst wär ich dir sehr dankbar.

Ich wollt jetzt zuerst mal eine Scheibe (Hintergrund) und einen Zeiger, Nadel per Button links/rechts rum drehen lassen.
Wirklich eine einfache simple Übung ohne das jetzt schon Daten mit ins Spiel kommen.

Antworten
Pider Parker
  • Forum-Beiträge: 11

27.08.2012, 12:48:29 via Website

Super. Dank dir!!!

Antworten
Pider Parker
  • Forum-Beiträge: 11

27.08.2012, 19:17:06 via Website

Langsam steig ich durch :D
Die Demo hab ich importiert, doch zum laufen bekomm ich die nicht, wegen etlicher Fehler.
Naja nicht so schlimm. Hier wird die Demo vorgestellt, dann macht der Code auch mehr Sinn.
In der Playlist sind auch noch einige Tutorials, wens interessiert.

http://www.youtube.com/watch?v=s8cpqFrbnk8&feature=bf_prev&list=PL2603F3CABBF5EEB0

Den Tacho hab ich soweit hinbekommen. Min/Max Werte kann man leicht setzen.
Nur versteh ich nicht wie man die Skalierung vornimmt. Dachte an diese Zeile

renderer.setMargins(new int[] {40, 60, 30, 0});

Leider verändert sich nix. Geht das überhaupt? Weil in deiner App auch mit 10% unterteilt ist.

Hier setzt man die Nadel

category.add("Geschwindigkeit", 200);

Um die drehen zu lassen, muss der Wert verändert werden können!
Ich würd jetzt noch gerne einen Button einfügen der den Wert bis Max hochzählt und wieder zurück, usw.


Hast du mir ne Starthilfe? Hab mal was gesehen um eine Anzeige zu aktualisieren mit mProgress.setProgress();
Versuch ich auch gleich mal.

Für die vorherigen Tips, besten Dank. Genau nach was ich suchte.

— geändert am 27.08.2012, 19:18:34

Antworten
Gelöschter Account
  • Forum-Beiträge: 694

27.08.2012, 20:41:50 via Website

Update geht z.B. mit den folgenden Zeilen - wobei graphicalView der Returnwert aus der ChartFactory ist:

1categorySeries.set(0, category, (double) kilometerProStunde);
2graphicalView.repaint();

Eine Skalierung habe ich nicht vorgenommen - ich habe nur min/max gesetzt.

Margins ist der Rahmen rund um das Chart Objekt.

— geändert am 27.08.2012, 20:43:06

Antworten
Pider Parker
  • Forum-Beiträge: 11

31.08.2012, 09:32:06 via Website

Hi Harald,

dank dir nochmal vielmals, hast mich in die richtige Richtung geführt. :D
Kann man hier auch zip/rar-files hochladen? Bilder gehen ja. Dann würd ich das Projekt noch hochladen.
Wenns interessiert unten noch der Quellcode der einzelnen Klassen.

Ich hab mich ziemlich genau an das Tutorial orientiert.

http://www.youtube.com/watch?v=E9fozQ5NlSo&list=PL2603F3CABBF5EEB0&index=8&feature=plpp_videohttp://

Statt einem neuen Punkt(x,y), ist es hier nur eine Geschwindigkeit die hochgezählt wird.

1package com.dynamictacho;
2
3import org.achartengine.GraphicalView;
4
5import android.os.Bundle;
6import android.app.Activity;
7import android.view.Menu;
8
9public class DynamicTachoActivity extends Activity
10{
11
12 private static GraphicalView view;
13 private TachoGraph tacho = new TachoGraph();
14 private static Thread thread;
15
16 @Override
17 public void onCreate(Bundle savedInstanceState)
18 {
19 super.onCreate(savedInstanceState);
20 setContentView(R.layout.activity_dynamic_tacho);
21
22 thread = new Thread()
23 {
24 public void run()
25 {
26 for (int i = 0; i < 281; i++)
27 {
28 try {
29 Thread.sleep(2000);
30 }
31 catch (InterruptedException e)
32 {
33 // TODO Auto-generated catch block
34 e.printStackTrace();
35 }
36
37 Speed v = Counter.getDatafromReceiver(i);
38 tacho.addNewSpeeds(v);
39 view.repaint();
40 }
41 }
42
43 };
44
45 thread.start();
46
47 }
48
49 @Override
50 public boolean onCreateOptionsMenu(Menu menu)
51 {
52 getMenuInflater().inflate(R.menu.activity_dynamic_tacho, menu);
53 return true;
54 }
55
56 @Override
57 protected void onStart()
58 {
59 super.onStart();
60 view = tacho.getView(this);
61 setContentView(view);
62 }
63
64}

1package com.dynamictacho;
2
3import org.achartengine.ChartFactory;
4import org.achartengine.GraphicalView;
5import org.achartengine.model.CategorySeries;
6import org.achartengine.renderer.DialRenderer;
7import org.achartengine.renderer.SimpleSeriesRenderer;
8import org.achartengine.renderer.DialRenderer.Type;
9
10import android.content.Context;
11import android.graphics.Color;
12
13public class TachoGraph
14{
15 private GraphicalView view;
16
17 CategorySeries category = new CategorySeries("Tacho");
18 DialRenderer renderer = new DialRenderer();
19 SimpleSeriesRenderer r = new SimpleSeriesRenderer();
20
21 public TachoGraph()
22 {
23 category.add("Geschwindigkeit", 0);
24 renderer.setChartTitleTextSize(20);
25 renderer.setLabelsTextSize(15);
26 renderer.setLegendTextSize(15);
27 renderer.setMargins(new int[] {20, 30, 15, 0});
28 r.setColor(Color.RED);
29 renderer.addSeriesRenderer(r);
30 renderer.setLabelsTextSize(10);
31 renderer.setLabelsColor(Color.BLACK);
32 renderer.setShowLabels(true);
33 renderer.setVisualTypes(new DialRenderer.Type[] {Type.NEEDLE});
34 renderer.setMinValue(0);
35 renderer.setMaxValue(280);
36 renderer.setMajorTicksSpacing(20);
37 renderer.setShowLegend(false);
38 renderer.setMinorTicksSpacing(10);
39
40 }
41
42 public GraphicalView getView(Context context)
43 {
44 view = ChartFactory.getDialChartView(context, category, renderer);
45 return view;
46 }
47
48 public void addNewSpeeds(Speed v)
49 {
50 category.set(0,"Geschwindigkeit", v.getV());
51 }
52
53
54}

1package com.dynamictacho;
2
3public class Counter
4{
5 public static Speed getDatafromReceiver(int z)
6 {
7 return new Speed(z);
8 }
9}

1package com.dynamictacho;
2
3public class Speed
4{
5 private int v;
6
7 public Speed(int v)
8 {
9 this.v = v;
10 }
11
12 public int getV()
13 {
14 return v;
15 }
16
17}

Antworten
Pider Parker
  • Forum-Beiträge: 11

01.09.2012, 15:40:54 via Website

Ich will den Tacho und Drehzahlmesser in AcionBar Tabs unterbringen.
Das Ziffernblatt und die Nadel ruf ich im Fragment auf
1@Override
2 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
3 // Inflate the layout for this fragment
4
5 final TachoGraph tacho = new TachoGraph();
6 final GraphicalView chart = tacho.getView(inflater.getContext());
7
8
9 return chart;
10
11 }

Versteh jetzt nicht wie ich das mit dem repaint mache.

Bzw will ich die beide Ziffernblätter auf einem Tab unterbringen. Hab auch schon gegoogelt, leider ist die Umsetzung fehlgeschlagen

— geändert am 06.09.2012, 11:54:29

Antworten
Pider Parker
  • Forum-Beiträge: 11

26.09.2012, 20:55:01 via Website

Hi Harald,

dein Typ ist gefragt!!!
Steh jetzt seit 2 Tagen aufm Schlauch und komm einfach nicht weiter.

Hast du eine Idee wie man man 2 Ziffernblätter auf einen Bildschirm packt?

Bzw. wie man die Ziffernblätter einzelnen in Tabs unterbringt?

Antworten
Gelöschter Account
  • Forum-Beiträge: 694

27.09.2012, 11:57:48 via Website

Das habe ich noch nie benötigt. Wenn ich das machen müsste würde ich folgendes versuchen:

Die ChartFactory liefert eine View. Ich würde halt zwei komplette Charts erzeugen lassen und deren Views in Dein Layout einbetten. Dazu noch die FILL_PARENTs durch etwas Sinnvolles ersetzen:

1// ...
2graphicalView = ChartFactory.getDialChartView(this, categorySeries, dialRenderer);
3linearLayout.addView(graphicalView, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));

Antworten
Pider Parker
  • Forum-Beiträge: 11

28.09.2012, 00:46:52 via Website

Perfekt, dank dir, das zweite Ziffernblatt einzubetten war relativ einfach.

Nur machen mir die Tabs zu schaffen. Mit den ganzen Tutorials im Netz, bekomm ich nur die erste View beim Start hin, diese upzudaten, will einfach nicht klappen. Sorry das ich schon wieder nachfrage, aber deine Tipps sind einfach Gold wert.

Antworten
Pider Parker
  • Forum-Beiträge: 11

12.11.2012, 20:04:53 via Website

Servus Harald,

das Projekt neigt sich dem Ende zu :D
Die App kommt in keinen Store, aber wird auf der Homepage unserer Hochschule veröffentlicht.
Du hast für deine App auch die AChartEngine verwendet!!!
Das ganze ist ja OpenSource, aber wie sieht es da mit der Lizenz aus?
Kannst du hierzu bitte ein paar Worte sagen

Antworten
Christian
  • Forum-Beiträge: 307

12.11.2012, 21:02:33 via Website

Hi Pider Parker,

als Ergänzung zu Harald seinem Post:


AChartEngine is contributed based on the Apache 2.0 license.
AChartEngine is an open-source framework, free to use in any free or commercial application.
Donations will help it grow and keep improving.
Thank you for appreciating our work.
Quelle

Mfg Christian

Antworten