第3章(第13講) 路徑規劃功能

来源:http://www.cnblogs.com/rainmj/archive/2016/02/04/5181595.html
-Advertisement-
Play Games

分類:C#、Android、百度地圖應用; 日期:2016-02-04 一、簡介 線路規劃支持以下功能: 公交信息查詢:可對公交詳細信息進行查詢; 公交換乘查詢:根據起、終點,查詢策略,進行線路規劃方案; 駕車線路規劃:提供不同策略,規劃駕車路線;(支持設置途經點) 步行路徑檢索:支持步行路徑的規劃...


分類:C#、Android、百度地圖應用; 日期:2016-02-04

一、簡介

線路規劃支持以下功能:

  • 公交信息查詢:可對公交詳細信息進行查詢;
  • 公交換乘查詢:根據起、終點,查詢策略,進行線路規劃方案;
  • 駕車線路規劃:提供不同策略,規劃駕車路線;(支持設置途經點)
  • 步行路徑檢索:支持步行路徑的規劃。

其中駕車線路規劃自v3.4.0版本起支持多線路檢索結果的能力。

二、運行截圖

簡介:介紹公交、駕車和步行三種線路規劃方法和自設路線方法。

詳述:

(1)駕車查詢新增路徑點查詢功能,具體使用方法詳見開發者指南路徑規劃部分,只需重載介面;

(2)自設路線功能演示開發者如何自己設定一條路線,包括如何設定起點、終點、途徑站點和路段;

(3)自設路線功能同時也介紹如何在兩個Activity之間切換的時候管理Mapview的生命周期;

(4)可自定義路線的起終點圖標;

本示例運行截圖如下:

image

三、設計步驟

1、添加自定義類【代碼太多,就不再粘貼在這裡了】

本示例用到的文件很多,主要涉及的是自定義覆蓋物的相關類,這些文件都在SrcOverlayUtil文件夾下,除了上一節列出的OverlayManager.cs文件和PoiOverlay.cs外,還包括下麵的文件。

(1)BikingRouteOverlay.cs文件

用於顯示騎行路線的Overlay,自3.4.0版本起可實例化多個添加在地圖中顯示。

(2)BusLineOverlay.cs文件

用於顯示一條公交詳情結果的Overlay。

(3)DrivingRouteOverlay.cs文件

用於顯示一條駕車路線的overlay,自3.4.0版本起可實例化多個添加在地圖中顯示,當數據中包含路況數據時,則預設使用路況紋理分段繪製。

(4)TransitRouteOverlay.cs文件

用於顯示換乘路線的Overlay,自3.4.0版本起可實例化多個添加在地圖中顯示。

(5)WalkingRouteOverlay.cs文件

用於顯示步行路線的overlay,自3.4.0版本起可實例化多個添加在地圖中顯示。

2、添加demo13_routeplan.xml文件

在layout文件夾下添加該文件,然後將代碼改為下麵的內容:

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

    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >
        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="起點:" />
        <EditText
            android:id="@+id/start"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:ems="10"
            android:text="龍澤" >
            <requestFocus />
        </EditText>
    </LinearLayout>

    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >
        <TextView
            android:id="@+id/textView2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="終點:" />
        <EditText
            android:id="@+id/end"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:ems="10"
            android:text="西單" >
            <requestFocus />
        </EditText>
    </LinearLayout>

    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="5dip"
        android:layout_marginTop="5dip"
        android:orientation="horizontal" >
        <Button
            android:id="@+id/drive"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_marginLeft="2dip"
            android:layout_marginRight="2dip"
            android:layout_weight="1.0"
            android:background="@drawable/button_style"
            android:text="駕車搜索" />
        <Button
            android:id="@+id/transit"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_marginLeft="2dip"
            android:layout_marginRight="2dip"
            android:layout_weight="1.0"
            android:background="@drawable/button_style"
            android:text="公交搜索" />
        <Button
            android:id="@+id/walk"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_marginLeft="2dip"
            android:layout_marginRight="2dip"
            android:layout_weight="1.0"
            android:background="@drawable/button_style"
            android:text="步行搜索" />
        <Button
            android:id="@+id/bike"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_marginLeft="2dip"
            android:layout_marginRight="2dip"
            android:layout_weight="1.0"
            android:background="@drawable/button_style"
            android:text="騎行搜索" />
    </LinearLayout>

    <RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

       <com.baidu.mapapi.map.TextureMapView
            android:id="@+id/map"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:clickable="true" />

       <LinearLayout
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_alignParentTop="true"
            android:layout_alignWithParentIfMissing="false"
            android:layout_marginRight="10dp"
            android:layout_marginTop="10dip"
            android:orientation="vertical" >
            <Button
                android:id="@+id/customicon"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:layout_marginTop="10dip"
                android:layout_weight="1.0"
                android:background="@drawable/button_style"
                android:text="自定義起終點圖標" />
        </LinearLayout>

        <LinearLayout
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_alignWithParentIfMissing="false"
            android:layout_centerHorizontal="true"
            android:layout_centerVertical="false"
            android:layout_marginBottom="10dip" >

            <Button
                android:id="@+id/pre"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:layout_marginLeft="2dip"
                android:layout_marginRight="2dip"
                android:layout_weight="1.0"
                android:background="@drawable/pre_" />

            <Button
                android:id="@+id/next"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:layout_marginLeft="2dip"
                android:layout_marginRight="2dip"
                android:layout_weight="1.0"
                android:background="@drawable/next_" />
        </LinearLayout>
    </RelativeLayout>

