Search in sources :

Example 1 with GpxMarkerView

use of net.osmand.plus.track.GpxMarkerView in project Osmand by osmandapp.

the class GpxUiHelper method setupGPXChart.

public static void setupGPXChart(@NonNull LineChart mChart, float topOffset, float bottomOffset, boolean useGesturesAndScale, @Nullable Drawable markerIcon) {
    GpxMarkerView markerView = new GpxMarkerView(mChart.getContext(), markerIcon);
    setupGPXChart(mChart, markerView, topOffset, bottomOffset, useGesturesAndScale);
}
Also used : GpxMarkerView(net.osmand.plus.track.GpxMarkerView)

Example 2 with GpxMarkerView

use of net.osmand.plus.track.GpxMarkerView in project Osmand by osmandapp.

the class TrackDetailsMenu method updateView.

private void updateView(final View parentView, boolean forceFitTrackOnMap) {
    MapActivity mapActivity = getMapActivity();
    GpxDisplayItem gpxItem = getGpxItem();
    if (mapActivity == null || gpxItem == null) {
        return;
    }
    final OsmandApplication app = mapActivity.getMyApplication();
    final UiUtilities ic = app.getUIUtilities();
    final boolean nightMode = app.getDaynightHelper().isNightModeForMapControls();
    GPXTrackAnalysis analysis = gpxItem.analysis;
    if (analysis == null || gpxItem.chartTypes == null) {
        parentView.setVisibility(View.GONE);
        if (analysis != null && analysis.isBoundsCalculated()) {
            mapActivity.getMapView().fitRectToMap(analysis.left, analysis.right, analysis.top, analysis.bottom, 0, 0, 0);
        }
        return;
    }
    final LineChart chart = (LineChart) parentView.findViewById(R.id.chart);
    chart.setOnChartValueSelectedListener(new OnChartValueSelectedListener() {

        @Override
        public void onValueSelected(Entry e, Highlight h) {
            refreshChart(chart, false);
        }

        @Override
        public void onNothingSelected() {
        }
    });
    // final float minDragTriggerDist = AndroidUtils.dpToPx(app, 3);
    // chart.setOnTouchListener(new BarLineChartTouchListener(chart, chart.getViewPortHandler().getMatrixTouch(), 3f) {
    // private PointF touchStartPoint = new PointF();
    // 
    // @SuppressLint("ClickableViewAccessibility")
    // @Override
    // public boolean onTouch(View v, MotionEvent event) {
    // switch (event.getAction() & MotionEvent.ACTION_MASK) {
    // case MotionEvent.ACTION_DOWN:
    // saveTouchStart(event);
    // break;
    // case MotionEvent.ACTION_POINTER_DOWN:
    // if (event.getPointerCount() >= 2) {
    // saveTouchStart(event);
    // }
    // break;
    // case MotionEvent.ACTION_MOVE:
    // if (mTouchMode == NONE && mChart.hasNoDragOffset()) {
    // float touchDistance = distance(event.getX(), touchStartPoint.x, event.getY(), touchStartPoint.y);
    // if (Math.abs(touchDistance) > minDragTriggerDist) {
    // mTouchMode = DRAG;
    // }
    // }
    // break;
    // }
    // return super.onTouch(v, event);
    // }
    // 
    // private void saveTouchStart(MotionEvent event) {
    // touchStartPoint.x = event.getX();
    // touchStartPoint.y = event.getY();
    // }
    // });
    chart.setOnChartGestureListener(new OnChartGestureListener() {

        boolean hasTranslated = false;

        float highlightDrawX = -1;

        @Override
        public void onChartGestureStart(MotionEvent me, ChartGesture lastPerformedGesture) {
            hasTranslated = false;
            if (chart.getHighlighted() != null && chart.getHighlighted().length > 0) {
                highlightDrawX = chart.getHighlighted()[0].getDrawX();
            } else {
                highlightDrawX = -1;
            }
            MapActivity mapActivity = getMapActivity();
            if (lastPerformedGesture != ChartGesture.NONE && mapActivity != null && mapActivity.getMapViewTrackingUtilities().isMapLinkedToLocation()) {
                mapActivity.getMapViewTrackingUtilities().setMapLinkedToLocation(false);
            }
        }

        @Override
        public void onChartGestureEnd(MotionEvent me, ChartGesture lastPerformedGesture) {
            GpxDisplayItem gpxItem = getGpxItem();
            if (gpxItem != null) {
                if ((lastPerformedGesture == ChartGesture.DRAG && hasTranslated) || lastPerformedGesture == ChartGesture.X_ZOOM || lastPerformedGesture == ChartGesture.Y_ZOOM || lastPerformedGesture == ChartGesture.PINCH_ZOOM || lastPerformedGesture == ChartGesture.DOUBLE_TAP || lastPerformedGesture == ChartGesture.ROTATE) {
                    gpxItem.chartMatrix = new Matrix(chart.getViewPortHandler().getMatrixTouch());
                    refreshChart(chart, false);
                }
            }
        }

        @Override
        public void onChartLongPressed(MotionEvent me) {
        }

        @Override
        public void onChartDoubleTapped(MotionEvent me) {
        }

        @Override
        public void onChartSingleTapped(MotionEvent me) {
        }

        @Override
        public void onChartFling(MotionEvent me1, MotionEvent me2, float velocityX, float velocityY) {
        }

        @Override
        public void onChartScale(MotionEvent me, float scaleX, float scaleY) {
        }

        @Override
        public void onChartTranslate(MotionEvent me, float dX, float dY) {
            hasTranslated = true;
            if (highlightDrawX != -1) {
                Highlight h = chart.getHighlightByTouchPoint(highlightDrawX, 0f);
                if (h != null) {
                    chart.highlightValue(h);
                    refreshChart(chart, false);
                }
            }
        }
    });
    boolean useHours = analysis.timeSpan != 0 && analysis.timeSpan / HOUR_IN_MILLIS > 0;
    GpxMarkerView markerView = new GpxMarkerView(mapActivity, analysis.startTime, useHours);
    GpxUiHelper.setupGPXChart(chart, markerView, 24, 16, true);
    List<ILineDataSet> dataSets = new ArrayList<>();
    if (gpxItem.chartTypes != null && gpxItem.chartTypes.length > 0) {
        for (int i = 0; i < gpxItem.chartTypes.length; i++) {
            OrderedLineDataSet dataSet = null;
            boolean withoutGaps = selectedGpxFile != null && (!selectedGpxFile.isJoinSegments() && gpxItem.isGeneralTrack());
            switch(gpxItem.chartTypes[i]) {
                case ALTITUDE:
                    dataSet = GpxUiHelper.createGPXElevationDataSet(app, chart, analysis, gpxItem.chartAxisType, false, true, withoutGaps);
                    break;
                case SPEED:
                    dataSet = GpxUiHelper.createGPXSpeedDataSet(app, chart, analysis, gpxItem.chartAxisType, gpxItem.chartTypes.length > 1, true, withoutGaps);
                    break;
                case SLOPE:
                    dataSet = GpxUiHelper.createGPXSlopeDataSet(app, chart, analysis, gpxItem.chartAxisType, null, gpxItem.chartTypes.length > 1, true, withoutGaps);
                    break;
            }
            if (dataSet != null) {
                dataSets.add(dataSet);
            }
        }
    }
    Collections.sort(dataSets, new Comparator<ILineDataSet>() {

        @Override
        public int compare(ILineDataSet ds1, ILineDataSet ds2) {
            OrderedLineDataSet dataSet1 = (OrderedLineDataSet) ds1;
            OrderedLineDataSet dataSet2 = (OrderedLineDataSet) ds2;
            return dataSet1.getPriority() > dataSet2.getPriority() ? -1 : (dataSet1.getPriority() == dataSet2.getPriority() ? 0 : 1);
        }
    });
    chart.setData(new LineData(dataSets));
    updateChart(chart);
    View yAxis = parentView.findViewById(R.id.y_axis);
    ImageView yAxisIcon = (ImageView) parentView.findViewById(R.id.y_axis_icon);
    TextView yAxisTitle = (TextView) parentView.findViewById(R.id.y_axis_title);
    View yAxisArrow = parentView.findViewById(R.id.y_axis_arrow);
    final List<GPXDataSetType[]> availableTypes = new ArrayList<>();
    boolean hasSlopeChart = false;
    if (analysis.hasElevationData) {
        availableTypes.add(new GPXDataSetType[] { GPXDataSetType.ALTITUDE });
        if (gpxItem.chartAxisType != GPXDataSetAxisType.TIME && gpxItem.chartAxisType != GPXDataSetAxisType.TIMEOFDAY) {
            availableTypes.add(new GPXDataSetType[] { GPXDataSetType.SLOPE });
        }
    }
    if (analysis.hasSpeedData) {
        availableTypes.add(new GPXDataSetType[] { GPXDataSetType.SPEED });
    }
    if (analysis.hasElevationData && gpxItem.chartAxisType != GPXDataSetAxisType.TIME && gpxItem.chartAxisType != GPXDataSetAxisType.TIMEOFDAY) {
        availableTypes.add(new GPXDataSetType[] { GPXDataSetType.ALTITUDE, GPXDataSetType.SLOPE });
    }
    if (analysis.hasElevationData && analysis.hasSpeedData) {
        availableTypes.add(new GPXDataSetType[] { GPXDataSetType.ALTITUDE, GPXDataSetType.SPEED });
    }
    for (GPXDataSetType t : gpxItem.chartTypes) {
        if (t == GPXDataSetType.SLOPE) {
            hasSlopeChart = true;
            break;
        }
    }
    yAxisIcon.setImageDrawable(GPXDataSetType.getImageDrawable(app, gpxItem.chartTypes));
    yAxisTitle.setText(GPXDataSetType.getName(app, gpxItem.chartTypes));
    if (availableTypes.size() > 0) {
        yAxis.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                List<PopUpMenuItem> items = new ArrayList<>();
                for (GPXDataSetType[] types : availableTypes) {
                    String title = GPXDataSetType.getName(app, types);
                    Drawable icon = GPXDataSetType.getImageDrawable(app, types);
                    items.add(new PopUpMenuItem.Builder(app).setTitle(title).setIcon(icon).create());
                }
                AdapterView.OnItemClickListener listener = new AdapterView.OnItemClickListener() {

                    @Override
                    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                        fitTrackOnMapForbidden = true;
                        GpxDisplayItem gpxItem = getGpxItem();
                        gpxItem.chartTypes = availableTypes.get(position);
                        update();
                        fitTrackOnMapForbidden = false;
                    }
                };
                new PopUpMenuHelper.Builder(v, items, nightMode).setListener(listener).show();
            }
        });
        yAxisArrow.setVisibility(View.VISIBLE);
    } else {
        yAxis.setOnClickListener(null);
        yAxis.setBackgroundResource(0);
        yAxisArrow.setVisibility(View.GONE);
    }
    View xAxis = parentView.findViewById(R.id.x_axis);
    ImageView xAxisIcon = (ImageView) parentView.findViewById(R.id.x_axis_icon);
    TextView xAxisTitle = (TextView) parentView.findViewById(R.id.x_axis_title);
    View xAxisArrow = parentView.findViewById(R.id.x_axis_arrow);
    if (gpxItem.chartAxisType == GPXDataSetAxisType.TIME) {
        xAxisIcon.setImageDrawable(ic.getThemedIcon(R.drawable.ic_action_time));
        xAxisTitle.setText(app.getString(R.string.shared_string_time));
    } else if (gpxItem.chartAxisType == GPXDataSetAxisType.TIMEOFDAY) {
        xAxisIcon.setImageDrawable(ic.getThemedIcon(R.drawable.ic_action_time_span));
        xAxisTitle.setText(app.getString(R.string.time_of_day));
    } else {
        xAxisIcon.setImageDrawable(ic.getThemedIcon(R.drawable.ic_action_marker_dark));
        xAxisTitle.setText(app.getString(R.string.distance));
    }
    if (analysis.isTimeSpecified() && !hasSlopeChart) {
        xAxis.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                List<PopUpMenuItem> items = new ArrayList<>();
                for (GPXDataSetAxisType type : GPXDataSetAxisType.values()) {
                    items.add(new PopUpMenuItem.Builder(app).setTitleId(type.getStringId()).setIcon(type.getImageDrawable(app)).create());
                }
                new PopUpMenuHelper.Builder(v, items, nightMode).setListener(new AdapterView.OnItemClickListener() {

                    @Override
                    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                        fitTrackOnMapForbidden = true;
                        GpxDisplayItem gpxItem = getGpxItem();
                        if (gpxItem != null) {
                            gpxItem.chartAxisType = GPXDataSetAxisType.values()[position];
                            gpxItem.chartHighlightPos = -1;
                            gpxItem.chartMatrix = null;
                            update();
                        }
                        fitTrackOnMapForbidden = false;
                    }
                }).show();
            }
        });
        xAxisArrow.setVisibility(View.VISIBLE);
    } else {
        xAxis.setOnClickListener(null);
        xAxis.setBackgroundResource(0);
        xAxisArrow.setVisibility(View.GONE);
    }
    refreshChart(chart, forceFitTrackOnMap);
}
Also used : OnChartValueSelectedListener(com.github.mikephil.charting.listener.OnChartValueSelectedListener) Highlight(com.github.mikephil.charting.highlight.Highlight) OsmandApplication(net.osmand.plus.OsmandApplication) GpxDisplayItem(net.osmand.plus.track.helpers.GpxSelectionHelper.GpxDisplayItem) ArrayList(java.util.ArrayList) ChartGesture(com.github.mikephil.charting.listener.ChartTouchListener.ChartGesture) Entry(com.github.mikephil.charting.data.Entry) Matrix(android.graphics.Matrix) ILineDataSet(com.github.mikephil.charting.interfaces.datasets.ILineDataSet) GPXDataSetType(net.osmand.plus.helpers.GpxUiHelper.GPXDataSetType) TextView(android.widget.TextView) List(java.util.List) ArrayList(java.util.ArrayList) ImageView(android.widget.ImageView) MapActivity(net.osmand.plus.activities.MapActivity) OnChartGestureListener(com.github.mikephil.charting.listener.OnChartGestureListener) GPXTrackAnalysis(net.osmand.GPXUtilities.GPXTrackAnalysis) Drawable(android.graphics.drawable.Drawable) PopUpMenuItem(net.osmand.plus.widgets.popup.PopUpMenuItem) ImageView(android.widget.ImageView) View(android.view.View) AdapterView(android.widget.AdapterView) TextView(android.widget.TextView) TopToolbarView(net.osmand.plus.views.mapwidgets.MapInfoWidgetsFactory.TopToolbarView) GpxMarkerView(net.osmand.plus.track.GpxMarkerView) MotionEvent(android.view.MotionEvent) UiUtilities(net.osmand.plus.utils.UiUtilities) PopUpMenuHelper(net.osmand.plus.widgets.popup.PopUpMenuHelper) LineData(com.github.mikephil.charting.data.LineData) GPXDataSetAxisType(net.osmand.plus.helpers.GpxUiHelper.GPXDataSetAxisType) OrderedLineDataSet(net.osmand.plus.helpers.GpxUiHelper.OrderedLineDataSet) AdapterView(android.widget.AdapterView) LineChart(com.github.mikephil.charting.charts.LineChart) GpxMarkerView(net.osmand.plus.track.GpxMarkerView)

