深入学习百度地图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
原创粉丝点击