android 自定义百度地图放大缩小

自定义实现Android百度地图的缩放图标,需要自定义一个缩放控件,实现效果如下:

这里的缩放效果,实现了点击按钮可以对地图的放大缩小,通过手势放大与缩小也控制缩放图标的可用状态。具体实现如下:

zoom_selector_out.xml

<!--?xml version="1.0" encoding="utf-8"?-->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:drawable="@drawable/zoomout_press">
    <item android:state_enabled="false" android:drawable="@drawable/zoomout_disable">
    <item android:drawable="@drawable/zoomout_normal">
</item></item></item></selector>

layout中的zoom_controls_in_out.xml布局文件:

<!--?xml version="1.0" encoding="utf-8"?-->
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical">

    <button android:id="@+id/btn_zoom_in" android:layout_width="32dp" android:layout_height="32dp" android:background="@drawable/zoom_selector_in">

    </button><button android:id="@+id/btn_zoom_out" android:layout_width="32dp" android:layout_height="32dp" android:background="@drawable/zoom_selector_out">

</button></linearlayout>

主配置文件main_activity.xml

<!--?xml version="1.0" encoding="utf-8"?-->
<relativelayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical">
    <com.baidu.mapapi.map.mapview android:id="@+id/mv_map" android:layout_width="match_parent" android:layout_height="match_parent" android:clickable="true">
    <com.example.map.view.zoomcontrolsview android:id="@+id/zcv_zoom" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignparentright="true" android:layout_alignparentbottom="true" android:layout_marginbottom="10dp" android:layout_marginright="10dp">
</com.example.map.view.zoomcontrolsview></com.baidu.mapapi.map.mapview></relativelayout>

相关的xml文件都在这里了,下面是具体实现代码:

自定义缩放控件类ZoomControlsView.java

package com.example.map.view;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.MapStatus;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.example.map.activity.R;

import android.content.Context;
import android.util.AttributeSet;
import android.widget.Button;
import android.widget.LinearLayout;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;;

public class ZoomControlsView extends LinearLayout implements OnClickListener{
    private Button inBtn;//放大按钮
    private Button outBtn;//缩小按钮
    private BaiduMap baiduMap;//百度地图对象控制器
    private MapStatus mapStatus;//百度地图状态
    private float minZoomLevel;//地图最小级别
    private float maxZoomLevel;//地图最大级别

    public ZoomControlsView(Context context, AttributeSet attrs) {
        super(context, attrs, 0);
        init();
    }

    public ZoomControlsView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    /**
     * 初始化
     */
    private void init(){
        //获取布局视图
        LinearLayout view=(LinearLayout) LayoutInflater.from(getContext()).inflate(R.layout.zoom_controls_in_out, null);
        //获取放大按钮
        inBtn=(Button) view.findViewById(R.id.btn_zoom_in);
        //获取缩小按钮
        outBtn=(Button) view.findViewById(R.id.btn_zoom_out);
        //设置点击事件
        inBtn.setOnClickListener(this);
        outBtn.setOnClickListener(this);
        //添加View
        addView(view);
    }

    @Override
    public void onClick(View v) {
        this.mapStatus=this.baiduMap.getMapStatus();//获取地图状态
        switch (v.getId()) {
        case R.id.btn_zoom_in:
            //改变地图状态
            this.baiduMap.setMapStatus(MapStatusUpdateFactory.zoomTo(mapStatus.zoom+1));
            controlZoomShow();//改变缩放按钮
            break;
        case R.id.btn_zoom_out:
            //改变地图状态
            this.baiduMap.setMapStatus(MapStatusUpdateFactory.zoomTo(mapStatus.zoom-1));
            controlZoomShow();//改变缩放按钮
            break;
        default:
            break;
        }
        //重新获取状态
        mapStatus=this.baiduMap.getMapStatus();
    }

