第3章(第24講) 示例24-- OpenGL繪製功能

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

分類:C#、Android、百度地圖應用; 日期:2016-02-04 一、簡介 百度地圖SDK為廣大開發者開放了OpenGL繪製介面,幫助開發者在地圖上實現更靈活的樣式繪製,豐富地圖使用效果體驗。 二、運行截圖 簡介:介紹如何使用OpenGL在地圖上實現自定義繪製。 詳述: (1)利用OpenGL...


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

一、簡介

百度地圖SDK為廣大開發者開放了OpenGL繪製介面,幫助開發者在地圖上實現更靈活的樣式繪製,豐富地圖使用效果體驗。

 

二、運行截圖

簡介:介紹如何使用OpenGL在地圖上實現自定義繪製。

詳述:

(1)利用OpenGL繪製基本折線;

(2)利用OpenGL在地圖上進行紋理繪製;

本示例運行截圖如下:

image

三、設計步驟

1、添加demo24_opengl.xml文件

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

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
  <com.baidu.mapapi.map.TextureMapView
      android:id="@+id/bmapView"
      android:layout_width="match_parent"
      android:layout_height="fill_parent" />
</RelativeLayout>

2、添加Demo24OpenGL.cs文件

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

using Android.App;
using Android.OS;
using Com.Baidu.Mapapi.Map;
using Com.Baidu.Mapapi.Model;
using Android.Graphics;
using Android.Util;
using System.Collections.Generic;
using Javax.Microedition.Khronos.Opengles;
using Java.Nio;
using Android.Opengl;

namespace BdMapV371Demos.SrcSdkDemos
{
    /// <summary>
    /// 此demo用來展示如何在地圖繪製的每幀中再額外繪製一些用戶自己的內容
    /// </summary>
    [Activity(Label = "@string/demo_name_opengl")]
    public class Demo24OpenGL : Activity, BaiduMap.IOnMapDrawFrameCallback
    {
        // 地圖相關
        private TextureMapView mMapView;
        private BaiduMap mBaiduMap;
        private Bitmap bitmap;
        private LatLng latlng1 = new LatLng(39.97923, 116.357428);
        private LatLng latlng2 = new LatLng(39.94923, 116.397428);
        private LatLng latlng3 = new LatLng(39.96923, 116.437428);
        private IList<LatLng> latLngPolygon;
        private float[] vertexs;
        private FloatBuffer vertexBuffer;
        private int textureId = -1;
        private readonly string LTAG = "Demo24OpenGL";

        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            SetContentView(Resource.Layout.demo24_opengl);
            mMapView = FindViewById<TextureMapView>(Resource.Id.bmapView);
            mBaiduMap = mMapView.Map;
            latLngPolygon = new List<LatLng>()
            {
                latlng1,latlng2,latlng3
            };
            mBaiduMap.SetOnMapDrawFrameCallback(this);
            bitmap = BitmapFactory.DecodeResource(Resources,
                Resource.Drawable.ground_overlay);
        }

        protected override void OnPause()
        {
            mMapView.OnPause();
            base.OnPause();
        }
        protected override void OnResume()
        {
            mMapView.OnResume();
            textureId = -1;
            base.OnResume();
        }

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

        public void OnMapDrawFrame(IGL10 gl, MapStatus drawingMapStatus)
        {
            if (mBaiduMap.Projection != null)
            {
                calPolylinePoint(drawingMapStatus);
                drawPolyline(gl, Color.Argb(255, 255, 0, 0), vertexBuffer, 10, 3,
                        drawingMapStatus);
                drawTexture(gl, bitmap, drawingMapStatus);
            }
        }
        public void calPolylinePoint(MapStatus mspStatus)
        {
            PointF[] polyPoints = new PointF[latLngPolygon.Count];
            vertexs = new float[3 * latLngPolygon.Count];
            int i = 0;
            foreach (LatLng xy in latLngPolygon)
            {
                polyPoints[i] = mBaiduMap.Projection.ToOpenGLLocation(xy, mspStatus);
                vertexs[i * 3] = polyPoints[i].X;
                vertexs[i * 3 + 1] = polyPoints[i].Y;
                vertexs[i * 3 + 2] = 0.0f;
                i++;
            }
            for (int j = 0; j < vertexs.Length; j++)
            {
                Log.Debug(LTAG, "vertexs[" + j + "]: " + vertexs[j]);
            }
            vertexBuffer = makeFloatBuffer(vertexs);
        }

        private FloatBuffer makeFloatBuffer(float[] fs)
        {
            ByteBuffer bb = ByteBuffer.AllocateDirect(fs.Length * 4);
            bb.Order(ByteOrder.NativeOrder());
            FloatBuffer fb = bb.AsFloatBuffer();
            fb.Put(fs);
            fb.Position(0);
            return fb;
        }

        private void drawPolyline(IGL10 gl, int color, FloatBuffer lineVertexBuffer,
                float lineWidth, int pointSize, MapStatus drawingMapStatus)
        {

            gl.GlEnable(GL10.GlBlend);
            gl.GlEnableClientState(GL10.GlVertexArray);

            gl.GlBlendFunc(GL10.GlSrcAlpha, GL10.GlOneMinusSrcAlpha);

            float colorA = Color.GetAlphaComponent(color) / 255f;
            float colorR = Color.GetRedComponent(color) / 255f;
            float colorG = Color.GetGreenComponent(color) / 255f;
            float colorB = Color.GetBlueComponent(color) / 255f;

            gl.GlVertexPointer(3, GL10.GlFloat, 0, lineVertexBuffer);
            gl.GlColor4f(colorR, colorG, colorB, colorA);
            gl.GlLineWidth(lineWidth);
            gl.GlDrawArrays(GL10.GlLineStrip, 0, pointSize);

            gl.GlDisable(GL10.GlBlend);
            gl.GlDisableClientState(GL10.GlVertexArray);
        }