</LinearLayout>

3、添加Demo13RoutePlan.cs文件

在SrcSdkDemos文件夾下添加該文件,然後將代碼改為下麵的內容:

using Android.App;
using Android.Content.PM;
using Android.OS;
using Android.Views;
using Android.Widget;
using Com.Baidu.Mapapi.Map;
using Com.Baidu.Mapapi.Model;
using Com.Baidu.Mapapi.Search.Core;
using Com.Baidu.Mapapi.Search.Route;
using BdMapV371Demos.SrcOverlayUtil;

namespace BdMapV371Demos.SrcSdkDemos
{
    /// <summary>
    ///此demo用來展示如何進行駕車、步行、公交路線搜索併在地圖使用RouteOverlay、TransitOverlay繪製,
    ///同時展示如何進行節點瀏覽並彈出泡泡。
    /// </summary>
    [Activity(Label = "@string/demo_name_route",
        ConfigurationChanges = ConfigChanges.Orientation | ConfigChanges.KeyboardHidden,
        ScreenOrientation = ScreenOrientation.Sensor)]
    public class Demo13RoutePlan : Activity
    {
        //瀏覽路線節點相關
        Button btnPre = null;//上一個節點
        Button btnNext = null;//下一個節點
        int nodeIndex = -2;//節點索引,供瀏覽節點時使用
        RouteLine route = null;
        OverlayManager routeOverlay = null;
        bool useDefaultIcon = false;
        private TextView popupText = null;//泡泡view

        //地圖相關,使用MyRouteMapView目的是重寫touch事件實現泡泡處理。
        //如果不處理touch事件,則無需繼承,直接使用TextureMapView即可。
        TextureMapView mMapView = null;   // 地圖View
        BaiduMap mBaidumap = null;
        //搜索相關
        RoutePlanSearch mSearch = null;    // 搜索模塊,也可去掉地圖模塊獨立使用

        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            SetContentView(Resource.Layout.demo13_routeplan);

            //初始化地圖
            mMapView = FindViewById<TextureMapView>(Resource.Id.map);
            mBaidumap = mMapView.Map;

            btnPre = FindViewById<Button>(Resource.Id.pre);
            btnNext = FindViewById<Button>(Resource.Id.next);
            btnPre.Visibility = ViewStates.Invisible;
            btnNext.Visibility = ViewStates.Invisible;

            //處理地圖點擊事件
            mBaidumap.MapClick += (s, e) =>
            {
                //LatLng point = e.P0;
                //Toast.MakeText(this, point.ToString(), ToastLength.Long).Show();
                mBaidumap.HideInfoWindow();
            };

            //--begin--初始化搜索模塊,註冊處理事件
            mSearch = RoutePlanSearch.NewInstance();
            //處理駕車搜索結果
            mSearch.GetDrivingRouteResult += (s, e) =>
            {
                var result = e.P0;
                if (result == null || result.Error != SearchResult.ERRORNO.NoError)
                {
                    Toast.MakeText(this, "抱歉,未找到結果", ToastLength.Short).Show();
                }
                if (result.Error == SearchResult.ERRORNO.AmbiguousRoureAddr)
                {
                    //起終點或途經點地址有岐義,通過result.SuggestAddrInfo屬性獲取建議查詢信息
                    //......
                    return;
                }
                if (result.Error == SearchResult.ERRORNO.NoError)
                {
                    nodeIndex = -1;
                    btnPre.Visibility = ViewStates.Visible;
                    btnNext.Visibility = ViewStates.Visible;
                    route = result.RouteLines[0];
                    DrivingRouteOverlay overlay = new MyDrivingRouteOverlay(this, mBaidumap);
                    routeOverlay = overlay;
                    mBaidumap.MarkerClick += (sender, args) =>
                    {
                        //......
                    };
                    overlay.SetData(result.RouteLines[0]);
                    overlay.AddToMap();
                    overlay.ZoomToSpan();
                }
            };
            //處理公交搜索結果
            mSearch.GetTransitRouteResult += (s,e) =>
            {
                var result = e.P0;
                if (result == null || result.Error != SearchResult.ERRORNO.NoError)
                {
                    Toast.MakeText(this, "抱歉,未找到結果", ToastLength.Short).Show();
                }
                if (result.Error == SearchResult.ERRORNO.AmbiguousRoureAddr)
                {
                    //起終點或途經點地址有岐義,通過以下介面獲取建議查詢信息
                    //result.getSuggestAddrInfo()
                    return;
                }
                if (result.Error == SearchResult.ERRORNO.NoError)
                {
                    nodeIndex = -1;
                    btnPre.Visibility = ViewStates.Visible;
                    btnNext.Visibility = ViewStates.Visible;
                    route = result.RouteLines[0];
                    TransitRouteOverlay overlay = new MyTransitRouteOverlay(this, mBaidumap);
                    mBaidumap.MarkerClick += (sender, args) =>
                    {
                        //......
                    };
                    routeOverlay = overlay;
                    overlay.SetData(result.RouteLines[0]);
                    overlay.AddToMap();
                    overlay.ZoomToSpan();
                }
            };
            //處理步行搜索結果
            mSearch.GetWalkingRouteResult += (s, e) =>
            {
                var result = e.P0;
                if (result == null || result.Error != SearchResult.ERRORNO.NoError)
                {
                    Toast.MakeText(this, "抱歉,未找到結果", ToastLength.Short).Show();
                }
                if (result.Error == SearchResult.ERRORNO.AmbiguousRoureAddr)
                {
                    //起終點或途經點地址有岐義,通過以下介面獲取建議查詢信息
                    //result.getSuggestAddrInfo()
                    return;
                }
                if (result.Error == SearchResult.ERRORNO.NoError)
                {
                    nodeIndex = -1;
                    btnPre.Visibility = ViewStates.Visible;
                    btnNext.Visibility = ViewStates.Visible;
                    route = result.RouteLines[0];
                    WalkingRouteOverlay overlay = new MyWalkingRouteOverlay(this, mBaidumap);
                    mBaidumap.MarkerClick += (sender, args) =>
                    {
                        //......
                    };
                    routeOverlay = overlay;
                    overlay.SetData(result.RouteLines[0]);
                    overlay.AddToMap();
                    overlay.ZoomToSpan();
                }
            };
            //處理騎行搜索結果
            mSearch.GetBikingRouteResult += (s, e) =>
            {
                var result = e.P0;
                if (result == null || result.Error != SearchResult.ERRORNO.NoError)
                {
                    Toast.MakeText(this, "抱歉,未找到結果", ToastLength.Short).Show();
                }
                if (result.Error == SearchResult.ERRORNO.AmbiguousRoureAddr)
                {
                    // 如果起終點或途經點地址有岐義,可通過result.SuggestAddrInfo屬性獲取建議查詢信息
                    //......
                    return;
                }
                if (result.Error == SearchResult.ERRORNO.NoError)
                {
                    nodeIndex = -1;
                    btnPre.Visibility = ViewStates.Visible;
                    btnNext.Visibility = ViewStates.Visible;
                    route = result.RouteLines[0];
                    BikingRouteOverlay overlay = new MyBikingRouteOverlay(this, mBaidumap);
                    routeOverlay = overlay;
                    mBaidumap.MarkerClick += (sender, args) =>
                    {
                        //......
                    };
                    overlay.SetData(result.RouteLines[0]);
                    overlay.AddToMap();
                    overlay.ZoomToSpan();
                }
            };
            //--end--初始化搜索模塊,註冊監聽事件

