25

マップ内のコンパスの位置を変更できるかどうか誰かが知っていますか?

私が見つけることができるのは、それを有効または無効にする方法だけです。ただし、オーバーレイが邪魔にならないように、少し下に移動する必要があります。

ここに画像の説明を入力してください

4

10 に答える 10

20

GoogleMap.setPadding()メソッドを使用します。

https://developers.google.com/maps/documentation/android/map#map_padding

于 2013-10-03T08:35:20.297 に答える
12
@Override
public void onMapReady(GoogleMap map) {

    try {
        final ViewGroup parent = (ViewGroup) mMapView.findViewWithTag("GoogleMapMyLocationButton").getParent();
        parent.post(new Runnable() {
            @Override
            public void run() {
                try {
                    Resources r = getResources();
                    //convert our dp margin into pixels
                    int marginPixels = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20, r.getDisplayMetrics());
                    // Get the map compass view
                    View mapCompass = parent.getChildAt(4);

                    // create layoutParams, giving it our wanted width and height(important, by default the width is "match parent")
                    RelativeLayout.LayoutParams rlp = new RelativeLayout.LayoutParams(mapCompass.getHeight(),mapCompass.getHeight());
                    // position on top right
                    rlp.addRule(RelativeLayout.ALIGN_PARENT_LEFT, 0);
                    rlp.addRule(RelativeLayout.ALIGN_PARENT_TOP);
                    rlp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
                    rlp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, 0);
                    //give compass margin
                    rlp.setMargins(marginPixels, marginPixels, marginPixels, marginPixels);
                    mapCompass.setLayoutParams(rlp);
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
        });
    } catch (Exception ex) {
        ex.printStackTrace();
    }

}
于 2016-07-08T12:35:55.733 に答える
4

質問が出されるのは久しぶりですが、数日前にこの問題を解決しました。次のように問題を修正しました。

try {
                assert mapFragment.getView() != null;
                final ViewGroup parent = (ViewGroup) mapFragment.getView().findViewWithTag("GoogleMapMyLocationButton").getParent();
                parent.post(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            for (int i = 0, n = parent.getChildCount(); i < n; i++) {
                                View view = parent.getChildAt(i);
                                RelativeLayout.LayoutParams rlp = (RelativeLayout.LayoutParams) view.getLayoutParams();
                                // position on right bottom
                                rlp.addRule(RelativeLayout.ALIGN_PARENT_LEFT, 0);
                                rlp.addRule(RelativeLayout.ALIGN_PARENT_TOP,0);
                                rlp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
                                rlp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
                                rlp.rightMargin = rlp.leftMargin;
                                rlp.bottomMargin = 25;
                                view.requestLayout();
                            }
                        } catch (Exception ex) {
                            ex.printStackTrace();
                        }
                    }
                });
            } catch (Exception ex) {
                ex.printStackTrace();
            }

この例では、コンパスを右隅に配置します。これを行うときは、mapFragmentが作成されていることを確認する必要があります。MapFragmentのメソッド「onMapReady」でコードを実行することをお勧めします。

于 2015-08-06T13:08:29.780 に答える
3

私が知っているように、あなたはコンパスの位置を変えることはできませんが、それを無効にしてあなたのプライベートなものを作ることはできます。

こちらの例をご覧ください

于 2013-02-23T16:59:14.323 に答える
1

パディングベースのソリューションは小さなオフセットで機能しますが、私が知る限り、標準のGoogleマップアプリのようにコンパスの水平方向の「重力」を左から右に確実に変更できるAPIは公開されていません。

ここに画像の説明を入力してください

自分のアプリでコンパスを右に移動するために大量の左パディングを適用した場合、左下のGoogleロゴも右にシフトされることに注意してください。

于 2016-11-17T19:58:25.587 に答える
1

2.0マップAPI。

        // change compass position 
    if (mapView != null &&
            mapView.findViewById(Integer.parseInt("1")) != null) {
        // Get the view
        View locationCompass = ((View) mapView.findViewById(Integer.parseInt("1")).getParent()).findViewById(Integer.parseInt("5"));
        // and next place it, on bottom right (as Google Maps app)
        RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams)
                locationCompass.getLayoutParams();
        // position on right bottom
        layoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE);
        layoutParams.setMargins(0, 160,30, 0); // 160 la truc y , 30 la  truc x
    }
