Android- onPolylineClick 不起作用?
Android- onPolylineClick don't work?
我在地图上添加折线并启用 setClickable(true)
但是当我使用 from Clickable
时不起作用?
private class ParserTask extends AsyncTask<String, Integer, List<List<HashMap<String,String>>>> {
@Override
protected List<List<HashMap<String, String>>> doInBackground(String... jsonData) {
JSONObject jObject;
List<List<HashMap<String, String>>> routes = null;
try{
jObject = new JSONObject(jsonData[0]);
parser = new DirectionsJSONParser();
// Starts parsing data
routes = parser.parse(jObject);
}catch(Exception e){
e.printStackTrace();
}
return routes;
}
@Override
protected void onPostExecute(List<List<HashMap<String, String>>> result) {
ArrayList<LatLng> points = null;
PolylineOptions lineOptions = null;
MarkerOptions markerOptions = new MarkerOptions();
// Traversing through all the routes
for(int i=0;i<result.size();i++){
points = new ArrayList<LatLng>();
lineOptions = new PolylineOptions();
String color = colors[i % colors.length];
// Fetching i-th route
List<HashMap<String, String>> path = result.get(i);
// Fetching all the points in i-th route
for(int j=0;j<path.size();j++){
HashMap<String,String> point = path.get(j);
double lat = Double.parseDouble(point.get("lat"));
double lng = Double.parseDouble(point.get("lng"));
LatLng position = new LatLng(lat, lng);
points.add(position);
}
// Adding all the points in the route to LineOptions
lineOptions.addAll(points);
lineOptions.width(15);
lineOptions.clickable(true);
lineOptions.color(Color.parseColor(color));
// Drawing polyline in the Google Map for the i-th route
Polyline polyline = mMap.addPolyline(lineOptions);
polyline.setClickable(true);
}
}
}
然后我implements GoogleMap.OnPolylineClickListener
:
@Override
public void onPolylineClick(Polyline polyline) {
Log.i("LOG","OK");
}
我看不到任何 log
.
我看到了这个示例并解决了我的问题:
public class PolylineDemoActivity extends AppCompatActivity
implements OnSeekBarChangeListener, OnMapReadyCallback {
private static final LatLng MELBOURNE = new LatLng(-37.81319, 144.96298);
private static final LatLng SYDNEY = new LatLng(-33.87365, 151.20689);
private static final LatLng ADELAIDE = new LatLng(-34.92873, 138.59995);
private static final LatLng PERTH = new LatLng(-31.95285, 115.85734);
private static final LatLng LHR = new LatLng(51.471547, -0.460052);
private static final LatLng LAX = new LatLng(33.936524, -118.377686);
private static final LatLng JFK = new LatLng(40.641051, -73.777485);
private static final LatLng AKL = new LatLng(-37.006254, 174.783018);
private static final int WIDTH_MAX = 50;
private static final int HUE_MAX = 360;
private static final int ALPHA_MAX = 255;
private Polyline mMutablePolyline;
private Polyline mClickablePolyline;
private SeekBar mColorBar;
private SeekBar mAlphaBar;
private SeekBar mWidthBar;
private CheckBox mClickabilityCheckbox;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.polyline_demo);
mColorBar = (SeekBar) findViewById(R.id.hueSeekBar);
mColorBar.setMax(HUE_MAX);
mColorBar.setProgress(0);
mAlphaBar = (SeekBar) findViewById(R.id.alphaSeekBar);
mAlphaBar.setMax(ALPHA_MAX);
mAlphaBar.setProgress(255);
mWidthBar = (SeekBar) findViewById(R.id.widthSeekBar);
mWidthBar.setMax(WIDTH_MAX);
mWidthBar.setProgress(10);
mClickabilityCheckbox = (CheckBox) findViewById(R.id.toggleClickability);
SupportMapFragment mapFragment =
(SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
}
@Override
public void onMapReady(GoogleMap map) {
// Override the default content description on the view, for accessibility mode.
// Ideally this string would be localised.
map.setContentDescription("Google Map with polylines.");
// A simple polyline with the default options from Melbourne-Adelaide-Perth.
map.addPolyline((new PolylineOptions())
.add(MELBOURNE, ADELAIDE, PERTH));
// A geodesic polyline that goes around the world.
mClickablePolyline = map.addPolyline((new PolylineOptions())
.add(LHR, AKL, LAX, JFK, LHR)
.width(5)
.color(Color.BLUE)
.geodesic(true)
.clickable(mClickabilityCheckbox.isChecked()));
// Rectangle centered at Sydney. This polyline will be mutable.
int radius = 5;
PolylineOptions options = new PolylineOptions()
.add(new LatLng(SYDNEY.latitude + radius, SYDNEY.longitude + radius))
.add(new LatLng(SYDNEY.latitude + radius, SYDNEY.longitude - radius))
.add(new LatLng(SYDNEY.latitude - radius, SYDNEY.longitude - radius))
.add(new LatLng(SYDNEY.latitude - radius, SYDNEY.longitude + radius))
.add(new LatLng(SYDNEY.latitude + radius, SYDNEY.longitude + radius));
int color = Color.HSVToColor(
mAlphaBar.getProgress(), new float[]{mColorBar.getProgress(), 1, 1});
mMutablePolyline = map.addPolyline(options
.color(color)
.width(mWidthBar.getProgress())
.clickable(mClickabilityCheckbox.isChecked()));
mColorBar.setOnSeekBarChangeListener(this);
mAlphaBar.setOnSeekBarChangeListener(this);
mWidthBar.setOnSeekBarChangeListener(this);
// Move the map so that it is centered on the mutable polyline.
map.moveCamera(CameraUpdateFactory.newLatLng(SYDNEY));
// Add a listener for polyline clicks that changes the clicked polyline's color.
map.setOnPolylineClickListener(new GoogleMap.OnPolylineClickListener() {
@Override
public void onPolylineClick(Polyline polyline) {
// Flip the values of the r, g and b components of the polyline's color.
int strokeColor = polyline.getColor() ^ 0x00ffffff;
polyline.setColor(strokeColor);
}
});
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
// Don't do anything here.
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// Don't do anything here.
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if (mMutablePolyline == null) {
return;
}
if (seekBar == mColorBar) {
mMutablePolyline.setColor(Color.HSVToColor(
Color.alpha(mMutablePolyline.getColor()), new float[]{progress, 1, 1}));
} else if (seekBar == mAlphaBar) {
float[] prevHSV = new float[3];
Color.colorToHSV(mMutablePolyline.getColor(), prevHSV);
mMutablePolyline.setColor(Color.HSVToColor(progress, prevHSV));
} else if (seekBar == mWidthBar) {
mMutablePolyline.setWidth(progress);
}
}
/**
* Toggles the clickability of two polylines based on the state of the View that triggered this
* call.
* This callback is defined on the CheckBox in the layout for this Activity.
*/
public void toggleClickability(View view) {
if (mClickablePolyline != null) {
mClickablePolyline.setClickable(((CheckBox) view).isChecked());
}
if (mMutablePolyline != null) {
mMutablePolyline.setClickable(((CheckBox) view).isChecked());
}
}
}
我在地图上添加折线并启用 setClickable(true)
但是当我使用 from Clickable
时不起作用?
private class ParserTask extends AsyncTask<String, Integer, List<List<HashMap<String,String>>>> {
@Override
protected List<List<HashMap<String, String>>> doInBackground(String... jsonData) {
JSONObject jObject;
List<List<HashMap<String, String>>> routes = null;
try{
jObject = new JSONObject(jsonData[0]);
parser = new DirectionsJSONParser();
// Starts parsing data
routes = parser.parse(jObject);
}catch(Exception e){
e.printStackTrace();
}
return routes;
}
@Override
protected void onPostExecute(List<List<HashMap<String, String>>> result) {
ArrayList<LatLng> points = null;
PolylineOptions lineOptions = null;
MarkerOptions markerOptions = new MarkerOptions();
// Traversing through all the routes
for(int i=0;i<result.size();i++){
points = new ArrayList<LatLng>();
lineOptions = new PolylineOptions();
String color = colors[i % colors.length];
// Fetching i-th route
List<HashMap<String, String>> path = result.get(i);
// Fetching all the points in i-th route
for(int j=0;j<path.size();j++){
HashMap<String,String> point = path.get(j);
double lat = Double.parseDouble(point.get("lat"));
double lng = Double.parseDouble(point.get("lng"));
LatLng position = new LatLng(lat, lng);
points.add(position);
}
// Adding all the points in the route to LineOptions
lineOptions.addAll(points);
lineOptions.width(15);
lineOptions.clickable(true);
lineOptions.color(Color.parseColor(color));
// Drawing polyline in the Google Map for the i-th route
Polyline polyline = mMap.addPolyline(lineOptions);
polyline.setClickable(true);
}
}
}
然后我implements GoogleMap.OnPolylineClickListener
:
@Override
public void onPolylineClick(Polyline polyline) {
Log.i("LOG","OK");
}
我看不到任何 log
.
我看到了这个示例并解决了我的问题:
public class PolylineDemoActivity extends AppCompatActivity
implements OnSeekBarChangeListener, OnMapReadyCallback {
private static final LatLng MELBOURNE = new LatLng(-37.81319, 144.96298);
private static final LatLng SYDNEY = new LatLng(-33.87365, 151.20689);
private static final LatLng ADELAIDE = new LatLng(-34.92873, 138.59995);
private static final LatLng PERTH = new LatLng(-31.95285, 115.85734);
private static final LatLng LHR = new LatLng(51.471547, -0.460052);
private static final LatLng LAX = new LatLng(33.936524, -118.377686);
private static final LatLng JFK = new LatLng(40.641051, -73.777485);
private static final LatLng AKL = new LatLng(-37.006254, 174.783018);
private static final int WIDTH_MAX = 50;
private static final int HUE_MAX = 360;
private static final int ALPHA_MAX = 255;
private Polyline mMutablePolyline;
private Polyline mClickablePolyline;
private SeekBar mColorBar;
private SeekBar mAlphaBar;
private SeekBar mWidthBar;
private CheckBox mClickabilityCheckbox;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.polyline_demo);
mColorBar = (SeekBar) findViewById(R.id.hueSeekBar);
mColorBar.setMax(HUE_MAX);
mColorBar.setProgress(0);
mAlphaBar = (SeekBar) findViewById(R.id.alphaSeekBar);
mAlphaBar.setMax(ALPHA_MAX);
mAlphaBar.setProgress(255);
mWidthBar = (SeekBar) findViewById(R.id.widthSeekBar);
mWidthBar.setMax(WIDTH_MAX);
mWidthBar.setProgress(10);
mClickabilityCheckbox = (CheckBox) findViewById(R.id.toggleClickability);
SupportMapFragment mapFragment =
(SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
}
@Override
public void onMapReady(GoogleMap map) {
// Override the default content description on the view, for accessibility mode.
// Ideally this string would be localised.
map.setContentDescription("Google Map with polylines.");
// A simple polyline with the default options from Melbourne-Adelaide-Perth.
map.addPolyline((new PolylineOptions())
.add(MELBOURNE, ADELAIDE, PERTH));
// A geodesic polyline that goes around the world.
mClickablePolyline = map.addPolyline((new PolylineOptions())
.add(LHR, AKL, LAX, JFK, LHR)
.width(5)
.color(Color.BLUE)
.geodesic(true)
.clickable(mClickabilityCheckbox.isChecked()));
// Rectangle centered at Sydney. This polyline will be mutable.
int radius = 5;
PolylineOptions options = new PolylineOptions()
.add(new LatLng(SYDNEY.latitude + radius, SYDNEY.longitude + radius))
.add(new LatLng(SYDNEY.latitude + radius, SYDNEY.longitude - radius))
.add(new LatLng(SYDNEY.latitude - radius, SYDNEY.longitude - radius))
.add(new LatLng(SYDNEY.latitude - radius, SYDNEY.longitude + radius))
.add(new LatLng(SYDNEY.latitude + radius, SYDNEY.longitude + radius));
int color = Color.HSVToColor(
mAlphaBar.getProgress(), new float[]{mColorBar.getProgress(), 1, 1});
mMutablePolyline = map.addPolyline(options
.color(color)
.width(mWidthBar.getProgress())
.clickable(mClickabilityCheckbox.isChecked()));
mColorBar.setOnSeekBarChangeListener(this);
mAlphaBar.setOnSeekBarChangeListener(this);
mWidthBar.setOnSeekBarChangeListener(this);
// Move the map so that it is centered on the mutable polyline.
map.moveCamera(CameraUpdateFactory.newLatLng(SYDNEY));
// Add a listener for polyline clicks that changes the clicked polyline's color.
map.setOnPolylineClickListener(new GoogleMap.OnPolylineClickListener() {
@Override
public void onPolylineClick(Polyline polyline) {
// Flip the values of the r, g and b components of the polyline's color.
int strokeColor = polyline.getColor() ^ 0x00ffffff;
polyline.setColor(strokeColor);
}
});
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
// Don't do anything here.
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// Don't do anything here.
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if (mMutablePolyline == null) {
return;
}
if (seekBar == mColorBar) {
mMutablePolyline.setColor(Color.HSVToColor(
Color.alpha(mMutablePolyline.getColor()), new float[]{progress, 1, 1}));
} else if (seekBar == mAlphaBar) {
float[] prevHSV = new float[3];
Color.colorToHSV(mMutablePolyline.getColor(), prevHSV);
mMutablePolyline.setColor(Color.HSVToColor(progress, prevHSV));
} else if (seekBar == mWidthBar) {
mMutablePolyline.setWidth(progress);
}
}
/**
* Toggles the clickability of two polylines based on the state of the View that triggered this
* call.
* This callback is defined on the CheckBox in the layout for this Activity.
*/
public void toggleClickability(View view) {
if (mClickablePolyline != null) {
mClickablePolyline.setClickable(((CheckBox) view).isChecked());
}
if (mMutablePolyline != null) {
mMutablePolyline.setClickable(((CheckBox) view).isChecked());
}
}
}