当前位置: 编程技术>移动开发
本页文章导读:
▪让overlayItems所有显示 让overlayItems全部显示
如果有时间加了很多overlayItem,由于缩放问题 有些不能显示为了全部显示
public void centerOverlays() {
int minLat = 81 * MapStoresController.MAP_SCALE;
int maxLat = -81 * MapStoresControll.........
▪ Gallery3d 代码分析之点染流程 Gallery3d 代码分析之渲染流程
RenderViewgallery3d 的渲染从 RenderView 开始。RenderView 从 GLSurfaceView 继承而来,采用了通知型绘制模式,即通过调用 requestRender 通知 RenderView 重绘屏幕。RenderView 将.........
▪ Gallery3D各个界面足见范围计算方法 Gallery3D各个界面可见范围计算方法
computeVisibleRange算法分析:第1步,计算出left,right,bottom,top第2步,计算出numSlots,并除于2赋值给index第3步,由index得position,判断position是否在第1步计算出的.........
[1]让overlayItems所有显示
来源: 互联网 发布时间: 2014-02-18
让overlayItems全部显示
如果有时间加了很多overlayItem,由于缩放问题 有些不能显示为了全部显示
public void centerOverlays() { int minLat = 81 * MapStoresController.MAP_SCALE; int maxLat = -81 * MapStoresController.MAP_SCALE; int minLon = 181 * MapStoresController.MAP_SCALE; int maxLon = -181 * MapStoresController.MAP_SCALE; for (int i = 0; i < overlayItems.size(); i++) { Store s = overlayItems.getItem(i).getStore(); minLat = (int) ((minLat > (s.getLocation().getLatitude() * MapStoresController.MAP_SCALE)) ? s.getLocation().getLatitude() * MapStoresController.MAP_SCALE : minLat); maxLat = (int) ((maxLat < (s.getLocation().getLatitude() * MapStoresController.MAP_SCALE)) ? s.getLocation().getLatitude() * MapStoresController.MAP_SCALE : maxLat); minLon = (int) ((minLon > (s.getLocation().getLongitude() * MapStoresController.MAP_SCALE)) ? s.getLocation().getLongitude() * MapStoresController.MAP_SCALE : minLon); maxLon = (int) ((maxLon < (s.getLocation().getLongitude() * MapStoresController.MAP_SCALE)) ? .getLocation().getLongitude() * MapStoresController.MAP_SCALE : maxLon); } GeoPoint gp = controller.getUserLocation(); minLat = (minLat > gp.getLatitudeE6()) ? gp.getLatitudeE6() : minLat; maxLat = (maxLat < gp.getLatitudeE6()) ? gp.getLatitudeE6() : maxLat; minLon = (minLon > gp.getLongitudeE6()) ? gp.getLongitudeE6() : minLon; maxLon = (maxLon < gp.getLongitudeE6()) ? gp.getLongitudeE6() : maxLon; mapView.getController().zoomToSpan((maxLat - minLat), (maxLon - minLon)); mapView.getController().animateTo(new GeoPoint((maxLat + minLat) / 2, (maxLon + minLon) / 2)); }
2.
/** * Fits the map with the passed in points so all points are visible. * @param mapController MapView controller * @param points list of points you want the map to contain */ private static void fitPoints(MapController mapController, List points) { // set min and max for two points int nwLat = -90 * 1000000; int nwLng = 180 * 1000000; int seLat = 90 * 1000000; int seLng = -180 * 1000000; // find bounding lats and lngs for (GeoPoint point : points) { nwLat = Math.max(nwLat, point.getLatitudeE6()); nwLng = Math.min(nwLng, point.getLongitudeE6()); seLat = Math.min(seLat, point.getLatitudeE6()); seLng = Math.max(seLng, point.getLongitudeE6()); } GeoPoint center = new GeoPoint((nwLat + seLat) / 2, (nwLng + seLng) / 2); // add padding in each direction int spanLatDelta = (int) (Math.abs(nwLat - seLat) * 1.1); int spanLngDelta = (int) (Math.abs(seLng - nwLng) * 1.1); // fit map to points mapController.animateTo(center); mapController.zoomToSpan(spanLatDelta, spanLngDelta); }
[2] Gallery3d 代码分析之点染流程
来源: 互联网 发布时间: 2014-02-18
Gallery3d 代码分析之渲染流程
RenderView
gallery3d 的渲染从 RenderView 开始。RenderView 从 GLSurfaceView 继承而来,采用了通知型绘制模式,即通过调用 requestRender 通知 RenderView 重绘屏幕。
RenderView 将所有需要绘制的对象都保存一个 Lists中,Lists 包含了5个ArrayList,其定义如下所示:
RenderView 的 onDrawFrame 接口完成每一帧的绘制操作,绘制时遍历 lists 里每个 list 的每一个成员并调用其 renderXXX 函数。主要代码如下所示:
lists 的各个 list 里包含的各个 layer 如下所示:
Layer 类提供了 update(...), renderOpaque (...), renderBlended (...) 接口,从上面 RenderView 的 onDrawFrame 绘制代码可以看到,这些接口被调用。
GridLayer
GridLayer 中有个 GridDrawManager,专门负责绘制。
下面是 GridDrawManager 的构造函数,从其参数里可以看出些门道。
RenderView
gallery3d 的渲染从 RenderView 开始。RenderView 从 GLSurfaceView 继承而来,采用了通知型绘制模式,即通过调用 requestRender 通知 RenderView 重绘屏幕。
RenderView 将所有需要绘制的对象都保存一个 Lists中,Lists 包含了5个ArrayList,其定义如下所示:
public final ArrayList<Layer> updateList = new ArrayList<Layer>(); public final ArrayList<Layer> opaqueList = new ArrayList<Layer>(); public final ArrayList<Layer> blendedList = new ArrayList<Layer>(); public final ArrayList<Layer> hitTestList = new ArrayList<Layer>(); public final ArrayList<Layer> systemList = new ArrayList<Layer>();
RenderView 的 onDrawFrame 接口完成每一帧的绘制操作,绘制时遍历 lists 里每个 list 的每一个成员并调用其 renderXXX 函数。主要代码如下所示:
... final Lists lists = sLists; final ArrayList<Layer> updateList = lists.updateList; boolean isDirty = false; for (int i = 0, size = updateList.size(); i != size; ++i) { boolean retVal = updateList.get(i).update(this, mFrameInterval); isDirty |= retVal; } if (isDirty) { requestRender(); } // Clear the depth buffer. gl.glClear(GL11.GL_DEPTH_BUFFER_BIT); gl.glEnable(GL11.GL_SCISSOR_TEST); gl.glScissor(0, 0, getWidth(), getHeight()); // Run the opaque pass. gl.glDisable(GL11.GL_BLEND); final ArrayList<Layer> opaqueList = lists.opaqueList; for (int i = opaqueList.size() - 1; i >= 0; --i) { final Layer layer = opaqueList.get(i); if (!layer.mHidden) { layer.renderOpaque(this, gl); } } // Run the blended pass. gl.glEnable(GL11.GL_BLEND); final ArrayList<Layer> blendedList = lists.blendedList; for (int i = 0, size = blendedList.size(); i != size; ++i) { final Layer layer = blendedList.get(i); if (!layer.mHidden) { layer.renderBlended(this, gl); } } gl.glDisable(GL11.GL_BLEND);
lists 的各个 list 里包含的各个 layer 如下所示:
lists |------------------|-----------------|-----------------|---------------| updateList opaqueList blendedList systemList hitTestList | | | | | GridLayer GridLayer GridLayer GridLayer GridLayer BackgroudLayer BackgroudLayer BackgroudLayer HudLayer HudLayer HudLayer HudLayer TimeBar TimeBar TimeBar PathBar PathBar PathBar XXXButton XXXButton XXXButton XXXMenu XXXMenu XXXMenu
Layer 类提供了 update(...), renderOpaque (...), renderBlended (...) 接口,从上面 RenderView 的 onDrawFrame 绘制代码可以看到,这些接口被调用。
public abstract class Layer { ... ... public abstract void generate(RenderView view, RenderView.Lists lists); public boolean update(RenderView view, float frameInterval) { return false; } public void renderOpaque(RenderView view, GL11 gl) { } public void renderBlended(RenderView view, GL11 gl) { } ... ... }
GridLayer
GridLayer 中有个 GridDrawManager,专门负责绘制。
下面是 GridDrawManager 的构造函数,从其参数里可以看出些门道。
mDrawManager = new GridDrawManager(context, mCamera, mDrawables, sDisplayList, sDisplayItems, sDisplaySlots);
[3] Gallery3D各个界面足见范围计算方法
来源: 互联网 发布时间: 2014-02-18
Gallery3D各个界面可见范围计算方法
computeVisibleRange算法分析:
第1步,计算出left,right,bottom,top
第2步,计算出numSlots,并除于2赋值给index
第3步,由index得position,判断position是否在第1步计算出的范围内,是的话,就把第2步计算得出的中间的index赋值给 firstVisibleSlotIndex,lastVisibleSlotIndex,否则,根据滑动窗口算法改变index直到求组所需index
第4步,在while循环中,用第3步得到的firstVisibleSlotIndex求出position,进行和第2步相反的判断,即 position若不在可视范围内,则将相应的index给firstVisibleSlotIndex,否则减 firstVisibleSlotIndex,直到找到最小的可视范围内的index作为firstVisibleSlotIndex。
第5步,在while循环中,用第3步得到的lastVisibleSlotIndex求出position,进行和第2步相反的判断,即 position若不在可视范围内,则将相应的index给lastVisibleSlotIndex,否则增 lastVisibleSlotIndex,直到找到可视范围内的最大的index作为lastVisibleSlotIndex。
第6步,进行firstVisibleSlotIndex,lastVisibleSlotIndex的越界判断。 outBufferedVisibleRange对应的是可见的。outBufferedVisibleRange对应的是0~文件夹的最大数。
computeVisibleItems算法分析:
第1步 由slot计算出position,set,当前set不为空且slot在有效范围,创建bestItems,计算sortedIntersection
第2步 计算这个slotindex中的图片数目,取这个文件中的前12张图片加到bestItems.
第3步 取bestItems里的图片对应的displayList中的displayItem,并赋值给displayItems数组,同时保存 position,及j,j是bestItems数组中一项,范围是0~12。
第四步 对于每一个文件夹,要在displayItems里有对应的12项,当文件夹内图片不足12时,余下的用null填充。
当绘制缩略图界面时,有些不同
在第1步中,slotindex不再表示文件夹,这时表示具体某一张图片了,所以由slot得到的set里始终只有1项,且会调 ArrayUtils.computeSortedIntersection(visibleItems, items, MAX_ITEMS_PER_SLOT, bestItems, sTempHash);给bestItems赋值,这样第2步就在bestItems加项动作不执行。
computeVisibleRange算法分析:
第1步,计算出left,right,bottom,top
第2步,计算出numSlots,并除于2赋值给index
第3步,由index得position,判断position是否在第1步计算出的范围内,是的话,就把第2步计算得出的中间的index赋值给 firstVisibleSlotIndex,lastVisibleSlotIndex,否则,根据滑动窗口算法改变index直到求组所需index
第4步,在while循环中,用第3步得到的firstVisibleSlotIndex求出position,进行和第2步相反的判断,即 position若不在可视范围内,则将相应的index给firstVisibleSlotIndex,否则减 firstVisibleSlotIndex,直到找到最小的可视范围内的index作为firstVisibleSlotIndex。
第5步,在while循环中,用第3步得到的lastVisibleSlotIndex求出position,进行和第2步相反的判断,即 position若不在可视范围内,则将相应的index给lastVisibleSlotIndex,否则增 lastVisibleSlotIndex,直到找到可视范围内的最大的index作为lastVisibleSlotIndex。
第6步,进行firstVisibleSlotIndex,lastVisibleSlotIndex的越界判断。 outBufferedVisibleRange对应的是可见的。outBufferedVisibleRange对应的是0~文件夹的最大数。
computeVisibleItems算法分析:
第1步 由slot计算出position,set,当前set不为空且slot在有效范围,创建bestItems,计算sortedIntersection
第2步 计算这个slotindex中的图片数目,取这个文件中的前12张图片加到bestItems.
第3步 取bestItems里的图片对应的displayList中的displayItem,并赋值给displayItems数组,同时保存 position,及j,j是bestItems数组中一项,范围是0~12。
第四步 对于每一个文件夹,要在displayItems里有对应的12项,当文件夹内图片不足12时,余下的用null填充。
当绘制缩略图界面时,有些不同
在第1步中,slotindex不再表示文件夹,这时表示具体某一张图片了,所以由slot得到的set里始终只有1项,且会调 ArrayUtils.computeSortedIntersection(visibleItems, items, MAX_ITEMS_PER_SLOT, bestItems, sTempHash);给bestItems赋值,这样第2步就在bestItems加项动作不执行。
最新技术文章: