优定义网

android 百度地图系列之地图初始化及定位

迟宇涵 发表于 2018-6-11 21:05:13 | 显示全部楼层 |阅读模式

在Android应用中,很多时候需要地图功能,回顾过去写的项目和百度地图api,开始总结一下Android百度地图的实现。首先总结一下怎么开始一个Android百度地图功能。

当使用百度地图的时候,提到一个appkey。“在使用百度地图SDK为您提供的各种LBS能力之前,您需要获取百度地图移动版的开发密钥,该密钥与您的百度账户相关联。因此,您必须先有百度帐户,才能获得开发密钥。并且,该密钥与您创建的过程名称有关。Key地址为:http://lbsyun.baidu.com/apiconsole/key

这是百度地图api给的定义。总之,一个项目包名和sha1对应一个appkey。首先注册百度账号,根据教程一步步创建appkey。

当有了appkey,我们就能开一部署一个android百度地图环境。首先在百度api的相关下载中,将需要的功能勾选上,并下载相关的开发包,示例代码等。将开发包导入项目libs文件夹下。然后,开始部署AndroidMinifest.xml,添加权限,添加appkey,定位的service。

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3.     package="自己的包名"
  4.     android:versionCode="1"
  5.     android:versionName="1.0" >
  6.     <uses-sdk
  7.         android:minSdkVersion="14"
  8.         android:targetSdkVersion="21" />
  9.     <!-- 百度地图权限 -->
  10.     <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
  11.     <uses-permission android:name="android.permission.WAKE_LOCK"/>
  12.     <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
  13.     <uses-permission android:name="android.permission.GET_TASKS" />
  14.     <uses-permission android:name="android.permission.WRITE_SETTINGS" />
  15.     <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
  16.     <!-- 这个权限用于进行网络定位 -->
  17.     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
  18.     <!-- 这个权限用于访问GPS定位 -->
  19.     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
  20.     <!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位 -->
  21.     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
  22.     <!-- 获取运营商信息,用于支持提供运营商信息相关的接口 -->
  23.     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  24.     <!-- 用于读取手机当前的状态 -->
  25.     <uses-permission android:name="android.permission.READ_PHONE_STATE" />
  26.     <!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据 -->
  27.     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  28.     <!-- 访问网络,网络定位需要上网 -->
  29.     <uses-permission android:name="android.permission.INTERNET" />
  30.     <application
  31.         android:allowBackup="true"
  32.         android:icon="@drawable/ic_launcher"
  33.         android:label="@string/app_name"
  34.         android:theme="@style/AppTheme" >
  35.         <meta-data
  36.             android:name="com.baidu.lbsapi.API_KEY"
  37.             android:value="申请的appkey" />
  38.         <activity
  39.             android:name=".MainActivity"
  40.             android:label="@string/app_name"
  41.             android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen" >
  42.             <intent-filter>
  43.                 <action android:name="android.intent.action.MAIN" />
  44.                 <category android:name="android.intent.category.LAUNCHER" />
  45.             </intent-filter>
  46.         </activity>
  47.         <service
  48.             android:name="com.baidu.location.f"
  49.             android:enabled="true"
  50.             android:process=":remote" >
  51.         </service>
  52.     </application>
  53. </manifest>
复制代码