            //處理【駕車搜素】按鈕點擊事件
            var btnDrive = FindViewById<Button>(Resource.Id.drive);
            btnDrive.Click += delegate
            {
                SearchButtonProcess(Resource.Id.drive);
            };

            //處理【公交搜素】按鈕點擊事件
            var btnTransit = FindViewById<Button>(Resource.Id.transit);
            btnTransit.Click += delegate
            {
                SearchButtonProcess(Resource.Id.transit);
            };

            //處理【步行搜素】按鈕點擊事件
            var btnWalk = FindViewById<Button>(Resource.Id.walk);
            btnWalk.Click += delegate
            {
                SearchButtonProcess(Resource.Id.walk);
            };

            //處理【騎行搜素】按鈕點擊事件
            var btnBike = FindViewById<Button>(Resource.Id.bike);
            btnBike.Click += delegate
            {
                SearchButtonProcess(Resource.Id.bike);
            };

            //處理【自定義起終點圖標】按鈕點擊事件
            var btnCustomicon = FindViewById<Button>(Resource.Id.customicon);
            btnCustomicon.Click += delegate
            {
                //切換路線圖標,刷新地圖使其生效。註意:起終點圖標使用中心對齊。
                if (routeOverlay == null) return;
                if (useDefaultIcon)
                {
                    btnCustomicon.Text = "自定義起終點圖標";
                    Toast.MakeText(this,"將使用系統起終點圖標", ToastLength.Short).Show();
                }
                else
                {
                    btnCustomicon.Text = "系統起終點圖標";
                    Toast.MakeText(this, "將使用自定義起終點圖標", ToastLength.Short).Show();
                }
                useDefaultIcon = !useDefaultIcon;
                routeOverlay.RemoveFromMap();
                routeOverlay.AddToMap();
            };

            //處理節點瀏覽相關的按鈕事件
            btnPre.Click += delegate
            {
                NodeClick(Resource.Id.pre);
            };
            btnNext.Click += delegate
            {
                NodeClick(Resource.Id.next);
            };
        }

        /// <summary>
        /// 發起路線規劃搜索
        /// </summary>
        /// <param name="id">按鈕的id</param>
        public void SearchButtonProcess(int id)
        {
            //重置瀏覽節點的路線數據
            route = null;
            btnPre.Visibility = ViewStates.Invisible;
            btnNext.Visibility = ViewStates.Invisible;
            mBaidumap.Clear();
            // 處理搜索按鈕響應示例
            EditText editSt = FindViewById<EditText>(Resource.Id.start);
            EditText editEn = FindViewById<EditText>(Resource.Id.end);
            //設置起終點信息,對於tranist search 來說,城市名無意義
            PlanNode stNode = PlanNode.WithCityNameAndPlaceName("北京", editSt.Text);
            PlanNode enNode = PlanNode.WithCityNameAndPlaceName("北京", editEn.Text);

            // 實際使用中請對起點終點城市進行正確的設定
            if (id == Resource.Id.drive)
            {
                mSearch.DrivingSearch(new DrivingRoutePlanOption()
                    .From(stNode).To(enNode));
            }
            else if (id == Resource.Id.transit)
            {
                mSearch.TransitSearch(new TransitRoutePlanOption()
                    .From(stNode).City("北京").To(enNode));
            }
            else if (id == Resource.Id.walk)
            {
                mSearch.WalkingSearch(new WalkingRoutePlanOption()
                    .From(stNode).To(enNode));
            }
            else if (id == Resource.Id.bike)
            {
                mSearch.BikingSearch(new BikingRoutePlanOption()
                    .From(stNode).To(enNode));
            }
        }

