分类: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.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 = -;
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 = -;
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(, , , ), vertexBuffer, , ,
drawingMapStatus);
drawTexture(gl, bitmap, drawingMapStatus);
}
}
public void calPolylinePoint(MapStatus mspStatus)
{
PointF[] polyPoints = new PointF[latLngPolygon.Count];
vertexs = new float[ * latLngPolygon.Count];
int i = ;
foreach (LatLng xy in latLngPolygon)
{
polyPoints[i] = mBaiduMap.Projection.ToOpenGLLocation(xy, mspStatus);
vertexs[i * ] = polyPoints[i].X;
vertexs[i * + ] = polyPoints[i].Y;
vertexs[i * + ] = 0.0f;
i++;
}
for (int j = ; 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 * );
bb.Order(ByteOrder.NativeOrder());
FloatBuffer fb = bb.AsFloatBuffer();
fb.Put(fs);
fb.Position();
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(, GL10.GlFloat, , lineVertexBuffer);
gl.GlColor4f(colorR, colorG, colorB, colorA);
gl.GlLineWidth(lineWidth);
gl.GlDrawArrays(GL10.GlLineStrip, , 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( * * );
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( * );
indicesBuffer.Order(ByteOrder.NativeOrder());
ShortBuffer indices = indicesBuffer.AsShortBuffer();
indices.Put(new short[] { , , , , , }); ByteBuffer textureBuffer = ByteBuffer.AllocateDirect( * * );
textureBuffer.Order(ByteOrder.NativeOrder());
FloatBuffer texture = textureBuffer.AsFloatBuffer();
texture.Put(new float[] { , 1f, 1f, 1f, 0f, 0f, 1f, 0f }); indices.Position();
vertices.Position();
texture.Position(); // 生成纹理
if (textureId == -)
{
int[] textureIds = new int[];
gl.GlGenTextures(, textureIds, );
textureId = textureIds[];
Log.Debug(LTAG, "textureId: " + textureId);
gl.GlBindTexture(GL10.GlTexture2d, textureId);
GLUtils.TexImage2D(GL10.GlTexture2d, , bitmap, );
gl.GlTexParameterf(GL10.GlTexture2d, GL10.GlTextureMinFilter, GL10.GlNearest);
gl.GlTexParameterf(GL10.GlTexture2d, GL10.GlTextureMagFilter, GL10.GlNearest);
gl.GlBindTexture(GL10.GlTexture2d, );
} 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(, GL10.GlFloat, , vertices);
gl.GlTexCoordPointer(, GL10.GlFloat, , texture);
gl.GlDrawElements(GL10.GlTriangleStrip, , 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. 【Android】3.18 示例18--自定义绘制功能

    分类:C#.Android.VS2015.百度地图应用: 创建日期:2016-02-04 简介:介绍自定义绘制点.线.多边形.圆等几何图形和文字 详述: (1)支持绘制凸多边形,如要绘制凹多边形请用三 ...

  2. Qt 学习之路 2(24):Qt 绘制系统简介

    Qt 学习之路 2(24):Qt 绘制系统简介 豆子 2012年10月30日 Qt 学习之路 2 77条评论 Qt 的绘图系统允许使用相同的 API 在屏幕和其它打印设备上进行绘制.整个绘图系统基于Q ...

  3. Skipping 'Android SDK Tools, revision 24.0.2'; it depends on 'Android SDK Platform-tools, revision 20' which was not installed.

    前几天,同事问我eclipse android sdk怎么不能更新. 更新界面是显示(mirrors.neusoft.edu.cn:80),但是不能更新. 问题描述如下: URL not found: ...

  4. OpenGl 绘制一个立方体

    OpenGl 绘制一个立方体 为了绘制六个正方形,我们为每个正方形指定四个顶点,最终我们需要指定6*4=24个顶点.但是我们知道,一个立方体其实总共只有八个顶点,要指定24次,就意味着每个顶点其实重复 ...

  5. Android端IM应用中的@人功能实现:仿微博、QQ、微信,零入侵、高可扩展

    本文由“猫爸iYao”原创分享,感谢作者. 1.引言 最近有个需求:评论@人(没错,就是IM聊天或者微博APP里的@人功能),就像下图这样:   ▲ 微信群聊界面里的@人功能    ▲ QQ群聊界面里 ...

  6. OPENGL绘制文字

    OPENGL没有提供直接绘制文字的功能,需要借助于操作系统. 用OPENGL绘制文字比较常见的方法是利用显示列表.创建一系列显示列表,每个字符对应一个列表编号.例如,'A'对应列表编号1000+'A' ...

  7. OpenGL绘制自由落体小球

    OpenGL绘制自由落体小球 一.    程序运行的软硬件环境 本次设计在window10系统下进行,运用C++进行编写,在CodeBlocks环境下使用OpenGL进行设计. 所需环境配置分为2部分 ...

  8. OpenGL绘制简单场景,实现旋转缩放平移和灯光效果

    本项目实现了用OpenGL绘制一个简单场景,包括正方体.球体和网格,实现了物体的旋转.缩放.平移和灯光效果.附有项目完整代码.有具体凝视.适合刚開始学习的人熟悉opengl使用. 开发情况 开发环境V ...

  9. Android自定义视图二:如何绘制内容

    这个系列是老外写的,干货!翻译出来一起学习.如有不妥,不吝赐教! Android自定义视图一:扩展现有的视图,添加新的XML属性 Android自定义视图二:如何绘制内容 Android自定义视图三: ...

随机推荐

  1. shapefile文件的符号化问题

    我们都知道,ArcGIS的shp文件只以坐标形式保存地图数据,地图的显示方法则是存储都数据库或地图文件(mxd)中,这一点是深信不疑的. 如果我们打开ArcMap,新建一个普通的地图文件(使用标准的模 ...

  2. ListView实现数据列表显示

    要将数据库中的数据列表显示在屏幕上,我们要使用ListView这个控件,当用户从数据库中取出数据时,要将数据绑定到显示控件上,如何绑定呢,我们需要创建适配器进行绑定,创建适配器有两种方式: 第一种是用 ...

  3. Cocos2d-x Touch事件处理机制

    在Cocos2d-x中提供两种触摸事件处理机制:CCStandardTouchDelegate和CCTargetedTouchDelegate. 一.如何使用 0.默认情况下CCLayer都是没有启动 ...

  4. PHP高级教程-Error

    PHP 错误处理 在 PHP 中,默认的错误处理很简单.一条错误消息会被发送到浏览器,这条消息带有文件名.行号以及描述错误的消息. PHP 错误处理 在创建脚本和 Web 应用程序时,错误处理是一个重 ...

  5. easyui问题小结

    http://blog.sina.com.cn/s/blog_77cb836301017lrd.html

  6. 堆叠相冊效果,兼容pc和移动端

    在手机端,堆叠效果的相冊是比較常见的一种图片展示方式,每一个人的思路可能会有一些不同,实现的方法不同. 本篇博客主要是分享下我的实现方法.欢迎大家提出建议,指出我的不足,先3Q啦~ 先看一下终于的效果 ...

  7. windows installer服务无法启动,无法打开任何msi文件

    如果不成功就在"依存关系"中找是否有其他的文件没有启用. 启用"remote procedure call(rpc)" 启用"workstation& ...

  8. 如何自定义oauthauthorizationserverprovider错误信息?

    We are using the OAuthAuthorizationServerProvider class to do authorization in our ASP.NET Web Api a ...

  9. Unix 网络编程 读书笔记3

    第四章 基本tcp 套接口编程 注意区分AF_XXX 和PF_XXX,AF代表address family, PF代表protocol family. 1 socket 函数 2 connect 函数 ...

  10. .NET 垃圾回收机制要点整理

    1. .NET资源分托管资源和非托管资源,对于托管资源,.NET GC可以很好的回收无用的垃圾,而对于非托管(例如文件访问,网络访问等)需要手动清理垃圾(显式释放). 2. 非托管资源的释放,.NET ...