Использую библиотеку осмдроид.
Я сделал так запускаю таймер таск и через хендлер отправляю сообщение
и присваиваиваю SS=1 потом через секунду SS=0
в методе onDraw в зависимости от значения SS
присваиваю setMarker(panic) или другое Drawable и перерисовываю invalidate()
как еще можно сделать? если это не правильно
так как ощущение что приложение грузит сильно смартфон.
Код: Выделить всё
package org.osmdroid;
import java.io.IOException;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.StringTokenizer;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.TimeUnit;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.osmdroid.api.IMapView;
import org.osmdroid.util.GeoPoint;
import org.osmdroid.views.MapView;
import org.osmdroid.views.MapView.Projection;
import org.osmdroid.views.overlay.IOverlayMenuProvider;
import org.osmdroid.views.overlay.ItemizedOverlay;
import org.osmdroid.views.overlay.Overlay;
import org.osmdroid.views.overlay.OverlayItem;
import org.osmdroid.views.overlay.OverlayItem.HotspotPlace;
import org.osmdroid.views.safecanvas.ISafeCanvas;
import org.osmdroid.views.safecanvas.SafePaint;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.drawable.Drawable;
import android.location.Location;
import android.os.Handler;
import android.util.Log;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
public class PostOverlay extends ItemizedOverlay<SampleOverlayItem> implements
ItemizedOverlay.OnFocusChangeListener ,
IOverlayMenuProvider {
Handler h = new Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case STATUS_NONE:
SS=1;
invalidate();
break;
case STATUS_CONNECTING:
SS=0;
invalidate();
break;
}
};
};
public Timer mTimer;
public MyTimerTask mMyTimerTask;
final int STATUS_NONE = 0; // нет подключения
final int STATUS_CONNECTING = 1; // подключаемся
public static int SS=1;
private Location mLocation;
private String Device;
private String GPSPoint_lat;
private String S;
XmlPullParser xpp; protected final Bitmap mPersonBitmap;
private boolean postenable = false;
private boolean mFocusChanged = false;
private View mPopupView = null;
final String LOG_TAG = "PostOverlay";
public static final int POST_OVERLAY = getSafeMenuId();
private static final String Device1 = null;
private static final String GPSPoint_lat1 = null;
PostDataHelper P;
MapView mapView;
ArrayList <SampleOverlayItem>items = new ArrayList<SampleOverlayItem>();
private int size=0;
private boolean mOptionsMenuEnabled = true;
Paint paint;
private GeoPoint gPt1=new GeoPoint(54.7820, 58.9660);
private Point mTouchScreenPoint =new Point();Drawable panic;Drawable markers;
//Projection pj = mapView.getProjection();
public PostOverlay(Drawable panic ,Drawable pDefaultMarker, Context pContext,MapView mapView) {
super(pDefaultMarker, new DefaultResourceProxyImpl(pContext));
Rect screenRect = mapView.getProjection().getScreenRect();
mTimer = new Timer();
mMyTimerTask = new MyTimerTask();
mTimer.schedule(mMyTimerTask, 20,2000);
this.mapView=mapView;this.panic= panic;
this.markers=pDefaultMarker;
this.mPersonBitmap = this.mResourceProxy.getBitmap(ResourceProxy.bitmap.person);
// Drawable icon = this.getResources().getDrawable(R.drawable.marker_default);
Log.d(LOG_TAG, "конструктор " +panic);
paint = new Paint(Paint.ANTI_ALIAS_FLAG);
setOnFocusChangeListener(this);
}
@Override
protected SampleOverlayItem createItem(int i) {
Log.d(LOG_TAG, "createItem " + i);
final SampleOverlayItem OverlayItem = items.get(i);
return OverlayItem;
}
protected void onDrawItem(Canvas canvas, SampleOverlayItem item, Point curScreenCoords)
{
Log.d(LOG_TAG, "onDrawItem 22 ");
///здесь условие на смену рисунка
String s=item.mDescription.trim();
item.setMarker(markers);
if( s.equals("63553")){
Log.d(LOG_TAG, "onDrawItem 63553 ");
if (SS==1){
item.setMarker(panic);}
else { item.setMarker( markers);
}}
super.onDrawItem(canvas, item, curScreenCoords);
}
}
@Override
protected void drawSafe(ISafeCanvas canvas, MapView mapView, boolean shadow) {
super.drawSafe(canvas, mapView, shadow);
if (shadow) {
return;
}
int size = this.items.size() - 1;
for (int i = size; i >= 0; i--)
{
Log.d(LOG_TAG, "onDrawItem i"+i);
SampleOverlayItem item = items.get(i);
pj.toMapPixels(item.mGeoPoint, this.mTouchScreenPoint);
onDrawItem(canvas.getSafeCanvas(), item, this.mTouchScreenPoint);
}
* super.drawSafe(canvas, mapView, shadow);
}
}
protected View getPopupView(Context context, SampleOverlayItem item) {
Log.d(LOG_TAG, "getPopupView ");
TextView tv = new TextView(context);
tv.setText(item.getTitle());
tv.setBackgroundColor(Color.WHITE);
return tv;
}
// @Override
// protected void onDrawItem(ISafeCanvas Canvas, SampleOverlayItem item, Point curScreenCoords) {
// Log.d(LOG_TAG, "onDrawItem ");
// Canvas canvas = null;
// super.onDrawItem(canvas, item, curScreenCoords);
// }
/* @Override
protected void onDrawItem(Canvas canvas, SampleOverlayItem item,
Point curScreenCoords) {
Log.d(LOG_TAG, "onDrawItem 2222222");
Drawable marker = getDefaultMarker(2) ;
// Overlay.drawAt(canvas, marker, curScreenCoords.x, curScreenCoords.y, false);
marker.draw(canvas);
// canvas.drawCircle(100, 200, 50, p);
Log.d(LOG_TAG, "point 22 " );
// TODO Auto-generated method stub
//super.onDrawItem(canvas, item, curScreenCoords);
}*/
@Override
public int size() {
// size=size++;
return items.size();
}
public boolean enable() {
postenable= true;
return false;
}
public boolean disable() {
postenable=false;
return false;
}
public boolean isMyLocationEnabled() {
return postenable;
}
@Override
public boolean onPrepareOptionsMenu(final Menu pMenu, final int pMenuIdOffset,
final MapView pMapView) {
pMenu.findItem(POST_OVERLAY + pMenuIdOffset).setChecked(this.isMyLocationEnabled());
// TODO Auto-generated method stub
Log.d(LOG_TAG, "onPrepareOptionsMenu ");
return true;
}
class MyTimerTask extends TimerTask{
private boolean running = true;
public void setRunning(boolean running) {
this.running = running;
}
@Override
public boolean cancel() {
// TODO Auto-generated method stub
return super.cancel();
}
@Override
public void run() {
Log.d(LOG_TAG, " TAsK " );
try{ h.sendEmptyMessage(STATUS_CONNECTING);
TimeUnit.SECONDS.sleep(1);
// установлено
h.sendEmptyMessage(STATUS_NONE);
// выполняется какая-то работа
TimeUnit.SECONDS.sleep(0);
// TODO Auto-generated method stub
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}