高德地图圆圈内展示market

最近项目要做一个范围投放,这里用到了高德地图;

首先申请key,就不说了,基本都会申请,这里注意一个点,就是填写sha1值的时候一定注意,因为本人把两个sha1值全写成测试版的了,结果打包出来运行就是白屏,测试版的就写测试版的sha1值,发布版的就写发布版的sha1值,别写成一样的了。

获取测试版的sha1值
点击studio右上角的Gradle,里面有一个signingReport,双击,下面的就能看到测试版的sha1值
测试版

如果没有,点击左上角的/ab
获取sha1值

获取发布版的sha1值
首先打包,打包成功后找到你打包设置生成的keystore文件,复制一下路径
打包
然后再studio黑窗口中执行命令行 keytool -list -v -keystore [你的keystore文件路径],如图
发布版
输入你的密码,就是你打包的密码,紧接着下面就能看到发布版的sha1值了

地图开发:
项目涉及我用到了地图2d,定位,勾选这俩就可以
这里写图片描述
我的是2d地图,所以不需要so库文件,3d的需要,文档有说明。
获取权限:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
 <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
<!--允许程序打开网络套接字-->
<uses-permission android:name="android.permission.INTERNET" />
<!--允许程序设置内置sd卡的写权限-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />   
<!--允许程序获取网络状态-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<!--允许程序访问WiFi网络信息-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
<!--允许程序读写手机状态和身份-->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />     
<!--允许程序访问CellID或WiFi热点来获取粗略的位置-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 

添加key值

<meta-data android:name="com.amap.api.v2.apikey" 
android:value="你的key">
</meta-data>

导入jar包就能开始了
布局文件

    <com.amap.api.maps2d.MapView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/mapView"/>

代码:

 MapView mMapView = null;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main);
    //获取地图控件引用
   mMapView = (MapView) getView().findViewById(R.id.mapView);
        aMap = mMapView.getMap();
        //这个一定要写
        mMapView.onCreate(savedInstanceState);
  }
 @Override
  protected void onDestroy() {
    super.onDestroy();
    //在activity执行onDestroy时执行mMapView.onDestroy(),销毁地图
    mMapView.onDestroy();
  }
 @Override
 protected void onResume() {
    super.onResume();
    //在activity执行onResume时执行mMapView.onResume (),重新绘制加载地图
    mMapView.onResume();
    }
 @Override
 protected void onPause() {
    super.onPause();
    //在activity执行onPause时执行mMapView.onPause (),暂停地图的绘制
    mMapView.onPause();
    }
 @Override
 protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    //在activity执行onSaveInstanceState时执行mMapView.onSaveInstanceState (outState),保存地图当前的状态
    mMapView.onSaveInstanceState(outState);
  } 

以上就能显示地图,但是没功能,因为展示范围所以画个圆,画圆要根据自己的位置来画,所以先定位,获取自己的经纬度

