Android 如何自定义判断点是否在(凹凸)多边形内

       在开发中我们经常会遇到需要监听手势动作的需求,往往这些需求会与界面的某个区域绑定。但是当该区域是一个不规则的(凹凸)多边形时,这就给我们的判断添加了难度。
       其实在第三方地图中就有判断点是否在指定区域内的功能,API中提供了相关的方法。但我们不可能在不使用地图功能的时候去特地导入Map类来实现这一功能,所以在这里我将该功能的实现提取出自定义一个工具类。为了更直观使用高德地图绘制多边形用自定义方法判断点与多边形区域的关系。

public class Point {
    double x;//X坐标
    double y;//y坐标

    public Point(double x, double y) {
        this.x = x;
        this.y = y;
    }

    public double getX() {
        return x;
    }

    public void setX(double x) {
        this.x = x;
    }

    public double getY() {
        return y;
    }

    public void setY(double y) {
        this.y = y;
    }
}

操作类

public class MainActivity extends AppCompatActivity implements AMap.OnMapClickListener {
    private AMap aMap;
    private MapView mvMap;
    private Polygon polygon;
    private Marker marker;
    private List<PointBean> pointList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mvMap = findViewById(R.id.mv_main_amp);
        // 此方法必须重写
        mvMap.onCreate(savedInstanceState);
        initMap();
        initPolygonPointList();

    }

    private void initMap() {
        if (aMap == null) {
            aMap = mvMap.getMap();
        }
        // 绘制一个长方形
        PolygonOptions pOption = new PolygonOptions();
        pOption.add(new LatLng(39.926516, 116.389366));
        pOption.add(new LatLng(39.924870, 116.403270));
        pOption.add(new LatLng(39.918090, 116.406274));
        pOption.add(new LatLng(39.916282, 116.397254));
        pOption.add(new LatLng(39.909466, 116.397863));
        pOption.add(new LatLng(39.913021, 116.387134));
        polygon = aMap.addPolygon(pOption.strokeWidth(4)
                .strokeColor(Color.argb(50, 1, 1, 1))
                .fillColor(Color.argb(50, 1, 1, 1)));
        aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(39.920459,
                116.395301), 15));
    }

    private void initPolygonPointList() {
        pointList = new ArrayList<>();
        pointList.add(new PointBean(39.926516, 116.389366));
        pointList.add(new PointBean(39.924870, 116.403270));
        pointList.add(new PointBean(39.918090, 116.406274));
        pointList.add(new PointBean(39.916282, 116.397254));
        pointList.add(new PointBean(39.909466, 116.397863));
        pointList.add(new PointBean(39.913021, 116.387134));
        aMap.setOnMapClickListener(this);
    }

    @Override
    public void onMapClick(LatLng arg0) {
        if (marker != null) {
            marker.remove();
        }
        marker = aMap.addMarker(new MarkerOptions().position(arg0));
        //高德地图自带点与多边形区域的关系
        boolean isBorder1 = polygon.contains(arg0);
        //自定义点与多边形区域的关系
        boolean isBorder2 = PolygonRelUtil.isPolygonContainPoint(pointList,
                new PointBean(arg0.latitude, arg0.longitude));
        Toast.makeText(MainActivity.this, "是否在围栏里面:"
                + isBorder2, Toast.LENGTH_SHORT).show();

    }

    /**
     * 方法必须重写
     */
    @Override
    protected void onResume() {
        super.onResume();
        mvMap.onResume();
    }

    /**
     * 方法必须重写
     */
    @Override
    protected void onPause() {
        super.onPause();
        mvMap.onPause();
    }

    /**
     * 方法必须重写
     */
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        mvMap.onSaveInstanceState(outState);
    }

    /**
     * 方法必须重写
     */
    @Override
    protected void onDestroy() {
        super.onDestroy();
        mvMap.onDestroy();
    }
}


重点代码

        //自定义点与多边形区域的关系
        boolean isBorder2 = PolygonRelUtil.isPolygonContainPoint(pointList,
                new PointBean(arg0.latitude, arg0.longitude));
        Toast.makeText(MainActivity.this, "是否在围栏里面:"
                + isBorder2, Toast.LENGTH_SHORT).show();

效果图
在这里插入图片描述
在这里插入图片描述

发布了22 篇原创文章 · 获赞 31 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_36158551/article/details/103974801