于 2017-02-11T15:00:21.467 に答える
1

@Vignon(https://stackoverflow.com/a/38266867/2350644)の回答に基づいて、コンパスアイコンを画面の右上に配置するためのKotlinコードスニペットを次に示します。カスタムマージンを追加することもできます(この例では、コンパス画像のmarginTopは50dpです)。

mapFragment?.view?.let { mapView ->
  mapView.findViewWithTag<View>("GoogleMapMyLocationButton").parent?.let { parent ->
    val vg: ViewGroup = parent as ViewGroup
    vg.post {
      val mapCompass: View = parent.getChildAt(4)
      val rlp = RelativeLayout.LayoutParams(mapCompass.height, mapCompass.height)
      rlp.addRule(RelativeLayout.ALIGN_PARENT_LEFT, 0)
      rlp.addRule(RelativeLayout.ALIGN_PARENT_TOP)
      rlp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT)
      rlp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, 0)

      val topMargin = (50 * Resources.getSystem().displayMetrics.density).toInt()
      rlp.setMargins(0, topMargin, 0, 0)    
      mapCompass.layoutParams = rlp
    }
  }
 }
于 2020-04-02T09:47:15.757 に答える
0

私の解決策があります。

まず、任意のビューのすべてのサブビューを取得するには、このKotlin拡張機能が必要です

fun View.getAllChildren(): List<View> {
    val result = ArrayList<View>()
    if (this !is ViewGroup) {
        result.add(this)
    } else {
        for (index in 0 until this.childCount) {
            val child = this.getChildAt(index)
            result.addAll(child.getAllChildren())
        }
    }
    return result
}

その後、彼のコンテンツの説明でコンパスを探して取得します(コンテンツの説明が将来変更された場合は、レイアウトインスペクターを使用してcasで取得します)。

あなたがあなたの見解を持っているとき、このように彼の位置を変えてください:

    binding.mapView
            .getAllChildren()
            .firstOrNull { it.contentDescription == "Compass" }
            ?.let { it.y = it.y + 400 }
于 2021-01-13T15:15:10.187 に答える
0

@Vignon herreに続いて、コンパスを左下隅(kotlin内)に配置するための提案があります。

            mapFragment.view?.let { mapView->
                mapView.findViewWithTag<View>("GoogleMapMyLocationButton").parent?.let { parent->
                    val vg: ViewGroup = parent as ViewGroup
                    vg.post {
                        val mapCompass :View = parent.getChildAt(4)
                        val rlp = RelativeLayout.LayoutParams(mapCompass.height, mapCompass.height)
                        rlp.addRule(RelativeLayout.ALIGN_PARENT_LEFT)
                        rlp.addRule(RelativeLayout.ALIGN_PARENT_TOP,0)
                        rlp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT,0)
                        rlp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM)

                        val bottomMargin = (40 * Resources.getSystem().displayMetrics.density).toInt()
                        val leftMargin = (5 * Resources.getSystem().displayMetrics.density).toInt()
                        rlp.setMargins(leftMargin,0,0,bottomMargin)
                        mapCompass.layoutParams = rlp
                    }
                }
            }
于 2021-04-13T18:27:42.630 に答える
0

次のスニペットを使用することをお勧めします。

mapView.findViewWithTag<View>("GoogleMapCompass")?.let { compass ->
    compass.post {
        val topMargin = compass.marginTop
        val rlp = RelativeLayout.LayoutParams(compass.height, compass.height)
        rlp.addRule(RelativeLayout.ALIGN_PARENT_LEFT, 0)
        rlp.addRule(RelativeLayout.ALIGN_PARENT_TOP)
        rlp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT)
        rlp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, 0)

        val endMargin = (4 * Resources.getSystem().displayMetrics.density).toInt()
        rlp.setMargins(0, topMargin, endMargin, 0)
        compass.layoutParams = rlp
    }
}

このように、「GoogleMapMyLocationButton」を使用して親を調べる必要はありません。グーグルがmapViewのアップデートを提供するとき、親に繰り返すことは何の利益ももたらさず、将来もっと簡単に壊れる可能性があります。そのコード内で、コンパスに直接アクセスできます。これが、ここで必要な要素です。

于 2021-12-13T15:29:18.513 に答える