下一步就是在activity_main.xml中添加布局文件。本片文章还有自定义的放大缩小,定位等功能。

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2.     xmlns:tools="http://schemas.android.com/tools"
  3.     android:layout_width="match_parent"
  4.     android:layout_height="match_parent" >
  5.     <com.baidu.mapapi.map.MapView  
  6.         android:id="@+id/bmapView"  
  7.         android:layout_width="fill_parent"  
  8.         android:layout_height="fill_parent"  
  9.         android:clickable="true" />
  10.     <ImageButton
  11.         android:id="@+id/ib_small"
  12.         android:layout_width="40dp"
  13.         android:layout_height="40dp"
  14.         android:background="@drawable/small"
  15.         android:layout_alignParentBottom="true"
  16.         android:layout_alignParentRight="true"
  17.         android:layout_marginRight="10dp"
  18.         android:layout_marginBottom="60dp"/>
  19.     <ImageButton
  20.         android:id="@+id/ib_large"
  21.         android:layout_width="40dp"
  22.         android:layout_height="40dp"
  23.         android:layout_above="@+id/ib_small"
  24.         android:layout_alignLeft="@+id/ib_small"
  25.         android:background="@drawable/large" />
  26.     <ImageButton
  27.         android:id="@+id/ib_mode"
  28.         android:layout_width="40dp"
  29.         android:layout_height="40dp"
  30.         android:layout_above="@+id/ib_large"
  31.         android:layout_alignLeft="@+id/ib_large"
  32.         android:layout_marginBottom="12dp"
  33.         android:background="@drawable/mode" />
  34.     <ImageButton
  35.         android:id="@+id/ib_traffic"
  36.         android:layout_width="40dp"
  37.         android:layout_height="40dp"
  38.         android:layout_above="@+id/ib_loc"
  39.         android:layout_alignLeft="@+id/ib_loc"
  40.         android:layout_marginBottom="12dp"
  41.         android:background="@drawable/offtraffic" />
  42.     <ImageButton
  43.         android:id="@+id/ib_loc"
  44.         android:layout_width="40dp"
  45.         android:layout_height="40dp"
  46.         android:layout_alignParentLeft="true"
  47.         android:layout_alignTop="@+id/ib_small"
  48.         android:layout_marginLeft="10dp"
  49.         android:background="@drawable/loc" />
  50. </RelativeLayout>
复制代码

显示效果图:

1.jpg

下面开始具体的代码实现

当前程序有三个功能:显示地图,显示定位,实现按钮控制。

  1. @Override
  2.     protected void onCreate(Bundle savedInstanceState) {
  3.         super.onCreate(savedInstanceState);
  4.         //在使用SDK各组件之前初始化context信息,传入ApplicationContext  
  5.         //注意该方法要再setContentView方法之前实现  
  6.         SDKInitializer.initialize(getApplicationContext());  
  7.         setContentView(R.layout.activity_main);  
  8.         //初始化控件
  9.         initView();
  10.         //初始化地图
  11.         initMap();
  12.         //定位
  13.         initLocation();
  14.     }
复制代码

一、显示基本地图

初始化地图显示,将地图在手机上显示出来

  1. //获取地图控件引用  
  2. mMapView = (MapView) findViewById(R.id.bmapView);
  3. // 不显示缩放比例尺
  4. mMapView.showZoomControls(false);
  5. // 不显示百度地图Logo
  6. mMapView.removeViewAt(1);
  7. //百度地图
  8. mBaiduMap = mMapView.getMap();
  9. // 改变地图状态,使地图显示在恰当的缩放大小
  10. MapStatus mMapStatus = new MapStatus.Builder().zoom(15).build();
  11. MapStatusUpdate mMapStatusUpdate = MapStatusUpdateFactory.newMapStatus(mMapStatus);
  12. mBaiduMap.setMapStatus(mMapStatusUpdate);
复制代码

二、地图的控制按钮:缩放按钮,切换模式按钮,开启实时交通图

1.在地图初始化显示时,我将自带的缩放比例尺去掉了,需要自定义一个缩放按钮。我们一般显示将地图显示在5-18级别中,所以在点击事件中对按钮进行了控制。

  1. case R.id.ib_large:
  2. if (zoomLevel < 18) {
  3.     mBaiduMap.setMapStatus(MapStatusUpdateFactory.zoomIn());
  4.     ib_small.setEnabled(true);
  5. } else {
  6.     showInfo("已经放至最大,可继续滑动操作");
  7.     ib_large.setEnabled(false);
  8. }
  9. break;
  10. case R.id.ib_small:
  11. if (zoomLevel > 6) {
  12.     mBaiduMap.setMapStatus(MapStatusUpdateFactory.zoomOut());
  13.     ib_large.setEnabled(true);
  14. } else {
  15.     ib_small.setEnabled(false);
  16.     showInfo("已经缩至最小,可继续滑动操作");
  17. }
  18. break;
复制代码