Aggregations

GpxMarkerView (net.osmand.plus.track.GpxMarkerView)2 Matrix (android.graphics.Matrix)1 Drawable (android.graphics.drawable.Drawable)1 MotionEvent (android.view.MotionEvent)1 View (android.view.View)1 AdapterView (android.widget.AdapterView)1 ImageView (android.widget.ImageView)1 TextView (android.widget.TextView)1 LineChart (com.github.mikephil.charting.charts.LineChart)1 Entry (com.github.mikephil.charting.data.Entry)1 LineData (com.github.mikephil.charting.data.LineData)1 Highlight (com.github.mikephil.charting.highlight.Highlight)1 ILineDataSet (com.github.mikephil.charting.interfaces.datasets.ILineDataSet)1 ChartGesture (com.github.mikephil.charting.listener.ChartTouchListener.ChartGesture)1 OnChartGestureListener (com.github.mikephil.charting.listener.OnChartGestureListener)1 OnChartValueSelectedListener (com.github.mikephil.charting.listener.OnChartValueSelectedListener)1 ArrayList (java.util.ArrayList)1 List (java.util.List)1 GPXTrackAnalysis (net.osmand.GPXUtilities.GPXTrackAnalysis)1 OsmandApplication (net.osmand.plus.OsmandApplication)1