        /// <summary>
        /// 使用opengl坐標繪製
        /// </summary>
        /// <param name="gl"></param>
        /// <param name="bitmap"></param>
        /// <param name="drawingMapStatus"></param>
        public void drawTexture(IGL10 gl, Bitmap bitmap, MapStatus drawingMapStatus)
        {
            PointF p1 = mBaiduMap.Projection.ToOpenGLLocation(latlng2,
                    drawingMapStatus);
            PointF p2 = mBaiduMap.Projection.ToOpenGLLocation(latlng3,
                    drawingMapStatus);
            ByteBuffer byteBuffer = ByteBuffer.AllocateDirect(4 * 3 * 4);
            byteBuffer.Order(ByteOrder.NativeOrder());
            FloatBuffer vertices = byteBuffer.AsFloatBuffer();
            vertices.Put(new float[] { p1.X, p1.Y, 0.0f, p2.X, p1.Y, 0.0f, p1.X,
                p2.Y, 0.0f, p2.X, p2.Y, 0.0f });

            ByteBuffer indicesBuffer = ByteBuffer.AllocateDirect(6 * 2);
            indicesBuffer.Order(ByteOrder.NativeOrder());
            ShortBuffer indices = indicesBuffer.AsShortBuffer();
            indices.Put(new short[] { 0, 1, 2, 1, 2, 3 });

            ByteBuffer textureBuffer = ByteBuffer.AllocateDirect(4 * 2 * 4);
            textureBuffer.Order(ByteOrder.NativeOrder());
            FloatBuffer texture = textureBuffer.AsFloatBuffer();
            texture.Put(new float[] { 0, 1f, 1f, 1f, 0f, 0f, 1f, 0f });

            indices.Position(0);
            vertices.Position(0);
            texture.Position(0);

            // 生成紋理
            if (textureId == -1)
            {
                int[] textureIds = new int[1];
                gl.GlGenTextures(1, textureIds, 0);
                textureId = textureIds[0];
                Log.Debug(LTAG, "textureId: " + textureId);
                gl.GlBindTexture(GL10.GlTexture2d, textureId);
                GLUtils.TexImage2D(GL10.GlTexture2d, 0, bitmap, 0);
                gl.GlTexParameterf(GL10.GlTexture2d, GL10.GlTextureMinFilter, GL10.GlNearest);
                gl.GlTexParameterf(GL10.GlTexture2d, GL10.GlTextureMagFilter, GL10.GlNearest);
                gl.GlBindTexture(GL10.GlTexture2d, 0);
            }

            gl.GlEnable(GL10.GlTexture2d);
            gl.GlEnableClientState(GL10.GlVertexArray);
            gl.GlEnableClientState(GL10.GlTextureCoordArray);
            gl.GlEnable(GL10.GlBlend);
            gl.GlBlendFunc(GL10.GlSrcAlpha, GL10.GlOneMinusSrcAlpha);
            gl.GlColor4f(1.0f, 1.0f, 1.0f, 1.0f);

            // 綁定紋理ID
            gl.GlBindTexture(GL10.GlTexture2d, textureId);
            gl.GlVertexPointer(3, GL10.GlFloat, 0, vertices);
            gl.GlTexCoordPointer(2, GL10.GlFloat, 0, texture);
            gl.GlDrawElements(GL10.GlTriangleStrip, 6, GL10.GlUnsignedShort, indices);
            gl.GlDisable(GL10.GlTexture2d);
            gl.GlDisableClientState(GL10.GlVertexArray);
            gl.GlDisableClientState(GL10.GlTextureCoordArray);
            gl.GlDisable(GL10.GlBlend);
        }
    }
}

3、修改MainActivity.cs文件

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

運行觀察效果。

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

-Advertisement-
Play Games
更多相關文章
  • 一般Linux系統,有兩個配置文件可以設置PATH變數,一:.bashrc 二:.bash_profile; 還有一種方法可以臨時設置PATH變數(三) 一: 1、編輯.bashrc,添加 export PATH=$PATH:/home/myname/mydirectory 這是將路徑跟在已有路徑後
  • 一.概述 1.環境:我這裡是2台linux機器(host1和host2),發行版是kali2.0,內核版本是4.3。每台機器都安裝Docker、OpenvSwitch(ovs)。 2.host1和host2分別啟動1個ubuntu的docker容器。 3.網路結構: 2.1:host1的eth0:1
  • 左上角幾個管腳分別是J601和J801 J601: 第一排兩個管腳:可以使用跳線帽短接,作用是: 連接:當電源接通後就自動啟動 斷開:需要按下最上面的中間那個小按鍵3~4秒才能啟動 第二排兩個管腳: 連接:可以燒寫第一階段的啟動載入程式到emmc,必須先把usb otg連接到PC機上。 斷開:從em...
  • 1. 背景知識 在多媒體的推動下,彩色LCD越來越多地應用到嵌入式系統中,PDA和手機等大多都採用LCD作為顯示器材,因此學習LCD的應用很有實際意義! LCD工作的硬體需求:要使一塊LCD正常的顯示文字或圖像,不僅需要LCD驅動器,而且還需要相應的LCD控制器。在通常情況下,生產廠商把LCD驅動器
  • 開發板自帶的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
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...