zoomlevel是一个全局变量,这时候就需要实时监控地图的缩放级别是多少,需要给地图添加一个地图状态改变的监听事件

  1. //设置地图状态改变监听器
  2. mBaiduMap.setOnMapStatusChangeListener(new OnMapStatusChangeListener() {
  3. @Override
  4. public void onMapStatusChangeStart(MapStatus arg0) {
  5. }
  6. @Override
  7. public void onMapStatusChangeFinish(MapStatus arg0) {
  8. }
  9. @Override
  10. public void onMapStatusChange(MapStatus arg0) {
  11.     //当地图状态改变的时候,获取放大级别
  12.     zoomLevel = arg0.zoom;
  13. }
  14. });
复制代码

2.切换显示模式和实时交通图

  1. boolean modeFlag = true;//设置初始时是普通模式
  2. case R.id.ib_mode://卫星模式和普通模式
  3. if(modeFlag){
  4.     modeFlag = false;
  5.     mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
  6.     showInfo("开启卫星模式");
  7. }else{
  8.     modeFlag = true;
  9.     mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
  10.     showInfo("开启普通模式");
  11. }
  12. break;
  13. case R.id.ib_traffic://是否开启交通图
  14. if(mBaiduMap.isTrafficEnabled()){//判断是否开启了交通图
  15.     mBaiduMap.setTrafficEnabled(false);
  16.     ib_traffic.setBackgroundResource(R.drawable.offtraffic);
  17.     showInfo("关闭实时交通图");
  18. }else{
  19.     mBaiduMap.setTrafficEnabled(true);
  20.     ib_traffic.setBackgroundResource(R.drawable.ontraffic);
  21.     showInfo("开启实时交通图");
  22. }
  23. break;
复制代码

三、定位自己

定位自己的思路是:当程序启动的时候,开启定位图层,开始定位,收到位置信息后将自己的位置显示在地图中间,当地图离开自己的位置时,点击定位自己的图标将地图重新显示自己的位置。

首先,开启定位图层,开始定位。

  1. @Override
  2. protected void onStart() {
  3.     super.onStart();
  4.     //开启定位
  5.     mBaiduMap.setMyLocationEnabled(true);
  6.     if(!mLocationClient.isStarted()){//如果定位client没有开启,开启定位
  7.         mLocationClient.start();
  8.     }
  9. }
  10. private void initLocation() {
  11.     //定位客户端的设置
  12.     mLocationClient = new LocationClient(this);
  13.     mLocationListener = new MyLocationListener();
  14.     //注册监听
  15.     mLocationClient.registerLocationListener(mLocationListener);
  16.     //配置定位
  17.     LocationClientOption option = new LocationClientOption();
  18.     option.setCoorType("bd09ll");//坐标类型
  19.     option.setIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要
  20.     option.setOpenGps(true);//打开Gps
  21.     option.setScanSpan(1000);//1000毫秒定位一次
  22.     option.setIsNeedLocationPoiList(true);//可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到
  23.     mLocationClient.setLocOption(option);
  24. }
  25. //自定义的定位监听
  26. private class MyLocationListener implements BDLocationListener{
  27.     @Override
  28.     public void onReceiveLocation(BDLocation location) {
  29.         //将获取的location信息给百度map
  30.         MyLocationData data = new MyLocationData.Builder()  
  31.                 .accuracy(location.getRadius())  
  32.                 // 此处设置开发者获取到的方向信息,顺时针0-360  
  33.                 .direction(100)
  34.                 .latitude(location.getLatitude())  
  35.                 .longitude(location.getLongitude())
  36.                 .build();
  37.         mBaiduMap.setMyLocationData(data);
  38.         if(isFirstLocation){
  39.             //获取经纬度
  40.             LatLng ll = new LatLng(location.getLatitude(),location.getLongitude());
  41.             MapStatusUpdate status = MapStatusUpdateFactory.newLatLng(ll);
  42.             //mBaiduMap.setMapStatus(status);//直接到中间
  43.             mBaiduMap.animateMapStatus(status);//动画的方式到中间
  44.             isFirstLocation = false;
  45.             showInfo("位置:" + location.getAddrStr());
  46.         }
  47.     }
  48. }
