当前位置:  编程技术>移动开发
本页文章导读:
    ▪让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,其定义如下所示:

        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加项动作不执行。

    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android程序设计之AIDL实例详解 iis7站长之家
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,