Я должен признать, что я наказал здесь, это взлом, но он прекрасно работает.Я начал с необходимости знать, когда происходит масштабирование, и как только я подключился к нему (и после некоторой интересной отладки), я обнаружил, что некоторые значения были «между значениями масштабирования», поэтому мне нужно было подождать, пока масштабирование не будет выполнено.
Как предлагается в другом месте при переполнении стека, мой слушатель масштабирования является переопределенным MapView.dispatchDraw, который проверяет, изменился ли уровень масштабирования с прошлого раза.
Помимо этого, я добавил метод isResizing, который проверяет,отметка времени превышает 100 мс, поскольку значение getLongitudeSpan перестало изменяться.Работает отлично.Вот код:
Мой самый первый пост переполнения стека!Ууууууу!
открытый класс MapViewWithZoomListener расширяет MapView {
private int oldZoomLevel = -1;
private List<OnClickListener> listeners = new ArrayList<OnClickListener>();
private long resizingLongitudeSpan = getLongitudeSpan();
private long resizingTime = new Date().getTime();
public MapViewWithZoomListener(Context context, String s) {
super(context, s);
}
public MapViewWithZoomListener(Context context, AttributeSet attributeSet) {
super(context, attributeSet);
}
public MapViewWithZoomListener(Context context, AttributeSet attributeSet, int i) {
super(context, attributeSet, i);
}
public boolean isResizing() {
// done resizing if 100ms has elapsed without a change in getLongitudeSpan
return (new Date().getTime() - resizingTime < 100);
}
public void dispatchDraw(Canvas canvas) {
super.dispatchDraw(canvas);
if (getZoomLevel() != oldZoomLevel) {
new AsyncTask() {
@Override
protected Object doInBackground(Object... objects) {
try {
if (getLongitudeSpan() != resizingLongitudeSpan) {
resizingLongitudeSpan = getLongitudeSpan();
resizingTime = new Date().getTime();
}
Thread.sleep(125); //slightly larger than isMoving threshold
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Object o) {
super.onPostExecute(o);
if (!isResizing() && oldZoomLevel != getZoomLevel()) {
oldZoomLevel = getZoomLevel();
invalidate();
for (OnClickListener listener : listeners) {
listener.onClick(null);
}
}
}
}.execute();
}
}
public void addZoomListener(OnClickListener listener) {
listeners.add(listener);
}