复制代码

注意,设置isFirstLocation=true,这样我们就只是开始的时候定位自己,并显示在地图中间,不会每一秒都跳一次。在我门需要定位的时候,将isFirstLocation重新设置成true就行。

  1. case R.id.ib_loc:
  2.     isFirstLocation = true;
  3.     showInfo("返回自己位置");
  4.     break;
复制代码

不要忘记在活动结束的时候,将定位取消

  1. @Override
  2. protected void onStop() {
  3.     super.onStop();
  4.     //关闭定位
  5.     mBaiduMap.setMyLocationEnabled(false);
  6.     if(mLocationClient.isStarted()){
  7.         mLocationClient.stop();
  8.     }
  9. }
复制代码

然后运行程序,发现一个带有定位功能,并能部分控制地图显示的app出来了,下面是MainActivity的源码

  1. package 包名;
  2. import com.baidu.location.BDLocation;
  3. import com.baidu.location.BDLocationListener;
  4. import com.baidu.location.LocationClient;
  5. import com.baidu.location.LocationClientOption;
  6. import com.baidu.mapapi.SDKInitializer;
  7. import com.baidu.mapapi.map.BaiduMap;
  8. import com.baidu.mapapi.map.BaiduMap.OnMapStatusChangeListener;
  9. import com.baidu.mapapi.map.MapStatus;
  10. import com.baidu.mapapi.map.MapStatusUpdate;
  11. import com.baidu.mapapi.map.MapStatusUpdateFactory;
  12. import com.baidu.mapapi.map.MapView;
  13. import com.baidu.mapapi.map.MyLocationData;
  14. import com.baidu.mapapi.model.LatLng;
  15. import android.app.Activity;
  16. import android.os.Bundle;
  17. import android.view.View;
  18. import android.view.View.OnClickListener;
  19. import android.widget.ImageButton;
  20. import android.widget.Toast;
  21. /**
  22. * 我的百度地图首页
  23. * @author jing__jie
  24. *
  25. */
  26. public class MainActivity extends Activity implements OnClickListener {
  27.     private MapView mMapView = null;
  28.     private BaiduMap mBaiduMap;
  29.     private ImageButton ib_large,ib_small,ib_mode,ib_loc,ib_traffic;
  30.     //模式切换,正常模式
  31.     private boolean modeFlag = true;
  32.     //当前地图缩放级别
  33.     private float zoomLevel;
  34.     //定位相关
  35.     private LocationClient mLocationClient;
  36.     private MyLocationListener mLocationListener;
  37.     //是否第一次定位,如果是第一次定位的话要将自己的位置显示在地图 中间
  38.     private boolean isFirstLocation = true;
  39.     @Override
  40.     protected void onCreate(Bundle savedInstanceState) {
  41.         super.onCreate(savedInstanceState);
  42.         //在使用SDK各组件之前初始化context信息,传入ApplicationContext  
  43.         //注意该方法要再setContentView方法之前实现  
  44.         SDKInitializer.initialize(getApplicationContext());  
  45.         setContentView(R.layout.activity_main);  
  46.         //初始化控件
  47.         initView();
  48.         //初始化地图
  49.         initMap();
  50.         //定位
  51.         initLocation();
  52.     }  
  53.     private void initMap() {
  54.         //获取地图控件引用  
  55.         mMapView = (MapView) findViewById(R.id.bmapView);
  56.         // 不显示缩放比例尺
  57.         mMapView.showZoomControls(false);
  58.         // 不显示百度地图Logo
  59.         mMapView.removeViewAt(1);
  60.         //百度地图
  61.         mBaiduMap = mMapView.getMap();
  62.         // 改变地图状态
  63.         MapStatus mMapStatus = new MapStatus.Builder().zoom(15).build();
  64.         MapStatusUpdate mMapStatusUpdate = MapStatusUpdateFactory.newMapStatus(mMapStatus);
  65.         mBaiduMap.setMapStatus(mMapStatusUpdate);
  66.         //设置地图状态改变监听器
  67.         mBaiduMap.setOnMapStatusChangeListener(new OnMapStatusChangeListener() {
  68.             @Override
  69.             public void onMapStatusChangeStart(MapStatus arg0) {
  70.             }
  71.             @Override
  72.             public void onMapStatusChangeFinish(MapStatus arg0) {
  73.             }
  74.             @Override
  75.             public void onMapStatusChange(MapStatus arg0) {
  76.                 //当地图状态改变的时候,获取放大级别
  77.                 zoomLevel = arg0.zoom;
  78.             }
  79.         });
  80.     }
  81.     private void initLocation() {
  82.         //定位客户端的设置
  83.         mLocationClient = new LocationClient(this);
  84.         mLocationListener = new MyLocationListener();
  85.         //注册监听
  86.         mLocationClient.registerLocationListener(mLocationListener);
  87.         //配置定位
  88.         LocationClientOption option = new LocationClientOption();
  89.         option.setCoorType("bd09ll");//坐标类型
  90.         option.setIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要
  91.         option.setOpenGps(true);//打开Gps
  92.         option.setScanSpan(1000);//1000毫秒定位一次
  93.         option.setIsNeedLocationPoiList(true);//可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到
  94.         mLocationClient.setLocOption(option);
  95.     }
  96.     private void initView() {
  97.         //地图控制按钮
  98.         ib_large = (ImageButton)findViewById(R.id.ib_large);
  99.         ib_large.setOnClickListener(this);
  100.         ib_small = (ImageButton)findViewById(R.id.ib_small);
  101.         ib_small.setOnClickListener(this);
  102.         ib_mode = (ImageButton)findViewById(R.id.ib_mode);
  103.         ib_mode.setOnClickListener(this);
  104.         ib_loc = (ImageButton)findViewById(R.id.ib_loc);
  105.         ib_loc.setOnClickListener(this);
  106.         ib_traffic = (ImageButton)findViewById(R.id.ib_traffic);
  107.         ib_traffic.setOnClickListener(this);
  108.     }
  109.     @Override
  110.     public void onClick(View v) {
  111.         switch (v.getId()) {
  112.         case R.id.ib_large:
  113.             if (zoomLevel < 18) {
  114.                 mBaiduMap.setMapStatus(MapStatusUpdateFactory.zoomIn());
  115.                 ib_small.setEnabled(true);
  116.             } else {
  117.                 showInfo("已经放至最大,可继续滑动操作");
  118.                 ib_large.setEnabled(false);
  119.             }
  120.             break;
  121.         case R.id.ib_small:
  122.             if (zoomLevel > 6) {
  123.                 mBaiduMap.setMapStatus(MapStatusUpdateFactory.zoomOut());
  124.                 ib_large.setEnabled(true);
  125.             } else {
  126.                 ib_small.setEnabled(false);
  127.                 showInfo("已经缩至最小,可继续滑动操作");
  128.             }
  129.             break;
  130.         case R.id.ib_mode://卫星模式和普通模式
  131.             if(modeFlag){
  132.                 modeFlag = false;
  133.                 mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
  134.                 showInfo("开启卫星模式");
  135.             }else{
  136.                 modeFlag = true;
  137.                 mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
  138.                 showInfo("开启普通模式");
  139.             }
  140.             break;
  141.         case R.id.ib_loc:
  142.             isFirstLocation = true;
  143.             showInfo("返回自己位置");
  144.             break;
  145.         case R.id.ib_traffic://是否开启交通图
  146.             if(mBaiduMap.isTrafficEnabled()){
  147.                 mBaiduMap.setTrafficEnabled(false);
  148.                 ib_traffic.setBackgroundResource(R.drawable.offtraffic);
  149.                 showInfo("关闭实时交通图");
  150.             }else{
  151.                 mBaiduMap.setTrafficEnabled(true);
  152.                 ib_traffic.setBackgroundResource(R.drawable.ontraffic);
  153.                 showInfo("开启实时交通图");
  154.             }
  155.             break;
  156.         default:
  157.             break;
  158.         }
  159.     }  
  160.     @Override
  161.     protected void onStart() {
  162.         super.onStart();
  163.         //开启定位
  164.         mBaiduMap.setMyLocationEnabled(true);
  165.         if(!mLocationClient.isStarted()){
  166.             mLocationClient.start();
  167.         }
  168.     }
  169.     @Override
  170.     protected void onStop() {
  171.         super.onStop();
  172.         //关闭定位
  173.         mBaiduMap.setMyLocationEnabled(false);
  174.         if(mLocationClient.isStarted()){
  175.             mLocationClient.stop();
  176.         }
  177.     }
  178.     @Override  
  179.     protected void onDestroy() {  
  180.         super.onDestroy();  
  181.         //在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理  
  182.         mMapView.onDestroy();  
  183.     }  
  184.     @Override  
  185.     protected void onResume() {  
  186.         super.onResume();  
  187.         //在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理  
  188.         mMapView.onResume();  
  189.     }  
  190.     @Override  
  191.     protected void onPause() {  
  192.         super.onPause();  
  193.         //在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理  
  194.         mMapView.onPause();  
  195.     }
  196.     //显示消息
  197.     private void showInfo(String str){
  198.         Toast.makeText(MainActivity.this, str, Toast.LENGTH_SHORT).show();
  199.     }
  200.     //自定义的定位监听
  201.     private class MyLocationListener implements BDLocationListener{
  202.         @Override
  203.         public void onReceiveLocation(BDLocation location) {
  204.             //将获取的location信息给百度map
  205.             MyLocationData data = new MyLocationData.Builder()  
  206.                     .accuracy(location.getRadius())  
  207.                     // 此处设置开发者获取到的方向信息,顺时针0-360  
  208.                     .direction(100)
  209.                     .latitude(location.getLatitude())  
  210.                     .longitude(location.getLongitude())
  211.                     .build();
  212.             mBaiduMap.setMyLocationData(data);
  213.             if(isFirstLocation){
  214.                 //获取经纬度
  215.                 LatLng ll = new LatLng(location.getLatitude(),location.getLongitude());
  216.                 MapStatusUpdate status = MapStatusUpdateFactory.newLatLng(ll);
  217.                 //mBaiduMap.setMapStatus(status);//直接到中间
  218.                 mBaiduMap.animateMapStatus(status);//动画的方式到中间
  219.                 isFirstLocation = false;
  220.                 showInfo("位置:" + location.getAddrStr());
  221.             }
  222.         }
  223.     }
  224. }