        /// <summary>
        /// 節點瀏覽示例
        /// </summary>
        /// <param name="id">按鈕的id</param>
        public void NodeClick(int id)
        {
            if (nodeIndex < -1 || route == null ||
                route.AllStep == null || nodeIndex > route.AllStep.Count)
            {
                return;
            }
            //設置節點索引
            if (id == Resource.Id.next && nodeIndex < route.AllStep.Count - 1)
            {
                nodeIndex++;
            }
            else if (id == Resource.Id.pre && nodeIndex > 1)
            {
                nodeIndex--;
            }
            if (nodeIndex < 0 || nodeIndex >= route.AllStep.Count)
            {
                return;
            }

            //獲取節結果信息
            LatLng nodeLocation = null;
            string nodeTitle = null;
            var step = route.AllStep[nodeIndex];
            if (step is DrivingRouteLine.DrivingStep)
            {
                nodeLocation = ((DrivingRouteLine.DrivingStep)step).Entrance.Location;
                nodeTitle = ((DrivingRouteLine.DrivingStep)step).Instructions;
            }
            else if (step is WalkingRouteLine.WalkingStep)
            {
                nodeLocation = ((WalkingRouteLine.WalkingStep)step).Entrance.Location;
                nodeTitle = ((WalkingRouteLine.WalkingStep)step).Instructions;
            }
            else if (step is TransitRouteLine.TransitStep)
            {
                nodeLocation = ((TransitRouteLine.TransitStep)step).Entrance.Location;
                nodeTitle = ((TransitRouteLine.TransitStep)step).Instructions;
            }

            if (nodeLocation == null || nodeTitle == null)
            {
                return;
            }
            //移動節點至中心
            mBaidumap.SetMapStatus(MapStatusUpdateFactory.NewLatLng(nodeLocation));
            // Show popup
            popupText= new TextView(this);
            popupText.SetBackgroundResource(Resource.Drawable.popup);
            popupText.SetTextColor(Android.Graphics.Color.Black);
            popupText.Text = nodeTitle;
            mBaidumap.ShowInfoWindow(new InfoWindow(popupText, nodeLocation, 0));
        }

        protected override void OnRestoreInstanceState(Bundle savedInstanceState)
        {
            base.OnRestoreInstanceState(savedInstanceState);
        }

        //定製RouteOverly
        private class MyDrivingRouteOverlay : DrivingRouteOverlay
        {
            Demo13RoutePlan routePlanDemo;

            public MyDrivingRouteOverlay(Demo13RoutePlan routePlanDemo, BaiduMap baiduMap) :
                base(baiduMap)
            {
                this.routePlanDemo = routePlanDemo;
            }

            public override BitmapDescriptor GetStartMarker()
            {
                if (routePlanDemo.useDefaultIcon)
                {
                    return BitmapDescriptorFactory.FromResource(Resource.Drawable.icon_st);
                }
                return null;
            }

            public override BitmapDescriptor GetTerminalMarker()
            {
                if (routePlanDemo.useDefaultIcon)
                {
                    return BitmapDescriptorFactory.FromResource(Resource.Drawable.icon_en);
                }
                return null;
            }
        }

        private class MyWalkingRouteOverlay : WalkingRouteOverlay
        {
            Demo13RoutePlan routePlanDemo;
            public MyWalkingRouteOverlay(Demo13RoutePlan routePlanDemo, BaiduMap baiduMap) :
                base(baiduMap)
            {
                this.routePlanDemo = routePlanDemo;
            }

            public new BitmapDescriptor GetStartMarker()
            {
                if (routePlanDemo.useDefaultIcon)
                {
                    return BitmapDescriptorFactory.FromResource(Resource.Drawable.icon_st);
                }
                return null;
            }

            public new BitmapDescriptor GetTerminalMarker()
            {
                if (routePlanDemo.useDefaultIcon)
                {
                    return BitmapDescriptorFactory.FromResource(Resource.Drawable.icon_en);
                }
                return null;
            }
        }

        private class MyTransitRouteOverlay : TransitRouteOverlay
        {
            Demo13RoutePlan routePlanDemo;

            public MyTransitRouteOverlay(Demo13RoutePlan routePlanDemo, BaiduMap baiduMap) :
                base(baiduMap)
            {
                this.routePlanDemo = routePlanDemo;
            }

            public override BitmapDescriptor GetStartMarker()
            {
                if (routePlanDemo.useDefaultIcon)
                {
                    return BitmapDescriptorFactory.FromResource(Resource.Drawable.icon_st);
                }
                return null;
            }