public void initMap() {
        aMap.setMyLocationEnabled(true);
        UiSettings uiSettings = aMap.getUiSettings();
        //设置禁止缩放
      //uiSettings.setZoomGesturesEnabled(false);
        //页面不显示加号and减号
        uiSettings.setZoomControlsEnabled(false);
        //定位监听
        aMap.setOnMyLocationChangeListener(this);
        initLocation();
        getMediaList(SPUtil.getString(SysParam.TOKEN));
    }


    /**
     * 初始化蓝点,具体可以看官方文档
     */
    public void initLocation() {
        myLocationStyle = new MyLocationStyle();//初始化定位蓝点样式类myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE);//连续定位、且将视角移动到地图中心点,定位点依照设备方向旋转,并且会跟随设备移动。(1秒1次定位)如果不设置myLocationType,默认也会执行此种模式。
        myLocationStyle.interval(5000); //设置连续定位模式下的定位间隔,只在连续定位模式下生效,单次定位模式下不会生效。单位为毫秒。
        aMap.setMyLocationStyle(myLocationStyle);//设置定位蓝点的Style
        aMap.setMyLocationEnabled(true);
        //自己可以设置定位展示的图标 
        myLocationStyle.myLocationIcon(BitmapDescriptorFactory.fromResource(R.mipmap.ic_launcher));
        myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_FOLLOW);
        //定位蓝点精度框为透明    myLocationStyle.strokeColor(Color.TRANSPARENT);
  myLocationStyle.radiusFillColor(Color.TRANSPARENT);
        //如果不想展示不显示蓝点,设置为true就行,
        myLocationStyle.showMyLocation(false);

    }

     //定位监听实现的接口
    @Override
    public void onMyLocationChange(Location location) {
        //拿到自己的经纬度
        latLng = new LatLng(location.getLatitude(), location.getLongitude());
        //在地图上绘制圆
        aMap.addCircle(new CircleOptions()
                .center(latLng)//自己的位置为中心
                .radius(1000)//圆的半径
                .fillColor(Color.argb(60, 1, 1, 1))//圆内颜色及透明度
                .strokeColor(Color.RED)//圆边框颜色
                .strokeWidth(1));//边框宽度
        //展示我当前的位置,如果不写不会显示自己当前在哪
       aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 15));//参数:1.自己的经纬度,2.地图的缩放比例
    }

运行起来就能看到以自己当前位置绘制的一个半径1000的圆
下面在展示圆圈内的market,项目里是让展示20个红包
效果图
因为后台没有,老板先让展示20个红包,所以就展示了20个假数据,如果真实数据需要自己判断了

//20个有点多,就展示两个吧,这里需要自定义maerket
public void initDate() {
        if (marker != null) {
            marker.remove();
        }
        //自定义布局,把view转换成Bitmap
        View markerView = View.inflate(getActivity(), R.layout.marker_iew, null);
        TextView marker_tv = (TextView) markerView.findViewById(R.id.marker_tv);
        marker_tv.setText("5");
        Bitmap bitmap = convertViewToBitmap(markerView);

        MarkerOptions options = new MarkerOptions();
        LatLng markerLat = new LatLng(latLng.latitude + 0.000899, latLng.longitude + 0.001141);
        options.position(markerLat);
        options.title("0");
        options.icon(BitmapDescriptorFactory.fromBitmap(bitmap));

        MarkerOptions options1 = new MarkerOptions();
        LatLng markerLat1 = new LatLng(latLng.latitude - 0.000899 - 0.000899, latLng.longitude - 0.001141 + 0.001141);
        options1.position(markerLat1);
        options1.title("1");
        options1.icon(BitmapDescriptorFactory.fromBitmap(bitmap));

         //添加到集合中
        list.add(options);
        list.add(options1);
        checkLat(list);
}

    public void checkLat(List<MarkerOptions> latList) {
        for (int i = 0; i < latList.size(); i++) {
             //因为自己是假数据,先注释了,如果是真的数据,就需要下面的判断了,如果你要绘制的market点小于你圆的半径就说明在圆里,就去绘制market,这里需要一个工具类,高德自带的计算距离的,里面传入两个点的经纬度就可以得到距离,在对比半径就知道该不该绘制
            //  if (latLng != null) {
            //判断点是否在所绘制的圆内,如果一个点小于圆的半径说明在该圆内
//                float distance = AMapUtils.calculateLineDistance(latLng, markerLat);
//                if (distance <= 1000) {
//                }
            marker = aMap.addMarker(latList.get(i));
            //}
        }
        aMap.invalidate();
    }


    //view 转bitmap  这里碰到一个问题,因为画的market太大了,所以 view.layout(0, 0, 50, 68);我就写死了,但是我的需求上是展示图标,在图标上还得显示一个数字,我把宽高写成50,68后
    布局里的textview死活不显示,如果写成view.getMeasuredWidth(),view.getMeasuredHeight()图标展示就太大了,很纠结,最后我说的实现不出来,公司说的不用加数字,有知道的告诉一声,多谢!
    public Bitmap convertViewToBitmap(View view) {
        view.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
        view.layout(0, 0, 50, 68);
        view.buildDrawingCache();
        Bitmap bitmap = view.getDrawingCache();
        return bitmap;
    }

