深入学习百度地图Android SDK v4.0.0【第四关】OpenGL绘制
来源:互联网 发布:java类的加载顺序 编辑:程序博客网 时间:2024/06/14 13:23
OpenGL出现的频率越来越高了,尽管目前我没有用到,但也记录下来,方便以后扩展!这个没什么好说的,直接上代码绘制!
package cq.cake.chwl.ui;import android.app.ActivityManager;import android.content.pm.ConfigurationInfo;import android.graphics.Color;import android.graphics.PointF;import android.os.Build;import android.os.Bundle;import com.baidu.mapapi.map.BaiduMap;import com.baidu.mapapi.map.MapStatus;import com.baidu.mapapi.model.LatLng;import java.nio.ByteBuffer;import java.nio.ByteOrder;import java.nio.FloatBuffer;import java.util.ArrayList;import java.util.List;import javax.microedition.khronos.opengles.GL10;import cq.cake.base.BaseToolbarMapActivity;import cq.cake.chwl.R;import cq.cake.util.L;public class OpenGLMapActivity extends BaseToolbarMapActivity implements BaiduMap.OnMapDrawFrameCallback{ FloatBuffer vertexBuffer; private List<LatLng> latLngPolygon = new ArrayList<>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_open_glmap); init(); } private void init() { mBaiduMap.setOnMapDrawFrameCallback(this); LatLng pt1 = new LatLng(39.93923, 116.357428); LatLng pt2 = new LatLng(39.91923, 116.327428); LatLng pt3 = new LatLng(39.89923, 116.347428); LatLng pt4 = new LatLng(39.89923, 116.367428); LatLng pt5 = new LatLng(39.91923, 116.387428); latLngPolygon.add(pt1); latLngPolygon.add(pt2); latLngPolygon.add(pt3); latLngPolygon.add(pt4); latLngPolygon.add(pt5); if (canUseGL2()){ L.i("支持GL2.0渲染"); } } /** * 检查设置是否支持GL2.0 * @return */ public boolean canUseGL2(){ final ActivityManager activityManager=(ActivityManager)getSystemService(ACTIVITY_SERVICE); final ConfigurationInfo configurationInfo=activityManager.getDeviceConfigurationInfo(); boolean supportsEs2 = configurationInfo.reqGlEsVersion >= 0x2000; boolean isEmulator = Build.VERSION.SDK_INT > Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1 && (Build.FINGERPRINT.startsWith("generic") || Build.FINGERPRINT.startsWith("unknown") || Build.MODEL.contains("google_sdk") || Build.MODEL.contains("Emulator") || Build.MODEL.contains("Android SDK built for x86")); supportsEs2 = supportsEs2 || isEmulator; return supportsEs2; } // 地图绘制回调接口 定义地图绘制每一帧时 OpenGL 绘制的回调接口 BaiduMap.OnMapDrawFrameCallback callback = new BaiduMap.OnMapDrawFrameCallback() { public void onMapDrawFrame(GL10 gl, MapStatus drawingMapStatus) { L.i("执行====="); if (mBaiduMap.getProjection() != null) { L.i("执行:"+latLngPolygon.size()); // 计算折线的 opengl 坐标 calPolylinePoint(drawingMapStatus); // 绘制折线 drawPolyline(gl, Color.argb(255, 255, 00, 255), vertexBuffer, 20, 3, drawingMapStatus); } } }; // 计算折线 OpenGL 坐标 public void calPolylinePoint(MapStatus mspStatus) { L.i("个数:"+latLngPolygon.size()); PointF[] polyPoints = new PointF[latLngPolygon.size()]; float[]vertexs = new float[3 * latLngPolygon.size()]; int i = 0; for (LatLng xy : latLngPolygon) { // 将地理坐标转换成 openGL 坐标 polyPoints[i] = mBaiduMap.getProjection().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++) { L.i("vertexs[" + j + "]: " + vertexs[j]); } vertexBuffer = makeFloatBuffer(vertexs); } //创建OpenGL绘制时的顶点Buffer 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(GL10 gl, int color, FloatBuffer lineVertexBuffer, float lineWidth, int pointSize, MapStatus drawingMapStatus) { gl.glEnable(GL10.GL_BLEND); gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA); float colorA = Color.alpha(color) / 255f; float colorR = Color.red(color) / 255f; float colorG = Color.green(color) / 255f; float colorB = Color.blue(color) / 255f; gl.glVertexPointer(3, GL10.GL_FLOAT, 0, lineVertexBuffer); gl.glColor4f(colorR, colorG, colorB, colorA); gl.glLineWidth(lineWidth); gl.glDrawArrays(GL10.GL_LINE_STRIP, 0, pointSize); gl.glDisable(GL10.GL_BLEND); gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); } @Override public void onMapDrawFrame(GL10 gl10, MapStatus mapStatus) { callback.onMapDrawFrame(gl10,mapStatus); }}
最后的效果图片:
0 0
- 深入学习百度地图Android SDK v4.0.0【第四关】OpenGL绘制
- 深入学习百度地图Android SDK v4.0.0【第一关】基础地图
- 深入学习百度地图Android SDK v4.0.0【第二关】公交地图
- 深入学习百度地图Android SDK v4.0.0【第六关】室内地图
- 深入学习百度地图Android SDK v4.0.0【第八关】离线地图
- 深入学习百度地图Android SDK v4.0.0【第三关】路线规划
- 深入学习百度地图Android SDK v4.0.0【第五关】瓦片图层
- 深入学习百度地图Android SDK v4.0.0【第七关】周边雷达
- 深入学习百度地图Android SDK v4.0.0【第九关】检索功能
- 深入学习百度地图Android SDK v4.0.0【第十关】短链分享
- 深入学习百度地图Android SDK v4.0.0【第七关】周边雷达
- 一、学习百度地图Android SDK v4.3.0 之基础地图
- Android百度地图SDK上绘制虚线
- 搭建百度地图SDK的Android开发环境(百度地图SDK版本V4.3.0)
- android 百度地图sdk v3.4 绘制历史轨迹
- Android如何使用最新版本百度地图地图 SDK v4.2.1(一)的API
- 百度地图Android SDK
- android 百度地图sdk
- Caused by: java.io.IOException: CreateProcess error=87, The parameter is incorrect
- 求无向图中的桥 和 边的双联通分量
- 通过Spring文档来自学Spring
- JS中的event对象
- AHB和APB
- 深入学习百度地图Android SDK v4.0.0【第四关】OpenGL绘制
- RandomForest的学习笔记
- hdu3746Cyclic Nacklace 扩展KMP
- Linux驱动开发-中断分层机制笔记 6
- Android学习笔记——简单的侧滑栏
- Android——加载图片第三方工具——图片加载中
- 微信蓝牙设备开发教程之设备授权(3)
- 关于onhiddenchanged和setUserVisibleHint函数的知识
- Maven WEB项目使用ProGuard进行混淆,最佳解决方案