Compare commits
2 Commits
09d4c45ff0
...
9c1899fe42
Author | SHA1 | Date | |
---|---|---|---|
|
9c1899fe42 | ||
|
82bd01d9c8 |
@ -25,6 +25,7 @@ dependencies {
|
||||
implementation fileTree(dir: "libs", include: ["*.jar"])
|
||||
implementation 'androidx.appcompat:appcompat:1.2.0'
|
||||
implementation 'androidx.constraintlayout:constraintlayout:2.0.1'
|
||||
implementation 'androidx.cardview:cardview:1.0.0'
|
||||
testImplementation 'junit:junit:4.12'
|
||||
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
|
||||
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
|
||||
|
@ -4,6 +4,7 @@ import androidx.appcompat.app.AppCompatActivity;
|
||||
import androidx.constraintlayout.widget.ConstraintLayout;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.os.Looper;
|
||||
import android.view.View;
|
||||
import android.widget.Button;
|
||||
import android.widget.LinearLayout;
|
||||
@ -24,7 +25,7 @@ public class MainActivity extends AppCompatActivity implements Observer {
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.activity_main);
|
||||
this.track = new Track(40, 200);
|
||||
this.track = new Track(25, 100);
|
||||
this.track.addObserver(this);
|
||||
this.viewStack = (LinearLayout) findViewById(R.id.trackViewStack);
|
||||
|
||||
@ -35,17 +36,20 @@ public class MainActivity extends AppCompatActivity implements Observer {
|
||||
final Track trackRef = this.track;
|
||||
//final TimeRecordView viewRef = this.trackView;
|
||||
final LinearLayout viewStackRef = this.viewStack;
|
||||
final List<VehicleTimeRecord> newRecords = (List<VehicleTimeRecord>) o;
|
||||
//final List<VehicleTimeRecord> newRecords = (List<VehicleTimeRecord>) o;
|
||||
final MainActivity mainActivity = this;
|
||||
runOnUiThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
TimeRecordView newTrView = new TimeRecordView(mainActivity, newRecords, trackRef.getTrackLength());
|
||||
viewStackRef.addView(newTrView, 0);
|
||||
int childCount = viewStackRef.getChildCount();
|
||||
if (childCount > 30) {
|
||||
viewStackRef.removeViewAt(childCount-1);
|
||||
}
|
||||
TimeRecordView newTrView = new TimeRecordView(mainActivity, trackRef);
|
||||
if (viewStackRef.getChildCount() > 0)
|
||||
viewStackRef.removeViewAt(0);
|
||||
viewStackRef.addView(newTrView);
|
||||
//viewStackRef.addView(newTrView, 0);
|
||||
//int childCount = viewStackRef.getChildCount();
|
||||
//if (childCount > 30) {
|
||||
// viewStackRef.removeViewAt(childCount-1);
|
||||
//}
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -11,17 +11,17 @@ import java.util.List;
|
||||
|
||||
public class TimeRecordView extends View {
|
||||
protected Paint paint;
|
||||
protected List<VehicleTimeRecord> records;
|
||||
protected Track track;
|
||||
protected int pixelPerVehicle;
|
||||
protected float trackLength;
|
||||
|
||||
public TimeRecordView(Context context, List<VehicleTimeRecord> records, float trackLength) {
|
||||
public TimeRecordView(Context context, Track track) {
|
||||
super(context);
|
||||
this.records = records;
|
||||
this.trackLength = trackLength;
|
||||
this.track = track;
|
||||
this.paint = new Paint();
|
||||
paint.setColor(Color.BLACK);
|
||||
paint.setStyle(Paint.Style.FILL_AND_STROKE);
|
||||
this.setBackgroundColor(Color.BLACK);
|
||||
this.pixelPerVehicle = (int) (this.getWidth() / this.track.getTrackLength());
|
||||
}
|
||||
|
||||
protected int getColor(float curVelocity, float maxVelocity) {
|
||||
@ -42,25 +42,32 @@ public class TimeRecordView extends View {
|
||||
|
||||
@Override
|
||||
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
||||
super.onMeasure(widthMeasureSpec, 20);
|
||||
setMeasuredDimension(widthMeasureSpec, 20);
|
||||
super.onMeasure(widthMeasureSpec, 10*50);
|
||||
setMeasuredDimension(widthMeasureSpec, 10*50);
|
||||
this.pixelPerVehicle = (int) (this.getWidth() / this.track.getTrackLength());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
|
||||
super.onSizeChanged(w, h, oldw, oldh);
|
||||
this.pixelPerVehicle = (int) (this.getWidth() / this.track.getTrackLength());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDraw(Canvas canvas) {
|
||||
this.pixelPerVehicle = (int) (this.getWidth() / this.trackLength);
|
||||
int y = 0;
|
||||
List<List<VehicleTimeRecord>> stepList = this.track.getVtrList();
|
||||
for (int curStepIdx = stepList.size()-1; curStepIdx >= stepList.size()-1-50 && curStepIdx >= 0; curStepIdx--) {
|
||||
List<VehicleTimeRecord> step = stepList.get(curStepIdx);
|
||||
int i = 0;
|
||||
for (VehicleTimeRecord r : this.records) {
|
||||
for (VehicleTimeRecord r : step) {
|
||||
int left = (int) (this.pixelPerVehicle * r.getPosition());
|
||||
this.paint.setColor(getColor(r.getVelocity(), r.getMaxVelocity()));
|
||||
canvas.drawRect(left, 0, left + this.pixelPerVehicle - 1,
|
||||
20, this.paint);
|
||||
canvas.drawRect(left, y, left + this.pixelPerVehicle - 1,
|
||||
y+10, this.paint);
|
||||
i++;
|
||||
}
|
||||
y += 10;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -71,8 +71,13 @@ public class Track extends Observable {
|
||||
}
|
||||
update_avg();
|
||||
this.setChanged();
|
||||
this.notifyObservers(records);
|
||||
this.notifyObservers();
|
||||
this.clearChanged();
|
||||
try {
|
||||
Thread.sleep(125);
|
||||
} catch (InterruptedException ex) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public float avg_step(int step){
|
||||
|
@ -8,53 +8,199 @@
|
||||
tools:context=".MainActivity">
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/trackViewStack"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="0dp"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_marginStart="8dp"
|
||||
android:layout_marginTop="8dp"
|
||||
android:layout_marginEnd="8dp"
|
||||
android:layout_marginBottom="8dp"
|
||||
android:orientation="vertical"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
app:layout_constraintTop_toTopOf="parent">
|
||||
|
||||
<Button
|
||||
android:id="@+id/stopButton"
|
||||
<View
|
||||
android:id="@+id/divider3"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="1dp"
|
||||
android:background="?android:attr/listDivider" />
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
android:paddingTop="8dp"
|
||||
android:paddingBottom="8dp">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/textView4"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="Track length" />
|
||||
|
||||
<SeekBar
|
||||
android:id="@+id/seekBar3"
|
||||
style="@style/Widget.AppCompat.SeekBar.Discrete"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:max="10"
|
||||
android:progress="3" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/textView3"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="Number of vehicles" />
|
||||
|
||||
<SeekBar
|
||||
android:id="@+id/seekBar2"
|
||||
style="@style/Widget.AppCompat.SeekBar.Discrete"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:max="10"
|
||||
android:progress="3" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/textView5"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="Maximum velocity" />
|
||||
|
||||
<SeekBar
|
||||
android:id="@+id/seekBar4"
|
||||
style="@style/Widget.AppCompat.SeekBar.Discrete"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:max="10"
|
||||
android:progress="3" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/textView6"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="Brake probability" />
|
||||
|
||||
<SeekBar
|
||||
android:id="@+id/seekBar5"
|
||||
style="@style/Widget.AppCompat.SeekBar.Discrete"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:max="10"
|
||||
android:progress="3" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<View
|
||||
android:id="@+id/divider"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="1dp"
|
||||
android:background="?android:attr/listDivider" />
|
||||
|
||||
<TableLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingTop="8dp"
|
||||
android:paddingBottom="8dp">
|
||||
|
||||
<TableRow
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/textView2"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="Average velocity (overall):" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/textView7"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="16dp"
|
||||
android:enabled="false"
|
||||
android:onClick="onStopButtonClick"
|
||||
android:text="Stop"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintHorizontal_bias="0.95"
|
||||
app:layout_constraintStart_toStartOf="parent" />
|
||||
android:text="TextView" />
|
||||
</TableRow>
|
||||
|
||||
<Button
|
||||
android:id="@+id/stepButton"
|
||||
<TableRow
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/textView"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="Average velocity (last step):" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/textView8"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="16dp"
|
||||
android:onClick="onStepButtonClick"
|
||||
android:text="Step"
|
||||
android:text="TextView" />
|
||||
|
||||
</TableRow>
|
||||
|
||||
</TableLayout>
|
||||
|
||||
<View
|
||||
android:id="@+id/divider2"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="1dp"
|
||||
android:background="?android:attr/listDivider" />
|
||||
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:paddingTop="8dp"
|
||||
android:paddingBottom="8dp">
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/trackViewStack"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:orientation="vertical"
|
||||
app:layout_constraintBottom_toTopOf="@+id/linearLayout"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
tools:layout_editor_absoluteX="8dp">
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/linearLayout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="horizontal"
|
||||
android:paddingTop="8dp"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintHorizontal_bias="0.5"
|
||||
app:layout_constraintStart_toStartOf="parent" />
|
||||
app:layout_constraintStart_toStartOf="@+id/playButton">
|
||||
|
||||
<Button
|
||||
android:id="@+id/playButton"
|
||||
style="@style/Widget.AppCompat.Button.Borderless"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="16dp"
|
||||
android:onClick="onPlayButtonClick"
|
||||
android:text="Play"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintHorizontal_bias="0.049"
|
||||
app:layout_constraintStart_toStartOf="parent" />
|
||||
android:text="Play" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/stepButton"
|
||||
style="@style/Widget.AppCompat.Button.Borderless"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:onClick="onStepButtonClick"
|
||||
android:text="Step" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/stopButton"
|
||||
style="@style/Widget.AppCompat.Button.Borderless"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:enabled="false"
|
||||
android:onClick="onStopButtonClick"
|
||||
android:text="Stop" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
Loading…
Reference in New Issue
Block a user