(Google Maps) Проверьте, находится ли LatLng в пределах 80% долготы видимого региона - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть макет Android с макетом карты Google, наложенным маленьким LinearLayout внизу.Этот небольшой макет становится видимым, когда пользователь выбирает маркер на карте.Теперь я хочу знать, будет ли выбранный маркер перекрываться небольшим макетом при выборе, скажем, находится ли он в пределах первых 80% видимой области долготы карты.Я играл с maps.getProjection().getVisibleRegion(), но я не уверен, куда я иду отсюда.Заранее спасибо enter image description here

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Для проверки того, перекрывается ли 80% (или более) маркера вашим небольшим макетом, лучше использовать координаты экрана, а не LatLng. Вы должны получить на экране y координату маркера, маркер height и height "малого макета", после чего проверить, что y координата терки маркера превышает y координаты вершины малого макета на 80%.

Итак, что-то вроде этого:

public class MainActivity extends AppCompatActivity implements OnMapReadyCallback {

    private static final String TAG = MainActivity.class.getSimpleName();

    static final LatLng KYIV = new LatLng(50.450000, 30.523610);

    private GoogleMap mGoogleMap;
    private SupportMapFragment mMapSupportedFragment;
    private LinearLayout mSmallLinearLayout;
    private RelativeLayout mRootLayout;
    private Marker mMarker;
    private int mRootLayoutHeight;
    private int mSmallLayoutHeight;
    private int mMarkerWidth = 100;
    private int mMarkerHeight = 100;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mRootLayout = (RelativeLayout) findViewById(R.id.root_layout);
        mSmallLinearLayout = (LinearLayout) findViewById(R.id.small_bottom_layout);

        mMapSupportedFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map_fragment);
        mMapSupportedFragment.getMapAsync(MainActivity.this);

    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        mGoogleMap = googleMap;

        mRootLayout.post(new Runnable() {
            @Override
            public void run() {
                mRootLayoutHeight = mRootLayout.getHeight();
            }
        });

        mSmallLinearLayout.post(new Runnable() {
            @Override
            public void run() {
                mSmallLayoutHeight = mSmallLinearLayout.getHeight();
            }
        });

        mMarker = mGoogleMap.addMarker(new MarkerOptions()
                .position(KYIV)
                .icon(getMarkerIcon(mMarkerWidth, mMarkerHeight)));

        mGoogleMap.setOnCameraIdleListener(new GoogleMap.OnCameraIdleListener() {
            @Override
            public void onCameraIdle() {
                if (isMarkerOverlayed()) {
                    // do you magic here:
                    Toast.makeText(MainActivity.this, "Overlapped", Toast.LENGTH_SHORT).show();
                };
            }
        });

    }

    private boolean isMarkerOverlayed() {
        boolean overlayed = false;

        LatLng markerLocation = mMarker.getPosition();
        Projection projection = mGoogleMap.getProjection();
        Point markerScreenPosition = projection.toScreenLocation(markerLocation);

        int smallLayoutTopY = mRootLayoutHeight - mSmallLayoutHeight;

        // 0.8 is 80% of marker height
        if (markerScreenPosition.y >= smallLayoutTopY + 0.8 * mMarkerHeight &&
            markerScreenPosition.y < mRootLayoutHeight) {
            overlayed = true;
        }

        return overlayed;
    }

    private BitmapDescriptor getMarkerIcon(int width, int height) {

        final Drawable iconDrawable = getResources().getDrawable(R.drawable.ic_marker);
        final Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);
        iconDrawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
        iconDrawable.draw(canvas);

        return BitmapDescriptorFactory.fromBitmap(bitmap);
    }

}

у вас есть что-то вроде этого:

Marker overlay

0 голосов
/ 08 ноября 2018

Попробуйте что-то вроде этого после того, как подтвердите, что карта загружена:

LatLngBounds.Builder builder = new LatLngBounds.Builder();

LatLngBounds bounds = builder.build();
LatLng ne = bounds.northeast;
LatLng sw = bounds.southwest;

Point neBoundInPx = mGoogleMap.getProjection().toScreenLocation(ne);
Point swBoundInPx = mGoogleMap.getProjection().toScreenLocation(sw);

Point newBottomBoundInPx = new Point (neBoundInPx.x , swBoundInPx.y - bottomLinearLayout.getHeight());

LatLng newBottomBoundInPxLatLng = mGoogleMap.getProjection().fromScreenLocation(newBottomBoundInPx);

if(placeLatLng.latitude <= ne.latitude &&
        placeLatLng.longitude >= sw.longitude &&
        placeLatLng.latitude >= newBottomBoundInPxLatLng.latitude &&
        placeLatLng.longitude <= ne.longitude) {
            //Yor place is above the linearLayout at the Bottom.
}
...