            public override BitmapDescriptor GetTerminalMarker()
            {
                if (routePlanDemo.useDefaultIcon)
                {
                    return BitmapDescriptorFactory.FromResource(Resource.Drawable.icon_en);
                }
                return null;
            }
        }

        private class MyBikingRouteOverlay : BikingRouteOverlay
        {
            Demo13RoutePlan routePlanDemo;
            public MyBikingRouteOverlay(Demo13RoutePlan routePlanDemo, BaiduMap baiduMap) : base(baiduMap)
            {
                this.routePlanDemo = routePlanDemo;
            }

            public new BitmapDescriptor GetStartMarker()
            {
                if (routePlanDemo.useDefaultIcon)
                {
                    return BitmapDescriptorFactory.FromResource(Resource.Drawable.icon_st);
                }
                return null;
            }

            public new BitmapDescriptor GetTerminalMarker()
            {
                if (routePlanDemo.useDefaultIcon)
                {
                    return BitmapDescriptorFactory.FromResource(Resource.Drawable.icon_en);
                }
                return null;
            }
        }

        protected override void OnPause()
        {
            mMapView.OnPause();
            base.OnPause();
        }

        protected override void OnResume()
        {
            mMapView.OnResume();
            base.OnResume();
        }

        protected override void OnDestroy()
        {
            mSearch.Destroy();
            mMapView.OnDestroy();
            base.OnDestroy();
        }
    }
}

4、修改MainActivity.cs

在MainActivity.cs文件的demos欄位定義中,去掉【示例13】下麵的註釋。

運行觀察結果。

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 開發板自帶的LCD驅動是基於platform匯流排寫的,所以如果要使其它的LCD能夠在自己的開發板上跑起來,那麼就先瞭解platform驅動的架構,下麵簡單記錄下自己看platform驅動時體會,簡單的說platform是一種虛擬匯流排,那麼它也是一條匯流排,所以它分為3個部分,platform_bus,
  • 2.0自定義菜單管理 ①介面說明: 微信服務號聊天視窗下麵的菜單項(有的公眾號有啟用有的則沒有),這個可以在編輯模式簡單配置,也可以在開發模式代碼配置。微信公眾平臺開發者文檔:微信公眾號開發平臺創建自定義菜單,可以看到創建菜單的一些註意事項,下麵的使用網頁調試工具調試該介面,只是調試介面是否可以正常
  • 本篇文章提供了一個開源JavaScript庫,它提供了給AJAX應用程式中添加書簽和會退按鈕的功能。在學習完這個教程後,開發者將能夠對開發AJAX應用碰到的問題獲得一個解決方案,這個特性甚至Google Maps 和 Gmail 現在都不提供:提供一個強大的,可用的書簽和前進回退按鈕,如同其他的WE
  • 環境說明:Vistual Studio 2013 MVC 4.0 其實關於ASP.NET MVC Area使用的基礎知識可以參考 http://www.cnblogs.com/willick/p/3331519.html 這篇軟文. Global.asax 中的 Application_Start
  • 分類:C#、Android、百度地圖應用; 日期:2016-02-04 一、簡介 百度地圖SDK為廣大開發者開放了OpenGL繪製介面,幫助開發者在地圖上實現更靈活的樣式繪製,豐富地圖使用效果體驗。 二、運行截圖 簡介:介紹如何使用OpenGL在地圖上實現自定義繪製。 詳述: (1)利用OpenGL...
  • .net coreclr 已經發佈RC1版本,安裝方法如下: 1.安裝DNVM,DNVM是.net運行時管理器,負責管理所有版本的.net運行時(.net framework、.net coreclr和Mono)。 C:\coreclr-demo> @powershell -NoProfile -E
  • 分類:C#、Android、百度地圖應用; 日期:2016-02-04 百度全景圖是一種實景地圖服務。為用戶提供城市、街道和其他環境的360度全景圖像,用戶可以通過該服務獲得如臨其境的地圖瀏覽體驗。 本示例演示如何利用百度Android全景SDK v2.2實現全景圖的檢索、顯示和交互功能,以便清晰方...
  • 如果想知道 AngularJs 通過WebAPI 下載Excel。請看下文,這裡僅提供了一種方案。 伺服器端代碼如下: protected HttpResponseMessage GenereateExcelMessage(HttpRequestMessage Request, string fil
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...