Ответ 1
Вы должны инициализировать все растровые изображения в конструкторе. Растровое изображение декодирования занимает много времени. Вы можете использовать HashMap
(ключ, значение) для их хранения. Затем в onDraw получите согласованное растровое изображение и нарисуйте его напрямую.
Например
public class MyView extends View{
private HashMap<String, Bitmap> mStore = new HashMap<String, Bitmap>();
public MyView(Context context) {
super(context);
// TODO Auto-generated constructor stub
init();
}
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
int caller = getIntent().getIntExtra("button", 0);
Bitmap bmp = null;
switch (caller) {
case R.id.btMap:
bmp = mStore.get(R.id.btMap);
canvas.drawBitmap(bmp, screenPts.x, screenPts.y - 50, null);
bmp.recycle();
bmp = null;
break;
case R.id.imageButton1:
bmp = mStore.get(R.id.imageButton1);
canvas.drawBitmap(bmp, screenPts.x, screenPts.y - 50, null);
bmp1.recycle();
bmp1 = null;
break;
}
super.onDraw(canvas);
}
public void init() {
Bitmap bmp = BitmapFactory.decodeResource(getResources(),
R.drawable.pin_annotation_darkblue);
mStore.put(R.id.btMap, bmp);
bmp = BitmapFactory.decodeResource(getResources(),
R.drawable.pin_annotation_green);
mStore.put(R.id.imageButton1, bmp);
}
}
Вот что я сделал на основе вашего кода. Вы должны проверить некоторые дублированные идентификаторы ресурсов.
private ArrayList<OverlayItem> overlayItemList = new ArrayList<OverlayItem>();
private HashMap<String, Bitmap> mStore = new HashMap<String, Bitmap>();
public MyItemizedOverlay(Drawable pDefaultMarker,
ResourceProxy pResourceProxy) {
super(pDefaultMarker, pResourceProxy);
Bitmap bmp = BitmapFactory.decodeResource(getResources(),
R.drawable.pin_annotation_darkblue);
mStore.put(R.id.btMap, bmp);
bmp = BitmapFactory.decodeResource(getResources(),
R.drawable.pin_annotation_green);
mStore.put(R.id.imageButton1, bmp);
bmp = BitmapFactory.decodeResource(getResources(),
R.drawable.pin_annotation_bue);
mStore.put(R.id.imageButton2, bmp);
bmp = BitmapFactory.decodeResource(getResources(),
R.drawable.pin_annotation_light);
mStore.put(R.id.imageButton3, bmp);
bmp = BitmapFactory.decodeResource(getResources(),
R.drawable.pin_annotation_light); // check it
mStore.put(R.id.imageButton4, bmp);
bmp = BitmapFactory.decodeResource(getResources(),
R.drawable.pin_annotation_light); // check it
mStore.put(R.id.imageButton5, bmp);
bmp = BitmapFactory.decodeResource(getResources(),
R.drawable.pin_annotation_light); // check it
mStore.put(R.id.imageButton6, bmp);
}
@Override
public void draw(Canvas canvas, MapView mapView, boolean arg2) {
super.draw(canvas, mapView, arg2);
// ---translate the GeoPoint to screen pixels---
Point screenPts = new Point();
mapView.getProjection().toPixels(p, screenPts);
// ---add the marker---
if (count == 1) {
int caller = getIntent().getIntExtra("button", 0);
Bitmap bmp = null;
switch (caller) {
case R.id.btMap:
bmp = mStore.get(R.id.btMap);
canvas.drawBitmap(bmp, screenPts.x, screenPts.y - 50, null);
bmp.recycle();
break;
case R.id.imageButton1:
bmp = mStore.get(R.id.imageButton1);
canvas.drawBitmap(bmp1, screenPts.x, screenPts.y - 50, null);
bmp.recycle();
break;
case R.id.imageButton2:
bmp = mStore.get(R.id.imageButton2);
canvas.drawBitmap(bmp, screenPts.x, screenPts.y - 50, null);
bmp.recycle();
break;
case R.id.imageButton3:
bmp = mStore.get(R.id.imageButton3);
canvas.drawBitmap(bmp, screenPts.x, screenPts.y - 50, null);
bmp.recycle();
break;
case R.id.imageButton4:
bmp = mStore.get(R.id.imageButton4);
canvas.drawBitmap(bmp, screenPts.x, screenPts.y - 50, null);
bmp.recycle();
break;
case R.id.imageButton5:
bmp = mStore.get(R.id.imageButton5);
canvas.drawBitmap(bmp, screenPts.x, screenPts.y - 50, null);
bmp.recycle();
break;
case R.id.imageButton6:
bmp = mStore.get(R.id.imageButton6);
canvas.drawBitmap(bmp, screenPts.x, screenPts.y - 50, null);
bmp.recycle();
break;
}
}
// Bitmap bmp = BitmapFactory.decodeResource(getResources(),
// R.drawable.pin_annotation_green);
// if (count == 1) {
// canvas.drawBitmap(bmp, screenPts.x, screenPts.y - 50, null);
// }
}