    /**
     * 设置Map视图
     * @param mapView
     */
    public void setMapView(MapView mapView){
        //获取百度地图控制器
        this.baiduMap=mapView.getMap();
        //设置地图手势事件
        this.baiduMap.setOnMapStatusChangeListener(onMapStatusChangeListener);
        //获取百度地图最大最小级别
        maxZoomLevel=baiduMap.getMaxZoomLevel();
        minZoomLevel=baiduMap.getMinZoomLevel();
        controlZoomShow();//改变缩放按钮
    }

    /**
     * 控制缩放图标显示
     */
    private void controlZoomShow(){
        //获取当前地图状态
        float zoom=this.baiduMap.getMapStatus().zoom;
        //如果当前状态大于等于地图的最大状态,则放大按钮则失效
        if(zoom>=maxZoomLevel){
            inBtn.setBackgroundResource(R.drawable.zoomin_press);
            inBtn.setEnabled(false);
        }else{
            inBtn.setBackgroundResource(R.drawable.zoom_selector_in);
            inBtn.setEnabled(true);
        }

        //如果当前状态小于等于地图的最小状态,则缩小按钮失效
        if(zoom<=minZoomLevel){
            outBtn.setBackgroundResource(R.drawable.zoomout_press);
            outBtn.setEnabled(false);
        }else{
            outBtn.setBackgroundResource(R.drawable.zoom_selector_out);
            outBtn.setEnabled(true);
        }
    }
    /**
     * 地图状态改变相关接口实现
     */
    BaiduMap.OnMapStatusChangeListener onMapStatusChangeListener=new BaiduMap.OnMapStatusChangeListener() {

        /**
         * 手势操作地图,设置地图状态等操作导致地图状态开始改变。
         * @param status 地图状态改变开始时的地图状态
         */
        @Override
        public void onMapStatusChangeStart(MapStatus arg0) {

        }

        /**
         * 地图状态变化结束
         * @param status 地图状态改变结束时的地图状态
         */
        @Override
        public void onMapStatusChangeFinish(MapStatus arg0) {

        }

        /**
         * 地图状态变化中
         * @param status 当前地图状态
         */
        @Override
        public void onMapStatusChange(MapStatus arg0) {
            controlZoomShow();
        }
    };

}

MainActivity.java:

package com.example.map.activity;
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.MapView;
import com.example.map.view.ZoomControlsView;

import android.app.Activity;
import android.os.Bundle;

public class MainActivity extends Activity{
    private MapView mvMap;//百度地图控件
    private BaiduMap baiduMap;//地图对象控制器
    private ZoomControlsView zcvZomm;//缩放控件
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //必须在setContentView前
        SDKInitializer.initialize(getApplicationContext());
        setContentView(R.layout.main_activity);
        initMap();//初始化
    }

    /**
     * 初始化地图
     */
    private void initMap(){
        //获取地图控件
        mvMap=(MapView) findViewById(R.id.mv_map);
        mvMap.showZoomControls(false);//隐藏缩放控件
        //获取地图对象控制器
        baiduMap=mvMap.getMap();
        baiduMap.setBuildingsEnabled(true);//设置显示楼体
        baiduMap.setMapStatus(MapStatusUpdateFactory.zoomTo(19f));//设置地图状态

        //获取缩放控件
        zcvZomm=(ZoomControlsView) findViewById(R.id.zcv_zoom);
        zcvZomm.setMapView(mvMap);//设置百度地图控件

    }

    @Override
    protected void onPause() {
        super.onPause();
        mvMap.onPause();
    }

    @Override
    protected void onResume() {
        super.onResume();
        mvMap.onResume();
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        mvMap.onDestroy();//销毁地图
    }

}

这样就实现了自定义的缩放图标了

时间: 2024-08-01 04:04:40

android 自定义百度地图放大缩小的相关文章

Android自定义百度地图缩放图标

自定义实现Android百度地图的缩放图标,需要自定义一个缩放控件,实现效果如下: 这里的缩放效果,实现了点击按钮可以对地图的放大缩小,通过手势放大与缩小也控制缩放图标的可用状态.具体实现如下: 首先是drawable目录下的两个xml配置文件: zoom_selector_in.xml <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schem

