分类: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. STL - 容器 - UnorderedSet(一)

    一些简单操作 UnorderedSetTest.cpp #include <unordered_set> #include <numeric> #include ". ...

  2. PHP高级教程-包含

    PHP 包含文件 PHP include 和 require 语句 在 PHP 中,您可以在服务器执行 PHP 文件之前在该文件中插入一个文件的内容. include 和 require 语句用于在执 ...

  3. ASP.NET MVC+Bootstrap 实现短信验证

    短信验证大家都已经非常熟悉了,基本上每天都在接触手机短信的验证码,比方某宝,某东购物.站点注冊,网上银行等等,都要验证我们的手机号码真实性.这样做有什么优点呢. 曾经咱们在做站点的时候.为了提高用户注 ...

  4. caffe 代码阅读笔记1

    首先查看caffe.cpp里的train函数: // Train / Finetune a model. //训练,微调一个网络模型 int train() { // google的glog库,检查- ...

  5. js立即执行函数应用--事件绑定

    js中立即执行函数的应用:应用到事件绑定上. 少说多做,直接运行代码(代码中有注释): <!DOCTYPE html> <html lang="zh"> & ...

  6. Oracle使用——PLSQL的中文乱码显示全是问号

    问题 这两天刚将PLSQL与Oracle配置好,但是在PLSQL中插入数据时.出现一个问题,PLSQL中的表里无法显示中文,中文无法保存.无法输出.中文在表中显示问号.如图: 原因 经过一番查证,发现 ...

  7. 关联更新SQL语句

    update F_A_Info  set level=b.level from  F_A_Info a,F_A_Info_QUAN b where a.id=b.id

  8. VC线程同步方法

    VC MFC中线程同步对象的区别 临界区 CCriticalSection,在用户模式工作,适用于保护线程间共享资源,一个线程可以多次Lock不会出错.不支持在多进程之间工作.互斥量 CM ...

  9. AsyncTask 异步任务基本使用-下载视频

    概述 android 提供了一个异步任务类AsyncTask,使创建异步任务.更新UI变得更加简单,不再需要编写任务线程和Handler实例即可完成相同的任务.本例子将演示并实现,使用AsyncTas ...

  10. Python处理JSON(转)

    参考: 概念 序列化(Serialization):将对象的状态信息转换为可以存储或可以通过网络传输的过程,传输的格式可以是JSON.XML等.反序列化就是从存储区域(JSON,XML)读取反序列化对 ...