分类:C#、Android、VS2015、百度地图应用; 创建日期:2016-02-04

一、简介

百度地图SDK为广大开发者开放了OpenGL绘制接口,帮助开发者在地图上实现更灵活的样式绘制,丰富地图使用效果体验。

二、运行截图

简介:介绍如何使用OpenGL在地图上实现自定义绘制。

详述:

(1)利用OpenGL绘制基本折线;

(2)利用OpenGL在地图上进行纹理绘制;

本示例运行截图如下:

三、设计步骤

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.TextureMapViewandroid: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】下面的注释。

运行观察效果。

【Android】3.24 示例24--OpenGL绘制功能相关推荐

  1. BaiduMap---百度地图官方Demo之OpenGL绘制功能(介绍如何使用OpenGL绘制在地图中进行绘制)

    <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android=&q ...

  2. Android开发笔记(一百五十三)OpenGL绘制三维图形的流程

    从这篇文章开始,接下来会连载一系列的OpenGL相关博文,好好探讨如何在Android中进行OpenGL开发. OpenGL的全称是"Open Graphics Library", ...

  3. android绘制过程3d图形,Android开发之OpenGL绘制三维图形的流程

    从这篇文章开始,接下来会连载一系列的OpenGL相关博文,好好探讨如何在Android中进行OpenGL开发. OpenGL的全称是"Open Graphics Library", ...

  4. android版本兼容API24,Android 7.0 (API 24) 适配

    Android 7.0 (API 24) 适配 电池和内存 低电耗模式 此项新增的行为不会影响有关使您的应用适应Android 6.0(API级别23)中所推出的旧版本低电耗模式的建议和最佳做法,如对 ...

  5. 北电PBX资料_LD 24 進線直撥功能設定

    LD 24 進線直撥功能設定 程式提示 輸入指令符號 說 明 備 註 REQ NEW 新建 CHG 修改 OUT 刪除 END 結束 PRT 查看 TYPE DIS DISA CUST 0 第 0 客 ...

  6. android仿微信语音聊天功能,Android仿微信发送语音消息的功能及示例代码

    微信的发送语音是有一个向上取消的,我们使用ontouchlistener来监听手势,然后做出相应的操作就行了. 直接上代码: //语音操作对象 private mediaplayer mplayer ...

  7. make[1]: *** /home/kernel/msm: No such file or directory. Stop android 编译 make: *** [Makefile:24: __

    1:报错: make[1]: *** /home/kernel/msm: No such file or directory. Stop android 编译 make: *** [Makefile: ...

  8. 【Android 教程系列第 24 篇】在 Android Studio 中清理缓存的两种方式

    这是[Android 教程系列第 24 篇],如果觉得有用的话,欢迎关注专栏. 一:问题描述 昨天的安卓项目还好好的,今天早上打开的时候说我引入 R 文件还有其它的类出现了错误,然后点击任意一个类几乎 ...

  9. android编程绘图,Android编程绘图操作之弧形绘制方法示例

    本文实例讲述了Android编程绘图操作之弧形绘制方法.分享给大家供大家参考,具体如下: /** * 绘制弧形图案 * @description: * @author ldm * @date 2016 ...

最新文章

  1. 妙用postman系列——postman建组、分享
  2. Ninject + UnitTesting + Moq
  3. 算法的复杂度与Master定理
  4. cuda 9.0 安装torch 0.4_PyTorch geometric 安装中libcusparse.so.10 error的解决策略
  5. Happens-Before的7个规则
  6. 修复删除/var/lib/dpkg目录后,无法使用apt-get命令问题
  7. kickStart脚本
  8. Win11语音助手怎么开启 Win11语音助手开启的方法
  9. CIO必看:7个常见但一定要避免的数据治理错误
  10. 存算分离架构的高斯Redis,用强一致提供可靠保障
  11. 5G 套餐最快本月开售;谷歌被指骗取人脸数据;Calibre 4.0 发布 | 极客头条
  12. 命名 —— 函数、类的命名
  13. VM Depot 镜像新增系列III – 社交媒体,内容管理 与 项目协同系统
  14. 69-Python的匿名函数1
  15. 程序员代码面试指南——笔记1
  16. 神经网络入门-感知器算法
  17. 木马免杀实践-golang
  18. Android入门之——百度地图开发(二)定位当前位置
  19. vuex报错TypeError: sub is not a function
  20. OpenCV开发笔记(四十九):红胖子8分钟带你深入了解轮廓识别(图文并茂+浅显易懂+程序源码)

热门文章

  1. 打破AI算力瓶颈,华为升级“智能计算”重塑IT行业
  2. 英伟达CUDA 10终于开放下载了
  3. 像人一样脑补世界!DeepMind历时一年半搞出GQN,登上Science
  4. 又是AI+IoT!谷歌试图收购物联网公司Xively
  5. 配置机器学习训练环境太麻烦?开源工具Parris说一键就搞定
  6. 不止音箱,百度还发布了这些AI产品,还有参会者的10个小建议
  7. 团队阅读之——Google’s Hybrid Approach to Research
  8. 纯css 无视宽高设置垂直水平居中
  9. 将 Exchange 2003 移动到新计算机并保持相同的服务器名
  10. SQL 2005 字段备注获取