2017-11-03 8 views
1

Imagem com os bitmaps personalizados renderizadosマイアプリDUPブロブFDを

を割り当てることができませんでしたアプリケーションが過負荷にならないように、クラスタを介して図示されている地図上に約1,500マーカーを有します。これらのブックマークは現在BitmapDescriptorFactory.defaultMarker()として表示されています

ただし、各ドットのコードを変更してマーカーの値を含むカスタムビットマップを表示すると、LG K10 LTEといくつかのモトローラ。ほとんどのアプライアンスは正常に動作します。

私はこの機能を使用する場合、私はすべて1500個のマーカーをレンダリング終える前に、それが次のエラーでクラッシュ:

は「DUPブロブFDを割り当てることができませんでした。」

このエラーの調査では、これはメモリオーバーフローであり、これらのマーカーをLRUキャッシュに保存する必要があると思われますが、クラスタと組み合わせてこれを行うことはできません。

誰でもこれを持っていましたか、この問題を解決するためのアイデアや提案がありましたか?次

ビットマップレンダラのコードスニペットです:

私はものを除き、すべてのマーカーをクラスタを強制的にコードを変更します。また

public class OwnRendring extends DefaultClusterRenderer<MyItem> { 

    OwnRendring(Context context, GoogleMap map, ClusterManager<MyItem> clusterManager) { 
     super(context, map, clusterManager); 
    } 

    protected void onBeforeClusterItemRendered(MyItem item, MarkerOptions markerOptions) { 

     markerOptions.snippet(item.getSnippet()); 
     markerOptions.title(item.getTitle()); 
     markerOptions.anchor(0.33f, 1f); 
     markerOptions.infoWindowAnchor(0.33f,0f); 

     int cor = (item.getPublico() ? cfgCorPostoPublico : cfgCorPostoPrivado); 
     String preço = item.getTitle().substring(item.getTitle().length() - 5); 

     markerOptions.icon(BitmapDescriptorFactory.fromBitmap(createMarker(preço, cor))); 
     super.onBeforeClusterItemRendered(item, markerOptions); 

    } 

    protected boolean shouldRenderAsCluster(Cluster cluster) { 
     return cfgCluster && cluster.getSize() >= cfgClusterMin; 
    } 
} 

@Override 
public void onCameraIdle() {mClusterManager.cluster();} 

private Bitmap createMarker(String text, int color) { 
    View markerLayout = getLayoutInflater().inflate(R.layout.custom_marker, null); 

    ImageView markerImage = markerLayout.findViewById(R.id.marker_image); 
    TextView markerRating = markerLayout.findViewById(R.id.marker_text); 
    markerImage.setImageResource(R.drawable.pin_shadow); 
    markerImage.clearColorFilter(); 
    markerImage.getDrawable().mutate().setColorFilter(color, PorterDuff.Mode.MULTIPLY); 
    markerRating.setText(text); 

    markerLayout.measure(
      View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), 
      View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)); 
    markerLayout.layout(0, 0, markerLayout.getMeasuredWidth(), markerLayout.getMeasuredHeight()); 

    final Bitmap bitmap = Bitmap.createBitmap(
      markerLayout.getMeasuredWidth(), 
      markerLayout.getMeasuredHeight(), 
      Bitmap.Config.ARGB_8888); 
    Canvas canvas = new Canvas(bitmap); 
    markerLayout.draw(canvas); 
    return bitmap; 
} 

答えて

0

、私は次のようにレンダリングマーカーを減らすことによって、私の問題を解決しました画面に表示されます。

このため、地図の移動後にレンダリングしないで、レンダリングがズームインまたはズームアウト後にのみ行われたため、maps-utilsライブラリの元のコードをインポートして変更する必要がありました。

public class OwnRendring extends DefaultClusterRenderer<MyItem> { 

    OwnRendring(Context context, GoogleMap map, ClusterManager<MyItem> clusterManager) { 
     super(context, map, clusterManager); 
    } 

    protected void onBeforeClusterItemRendered(MyItem item, MarkerOptions markerOptions) { 
     ... original code ... 
    } 

    protected boolean shouldRenderAsCluster(Cluster cluster) { 
      boolean isInBounds = latLngBounds.contains(cluster.getPosition()); 
      return !isInBounds || (cfgCluster && cluster.getSize() >= cfgClusterMin); 
    } 
} 

@Override 
public void onCameraIdle() { 
    mClusterManager.cluster(); 
    latLngBounds = mMap.getProjection().getVisibleRegion().latLngBounds; 
} 

、ユーザーがマップを移動したとき、彼らは、レンダリングクラスタずに返すためのライブラリマップ-utilsの(クラスDefaultClusterRenderer)で、私は、これらの行を次のようにコメントし

 @SuppressLint("NewApi") 
     public void run() { 
//   if (clusters.equals(DefaultClusterRenderer.this.mClusters)) { 
//    mCallback.run(); 
//    return; 
//   } 

       ... original code ... 

     } 

これは明らかではありません私の質問に対する正解ですが、この問題を抱えている人にとっては、決定的な答えがない限り、有効な選択肢になる可能性があります。

***英語は母国語ではないため、文法的に私の答えを修正してください。

関連する問題