最后就是market的点击事件,点击后播放一个gif动图,再跳转视频页面播放

aMap.setOnMarkerClickListener(new AMap.OnMarkerClickListener() {
            @Override
            public boolean onMarkerClick(Marker marker) {
                //返回true后需要执行自己的一些逻辑
                //marker.showInfoWindow();
                if (infoList.size() > 0) {
                //title是我设置的标识,代表点击的那个market,从集合取对应对象数据传值给下个页面
                    String title = marker.getTitle();
                    int position = Integer.parseInt(title);
                    VideoInfo video = infoList.get(position);
                    Intent intent = new Intent();
                    Bundle bundle = new Bundle();
                    bundle.putString("TITLE", video.getMediaName() + "-第" + video.getPeriods() + "期");
                    bundle.putString("URI", video.getMediaUrl());
                    bundle.putString("jumpUrl", video.getUrl());
                    bundle.putInt("decode_type", 1);
                    bundle.putLong("deliveryId", video.getDeliveryId());
                    bundle.putLong("mediaId", video.getMediaId());
                    bundle.putInt("tag", 1);
                    intent.putExtras(bundle);
                    intent.setClass(getActivity(), RedenvelopesActivity.class);
                    startActivity(intent);
                }

                //返回true,不让marker移动重新定位
                return true;
            }
        });

播放动图用的一个第三方 android-gif-drawable,glide加载gif图过大会卡住不能展示gif图。
别忘了6.0手机权限

 @TargetApi(Build.VERSION_CODES.M)
    private void permission() {
        List<String> permissionLists = new ArrayList<>();
        if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            permissionLists.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
        }
        if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_WIFI_STATE) != PackageManager.PERMISSION_GRANTED) {
            permissionLists.add(Manifest.permission.ACCESS_WIFI_STATE);
        }
        if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
            permissionLists.add(Manifest.permission.READ_PHONE_STATE);
        }
        if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            permissionLists.add(Manifest.permission.ACCESS_COARSE_LOCATION);
        }
        if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            permissionLists.add(Manifest.permission.ACCESS_FINE_LOCATION);
        }
        if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS) != PackageManager.PERMISSION_GRANTED) {
            permissionLists.add(Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS);
        }
        if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.CHANGE_WIFI_STATE) != PackageManager.PERMISSION_GRANTED) {
            permissionLists.add(Manifest.permission.CHANGE_WIFI_STATE);
        }
        if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_NETWORK_STATE) != PackageManager.PERMISSION_GRANTED) {
            permissionLists.add(Manifest.permission.ACCESS_NETWORK_STATE);
        }
        if (!permissionLists.isEmpty()) {// 说明肯定有拒绝的权限
      //我的是在fragment里面请求的权限,所以这里写当前的fragment,千万别写ActivityCompat,这样activity会拦截的,不会回调下面权限方法的。
      VideoMapFragment.this.requestPermissions(permissionLists.toArray(new String[permissionLists.size()]),
                    PERMISSION_REQUESTCODE);
        } else {
            initMap();
        }
    }

  @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            case PERMISSION_REQUESTCODE:
                if (grantResults.length > 0) {
                    for (int grantResult : grantResults) {
                        if (grantResult != PackageManager.PERMISSION_GRANTED) {
                            Common.showToast("某一个权限被拒绝了", true);
                            return;
                        }
                    }
                    initMap();
                }
                break;
            default:
                break;
        }
    }

以上就是全部代码,做完收获很多,权限,sha1值俩问题费了好长时间,原来的页面用的Tabhost展示底部导航狼,里面的子activity请求权限不回调的,整了好长时间也没成功,最后我把页面换成RadioGroup+Fragment才行的,如有知道activity嵌套activity权限申请失败解决方案的告诉一声啊,多谢!

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值