复制代码

最后寄语,转载请注明出处,代码还要自敲,不要图快,一位的复制粘贴。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

精华推荐
  • 一个人开始废掉的3种迹象

    一个人开始废掉的3种迹象

  • 从零到60秒的惬意冰镇啤酒

    从零到60秒的惬意冰镇啤酒

  • 马云、马化腾、王石都弃之不用的人,有一个共同点

    马云、马化腾、王石都弃之不用的人,有一个

  • 哥特式高迪凳子

    哥特式高迪凳子

  • 千亿小米,雷军逆袭

    千亿小米,雷军逆袭

  • 她一战赚了几十亿,她说:世界上最好的生意有三种

    她一战赚了几十亿,她说:世界上最好的生意有

  • 雷军:合伙人比制度更重要!

    雷军:合伙人比制度更重要!

  • 一个美美的令人喜欢的自行车铃

    一个美美的令人喜欢的自行车铃

QQ客服热线
QQ:1090281100 周一至周日:09:00 - 21:00
WeChat:dianlingkeji
Email:kaixin1069@vip.qq.com

优定义logo

勿要吝啬你无形资产,请为创新续源,知识、点子、灵感、经验、需求等均是创新源泉,你不经意的一句话将是另一个人的灵感。明天的明天,还有明天,我们应该把握今天,每一个今天,都有一个新的事物在出现,今天的漠视明天的落后,不浪费每一个学习的时刻,学习助力非凡。

技术支持 Discuz! X3.4 - 3.5 beta © 2001-2018 Comsenz Inc.

小黑屋|手机版|优定义 ( 粤ICP备16085288号-2 )|申请友链|网站地图

粤公网安备 44011102001144 号 GMT+8, 2018-12-13 13:11 , Processed in 0.103416 second(s), 29 queries .

快速回复 返回顶部 返回列表