【Android自定义View实战】之仿百度加载动画,一种优雅的Loading方式

转载请注明出处:http://blog.csdn.net/linglongxin24/article/details/53470872 本文出自[DylanAndroid的博客] Android自定义View实战之仿百度加载动画一种优雅的Loading方式 第一个仿百度加载动画用ObjectAnimator属性动画操作ImageView的属性方法实现 第二个仿百度加载动画第二种实现方式用ValueAnimator原生的ondraw方法实现 第三个扔球动画-水平旋转动画 第四个扔球动画-垂直旋转动

[原创] Android 自定义AlertDialog 去黑边终极解决方案(亲测有效!)

问题:自定义AlertDialog出现黑边 运行代码段: View view = View.inflate(context, R.layout.dialog_common, null); mDialog = new AlertDialog.Builder(context).create(); mDialog.setView(view); mDialog.show(); dialog_common.xml <?xml version="1.0" encoding="utf

Android 自定义 ViewPager 打造千变万化的图片切换效果

Android 自定义 ViewPager 打造千变万化的图片切换效果 标签: Android自定义ViewPagerJazzyViewPager 目录(?)[+] 转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38026503 记 得第一次见到ViewPager这个控件,瞬间爱不释手,做东西的主界面通通ViewPager,以及图片切换也抛弃了ImageSwitch之类的,开 始让ViewPager来做.时间长了,ViewPa

【转】android 自定义ViewPager,修改原动画

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38026503 记 得第一次见到ViewPager这个控件,瞬间爱不释手,做东西的主界面通通ViewPager,以及图片切换也抛弃了ImageSwitch之类的,开 始让ViewPager来做.时间长了,ViewPager的切换效果觉得枯燥,形成了审美疲劳~~我们需要改变,今天教大家如何改变ViewPager 切换时的效果,实现个性化的图片切换~~ 看一下这样效果的图片切换: 是

Android 自定义AlertDialog 去黑边终极解决方案(亲测有效!)

问题:自定义AlertDialog出现黑边 运行代码段: View view = View.inflate(context, R.layout.dialog_common, null); mDialog = new AlertDialog.Builder(context).create(); mDialog.setView(view); mDialog.show(); dialog_common.xml <?xml version="1.0" encoding="utf

ANDROID自定义视图——仿瀑布布局(附源码)

简介: 在自定义view的时候,其实很简单,只需要知道3步骤: 1.测量--onMeasure():决定View的大小 2.布局--onLayout():决定View在ViewGroup中的位置 3.绘制--onDraw():如何绘制这个View. 第3步的onDraw系统已经封装的很好了,基本不用我们来操心,只需要专注到1,2两个步骤就中好了. 第一步的测量,可以参考:(ANDROID自定义视图--onMeasure,MeasureSpec源码 流程 思路详解) 第二步的布局,可以参考:(AN

android自定义View-------IOS风格的滑动开关

源码和测试例子已经放到github https://github.com/Leaking/SlideSwitch,欢迎star欢迎fork欢迎提issue 项目开发中,经常会有一些关于用户个性化的设置,此时经常需要一个开关控件,周末将之前写的自定义开关控件优化了一下,效果图如下.先说说大概思路:按钮绘制了三个图层,最下面是覆盖整个View的灰色,第二个是覆盖整个View的自定义的颜色,它可以改变透明度.第三个是白色.当白色部分移动时,修改第二个图层的透明度,即可作出如图滑动过程中颜色渐变的效果.

android自定义View-------滑动按钮

源码和测试例子已经放到github https://github.com/Leaking/SlideSwitch 效果图如下,传不了gif图片,暂且截一个静态图片.其中按钮滑动时颜色有渐变效果. 先说说大概思路:按钮绘制了三个图层,最下面是覆盖整个View的灰色,第二个是覆盖整个View的自定义的颜色,它可以改变透明度.第三个是白色.当白色部分移动时,修改第二个图层的透明度即可. 大概记录一下重写一个组件的实现过程. 1,定义属性 2,,在Java代码中的构造器获取属性的值 3,重写onMeas