package org.droidplanner.android.fragments.helpers; import java.util.ArrayList; import java.util.List; import org.droidplanner.android.R; import org.droidplanner.android.fragments.EditorMapFragment; import android.gesture.GestureOverlayView; import android.gesture.GestureOverlayView.OnGestureListener; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import com.o3dr.services.android.lib.coordinate.LatLong; import com.o3dr.services.android.lib.util.MathUtils; public class GestureMapFragment extends Fragment implements OnGestureListener { private static final int TOLERANCE = 15; private static final int STROKE_WIDTH = 3; private double toleranceInPixels; public interface OnPathFinishedListener { void onPathFinished(List<LatLong> path); } private GestureOverlayView overlay; private OnPathFinishedListener listener; private EditorMapFragment mapFragment; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_gesture_map, container, false); } @Override public void onViewCreated(View view, Bundle savedInstanceState){ super.onViewCreated(view, savedInstanceState); final FragmentManager fm = getChildFragmentManager(); mapFragment = ((EditorMapFragment) fm.findFragmentById(R.id.gesture_map_fragment)); if(mapFragment == null){ mapFragment = new EditorMapFragment(); fm.beginTransaction().add(R.id.gesture_map_fragment, mapFragment).commit(); } overlay = (GestureOverlayView) view.findViewById(R.id.overlay1); overlay.addOnGestureListener(this); overlay.setEnabled(false); overlay.setGestureStrokeWidth(scaleDpToPixels(STROKE_WIDTH)); toleranceInPixels = scaleDpToPixels(TOLERANCE); } private int scaleDpToPixels(double value) { final float scale = getResources().getDisplayMetrics().density; return (int) Math.round(value * scale); } public EditorMapFragment getMapFragment(){ return mapFragment; } public void enableGestureDetection() { overlay.setEnabled(true); } public void disableGestureDetection() { overlay.setEnabled(false); } public void setOnPathFinishedListener(OnPathFinishedListener listener) { this.listener = listener; } @Override public void onGestureEnded(GestureOverlayView arg0, MotionEvent arg1) { overlay.setEnabled(false); List<LatLong> path = decodeGesture(); if (path.size() > 1) { path = MathUtils.simplify(path, toleranceInPixels); } listener.onPathFinished(path); } private List<LatLong> decodeGesture() { List<LatLong> path = new ArrayList<LatLong>(); extractPathFromGesture(path); return path; } private void extractPathFromGesture(List<LatLong> path) { float[] points = overlay.getGesture().getStrokes().get(0).points; for (int i = 0; i < points.length; i += 2) { path.add(new LatLong((int) points[i], (int) points[i + 1])); } } @Override public void onGesture(GestureOverlayView arg0, MotionEvent arg1) { } @Override public void onGestureCancelled(GestureOverlayView arg0, MotionEvent arg1) { } @Override public void onGestureStarted(GestureOverlayView arg0, MotionEvent arg1) { } }