0

0

【Android】第3章(25)示例24--OpenGL绘制功能

php中文网

php中文网

发布时间:2016-07-06 13:30:31

|

1616人浏览过

|

来源于php中文网

原创

分类:c#、android、vs2015、百度地图应用; 创建日期:2016-02-04 一、简介 百度地图SDK为广大开发者开放了OpenGL绘制接口,帮助开发者在地图上实现更灵活的样式绘制,丰富地图使用效果体验。 二、运行截图 简介:介绍如何使用OpenGL在地图上实现自定义绘制

分类:c#、android、vs2015、百度地图应用; 创建日期: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
{
    /// 
    /// 此demo用来展示如何在地图绘制的每帧中再额外绘制一些用户自己的内容
    /// 
    [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 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(Resource.Id.bmapView);
            mBaiduMap = mMapView.Map;
            latLngPolygon = new List()
            {
                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);
        }

        /// 
        /// 使用opengl坐标绘制
        /// 
        /// 
        /// 
        /// 
        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】下面的注释。

运行观察效果。


相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

2

2026.01.31

go语言 math包
go语言 math包

本专题整合了go语言math包相关内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

go语言输入函数
go语言输入函数

本专题整合了go语言输入相关教程内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

golang 循环遍历
golang 循环遍历

本专题整合了golang循环遍历相关教程,阅读专题下面的文章了解更多详细内容。

0

2026.01.31

Golang人工智能合集
Golang人工智能合集

本专题整合了Golang人工智能相关内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

76

2026.01.31

高干文在线阅读网站大全
高干文在线阅读网站大全

汇集热门1v1高干文免费阅读资源,涵盖都市言情、京味大院、军旅高干等经典题材,情节紧凑、人物鲜明。阅读专题下面的文章了解更多详细内容。

73

2026.01.31

无需付费的漫画app大全
无需付费的漫画app大全

想找真正免费又无套路的漫画App?本合集精选多款永久免费、资源丰富、无广告干扰的优质漫画应用,涵盖国漫、日漫、韩漫及经典老番,满足各类阅读需求。阅读专题下面的文章了解更多详细内容。

67

2026.01.31

漫画免费在线观看地址大全
漫画免费在线观看地址大全

想找免费又资源丰富的漫画网站?本合集精选2025-2026年热门平台,涵盖国漫、日漫、韩漫等多类型作品,支持高清流畅阅读与离线缓存。阅读专题下面的文章了解更多详细内容。

19

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Excel 教程
Excel 教程

共162课时 | 14.7万人学习

Java 教程
Java 教程

共578课时 | 54.2万人学习

Uniapp从零开始实现新闻资讯应用
Uniapp从零开始实现新闻资讯应用

共64课时 | 6.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号