当前位置:  编程技术>移动开发
本页文章导读:
    ▪相干资料链接        相关资料链接 android镜像站点:http://developer.android.com.nyud.net1.开发书籍下载http://www.verycd.com/topics/2812741/http://www.doc88.com/p-47230828611.html2.其他书http://www.hjenglish.com/dl/p10802/3.手机驱动http://www.dr.........
    ▪ gallery3d源码学习小结(一)——绘制流程drawFocusItems        gallery3d源码学习总结(一)——绘制流程drawFocusItems eoe·Android开发者门户 标题: gallery3d源码学习总结(一)——绘制流程drawFocusItems [打印本页] 作者: specialbrian    时间: 2010-10-29 20:15     标.........
    ▪ ProgressDialog跟AsyncTask的一个例子,一次删除多个联系人       ProgressDialog和AsyncTask的一个例子,一次删除多个联系人 选择了要删除的联系人,uriData; 调用DeleteMultipleContactResult(uriData); private int num; private void DeleteMultipleContactResult(ArrayList<Uri> uriData){ .........

[1]相干资料链接
    来源: 互联网  发布时间: 2014-02-18
相关资料链接
android镜像站点:http://developer.android.com.nyud.net

1.开发书籍下载
http://www.verycd.com/topics/2812741/

http://www.doc88.com/p-47230828611.html



2.其他书
http://www.hjenglish.com/dl/p10802/


3.手机驱动
http://www.drvsky.com/moto/ME600.htm

4.ME600刷机
http://www.hiapk.com/thread-593113-1-1.html

    
[2] gallery3d源码学习小结(一)——绘制流程drawFocusItems
    来源: 互联网  发布时间: 2014-02-18
gallery3d源码学习总结(一)——绘制流程drawFocusItems
eoe·Android开发者门户

标题: gallery3d源码学习总结(一)——绘制流程drawFocusItems [打印本页]

作者: specialbrian    时间: 2010-10-29 20:15     标题: gallery3d源码学习总结(一)——绘制流程drawFocusItems

本帖最后由 specialbrian 于 2010-11-4 07:59 编辑

显示单张图片相关的输入变量

  • int selectedSlotIndex = mSelectedSlot;
  •         GridDrawables drawables = mDrawables;
  •         GridCamera camera = mCamera;
  •         DisplayItem[] displayItems = mDisplayItems;
  •         int firstBufferedVisibleSlot = mBufferedVisibleRange.begin;
  •         int lastBufferedVisibleSlot = mBufferedVisibleRange.end;
  •         boolean isCameraZAnimating = mCamera.isZAnimating();
  • 复制代码

    删除当前选中槽位前后2步之外的大缩略图

  • for (int i = firstBufferedVisibleSlot; i <= lastBufferedVisibleSlot; ++i) {
  •             if (selectedSlotIndex != Shared.INVALID && (i >= selectedSlotIndex - 2 && i <= selectedSlotIndex + 2)) {
  •                 continue;
  •             }
  •             DisplayItem displayItem = displayItems[(i - firstBufferedVisibleSlot) * GridLayer.MAX_ITEMS_PER_SLOT];
  •             if (displayItem != null) {
  •                 displayItem.clearScreennailImage();
  •             }
  •         }
  • 复制代码

    得到当前图片的DispalyItem元素

  • int centerIndexInDrawnArray = (selectedSlotIndex - firstBufferedVisibleSlot) * GridLayer.MAX_ITEMS_PER_SLOT;
  •             if (centerIndexInDrawnArray < 0 || centerIndexInDrawnArray >= displayItems.length) {
  •                 return;
  •             }
  •             DisplayItem centerDisplayItem = displayItems[centerIndexInDrawnArray];
  •             if (centerDisplayItem == null || centerDisplayItem.mItemRef.mId == Shared.INVALID) {
  •                 return;
  •             }
  • 复制代码

    判断大缩略图是否加载完成

  • boolean focusItemTextureLoaded = false;
  •             Texture centerTexture = centerDisplayItem.getScreennailImage(view.getContext());
  •             if (centerTexture != null && centerTexture.isLoaded()) {
  •                 focusItemTextureLoaded = true;
  •             }
  • 复制代码

    是否跳过当前图片前一张图片

  • float camX = camera.mLookAtX * camera.mScale;
  • float centerTranslateX = centerDisplayItem.mAnimatedPosition.x;
  •             final boolean skipPrevious = centerTranslateX < camX;
  • 复制代码

    开启opengl混合模式并设置混合函数

  • gl.glEnable(GL11.GL_BLEND);
  •             gl.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE);
  • 复制代码

    循环遍历前中后三幅图片分别进行“核心绘制处理”

  • for (int i = -1; i <= 1; ++i) {
  •                 if (slideshowMode && timeElapsedSinceView > 1.0f && i != 0)
  •                     continue;
  • 。。。
  • }
  • 复制代码

    核心绘制处理——输入变量准备

  • if (slideshowMode && timeElapsedSinceView > 1.0f && i != 0)
  •                     continue;
  •                 float viewAspect = camera.mAspectRatio;
  •                 int selectedSlotToUse = selectedSlotIndex + i;
  •                 if (selectedSlotToUse >= 0 && selectedSlotToUse <= lastBufferedVisibleSlot) {
  •                     int indexInDrawnArray = (selectedSlotToUse - firstBufferedVisibleSlot) * GridLayer.MAX_ITEMS_PER_SLOT;
  •                     if (indexInDrawnArray < 0 || indexInDrawnArray >= displayItems.length) {
  •                         return;
  •                     }
  •                     DisplayItem displayItem = displayItems[indexInDrawnArray];
  •                     MediaItem item = displayItem.mItemRef;
  •                     final Texture thumbnailTexture = displayItem.getThumbnailImage(view.getContext(), sThumbnailConfig);
  •                     Texture texture = displayItem.getScreennailImage(view.getContext());
  • 复制代码

    在幻灯模式下且超过1秒的切换时间无须显示前后两张图片;
    得到视角和当前displayItem、对应媒体对象、小缩略图材质、大缩略图材质。
    加载高质量的材质资源

  • if (isCameraZAnimating && (texture == null || !texture.isLoaded())) {
  •                         texture = thumbnailTexture;
  •                         mSelectedMixRatio.setValue(0f);
  •                         mSelectedMixRatio.animateValue(1f, 0.75f, view.getFrameTime());
  •                     }
  •                     Texture hiRes = (zoomValue != 1.0f && i == 0 && item.getMediaType() != MediaItem.MEDIA_TYPE_VIDEO) ? displayItem
  •                             .getHiResImage(view.getContext())
  •                             : null;
  •                     if (Gallery.PIXEL_DENSITY > 1.0f) {
  •                         hiRes = texture;
  •                     }
  •                     if (i != 0) {
  •                         displayItem.clearHiResImage();
  •                     }
  •                     if (hiRes != null) {
  •                         if (!hiRes.isLoaded()) {
  •                             view.bind(hiRes);
  •                             view.prime(hiRes, true);
  •                         } else {
  •                             texture = hiRes;
  •                         }
  •                     }
  • 复制代码

    如果Camera正在拉远或拉近,且大缩略图材质为空或未加载完成,则选择小缩略图作为材质,将当前图片的“大缩略图混合比例”变量进行初始化(目标值为1秒,渐变时间为0.75秒,渐变开始时间为当前帧时间)。
    如果处于放大状态,则加载原图hiRes,加载成功后赋值给材质变量texture;并清除前后图片的原图。
    加载材质

  • final Texture fsTexture = texture;
  •                     if (texture == null || !texture.isLoaded()) {
  •                         if (Math.abs(centerTranslateX - camX) < 0.1f) {
  •                             if (focusItemTextureLoaded && i != 0) {
  •                                 view.bind(texture);
  •                             }
  •                             if (i == 0) {
  •                                 view.bind(texture);
  •                                 view.prime(texture, true);
  •                             }
  •                         }
  •                         texture = thumbnailTexture;
  •                         if (i == 0) {
  •                             mSelectedMixRatio.setValue(0f);
  •                             mSelectedMixRatio.animateValue(1f, 0.75f, view.getFrameTime());
  •                         }
  •                     }
  • 复制代码

    保留当前的最佳材质,
    如果此材质加载未完成,则继续按优先级加载,并把小缩略图(基本上都已经加载成功了)设置为当前材质;
    最佳材质未加载完成之前,替换渐变不会开始。
    无须绘制

  • if (mCamera.isAnimating() || slideshowMode) {
  •                         if (!slideshowMode && skipPrevious && i == -1) {
  •                             continue;
  •                         }
  •                         if (!skipPrevious && i == 1) {
  •                             continue;
  •                         }
  •                     }
  •                     int theta = (int) displayItem.getImageTheta();
  • 复制代码

    如果相机缩放过程中,非幻灯片模式下且镜头中不需要展示前一张的情况下,无须处理前一张;
    如果相机缩放或幻灯片绘制过程中,需要展示前一张的情况下,无须处理后一张。
    处理前后渐变绘制

  • // If it is in slideshow mode, we draw the previous item in
  •                     // the next item's position.
  •                     if (slideshowMode && timeElapsedSinceView < 1.0f && timeElapsedSinceView != 0) {
  •                         if (i == -1) {
  •                             int nextSlotToUse = selectedSlotToUse + 1;
  •                             if (nextSlotToUse >= 0 && nextSlotToUse <= lastBufferedVisibleSlot) {
  •                                 int nextIndexInDrawnArray = (nextSlotToUse - firstBufferedVisibleSlot)
  •                                         * GridLayer.MAX_ITEMS_PER_SLOT;
  •                                 if (nextIndexInDrawnArray >= 0 && nextIndexInDrawnArray < displayItems.length) {
  •                                     float currentImageTheta = displayItem.mAnimatedImageTheta;
  •                                     displayItem = displayItems[nextIndexInDrawnArray];
  •                                     backupImageTheta = displayItem.mAnimatedImageTheta;
  •                                     displayItem.mAnimatedImageTheta = currentImageTheta;
  •                                     view.setAlpha(1.0f - timeElapsedSinceView);
  •                                 }
  •                             }
  •                         } else if (i == 0) {
  •                             displayItem.mAnimatedImageTheta = backupImageTheta;
  •                             view.setAlpha(timeElapsedSinceView);
  •                         }
  •                     }
  • 复制代码

    如果处于幻灯片模式中 渐变过程中,处理上一幅相片时找到它的下一个DispalyItem,处理本张相片则直接使用当前DispalyItem,为的是同样找到当前DisplayItem,并绑定上一张相片和本张相片,两张相片透明度互补达到渐变的效果。
    绘制小大缩略图渐变过程-小缩略图

  • int vboIndex = i + 1;
  •                         float alpha = view.getAlpha();
  •                         float selectedMixRatio = mSelectedMixRatio.getValue(view.getFrameTime());
  •                         if (selectedMixRatio != 1f) {
  •                             texture = thumbnailTexture;
  •                             view.setAlpha(alpha * (1.0f - selectedMixRatio));
  •                         }
  •                         GridQuad quad = GridDrawables.sFullscreenGrid[vboIndex];
  •                         float u = texture.getNormalizedWidth();
  •                         float v = texture.getNormalizedHeight();
  •                         float imageWidth = texture.getWidth();
  •                         float imageHeight = texture.getHeight();
  •                         boolean portrait = ((theta / 90) % 2 == 1);
  •                         if (portrait) {
  •                             viewAspect = 1.0f / viewAspect;
  •                         }
  •                         quad.resizeQuad(viewAspect, u, v, imageWidth, imageHeight);
  •                         quad.bindArrays(gl);
  •                         
  •                         drawDisplayItem(view, gl, displayItem, texture, PASS_FOCUS_CONTENT, null, 0.0f);
  •                         quad.unbindArrays(gl);
  • 复制代码

    绘制小缩略图,请注意:selectedMixRatio表示大缩略图的绘制透明度,小缩略图的自然就是1.0f - selectedMixRatio。
    绘制小大缩略图渐变过程-大缩略图

  • if (selectedMixRatio != 0.0f && selectedMixRatio != 1.0f) {
  •                             texture = fsTexture;
  •                             if (texture != null) {
  •                                 float drawAlpha = selectedMixRatio;
  •                                 view.setAlpha(alpha * drawAlpha);
  •                                 u = texture.getNormalizedWidth();
  •                                 v = texture.getNormalizedHeight();
  •                                 imageWidth = texture.getWidth();
  •                                 imageHeight = texture.getHeight();
  •                                 quad.resizeQuad(viewAspect, u, v, imageWidth, imageHeight);
  •                                 quad.bindArrays(gl);
  •                                 drawDisplayItem(view, gl, displayItem, fsTexture, PASS_FOCUS_CONTENT, null, 1.0f);
  •                                 quad.unbindArrays(gl);
  •                             }
  •                         }
  • 复制代码

    更新当前图片长宽数据

  • if (i == 0 || slideshowMode) {
  •                             mCurrentFocusItemWidth = quad.getWidth();
  •                             mCurrentFocusItemHeight = quad.getHeight();
  •                             if (portrait) {
  •                                 // Swap these values.
  •                                 float itemWidth = mCurrentFocusItemWidth;
  •                                 mCurrentFocusItemWidth = mCurrentFocusItemHeight;
  •                                 mCurrentFocusItemHeight = itemWidth;
  •                             }
  •                         }
  • 复制代码

    绘制视频元素

  • view.setAlpha(alpha);
  •                         if (item.getMediaType() == MediaItem.MEDIA_TYPE_VIDEO) {
  •                             // The play graphic overlay.
  •                             GridDrawables.sVideoGrid.bindArrays(gl);
  •                             drawDisplayItem(view, gl, displayItem, drawables.mTextureVideo, PASS_VIDEO_LABEL, null, 0);
  •                             GridDrawables.sVideoGrid.unbindArrays(gl);
  •                         }
  • 复制代码

    【此部分讲解已结束】,如您对其他部分感兴趣请回帖说明

    作者: lily0314    时间: 2010-11-1 10:53

    本帖最后由 lily0314 于 2010-11-19 15:55 编辑

    写的挺好啊,谢谢啦!

    作者: lily0314    时间: 2010-11-1 11:15

    GridLayer和HudLayer分别是负责什么的?

    作者: specialbrian    时间: 2010-11-1 11:26

    回复 3# lily0314


        HudLayer是交互控件图层,GridLayer是动画元素层。

    作者: lily0314    时间: 2010-11-1 14:30

    谢谢啦,能否详细讲讲drawBlendedComponents和drawThumbnails方法?

    作者: lily0314    时间: 2010-11-1 15:04

    STATE_TIMELINE(GridLayer中的)是什么状态?能否截图?

    作者: lily0314    时间: 2010-11-1 17:19

    你好,我还想请问一下从打开软件,到呈现出文件夹界面,经过了哪些过程?图片的坐标是固定的吗?随着重力感应和手指滑动,位置会有细微的小位移,用什么方法呢?是改变视点还是怎样?具体的代码是怎样呢?

    作者: specialbrian    时间: 2010-11-2 09:51

    本帖最后由 specialbrian 于 2010-11-2 09:53 编辑

    回复 6# lily0314

    2010-11-2 09:53 上传
    下载附件 (359.51 KB)

    [attach]12020[/attach]

    图片附件: device.png (2010-11-2 09:53, 359.51 KB) / 下载次数 1
    http://www.eoeandroid.com/forum.php?mod=attachment&aid=MTIwMjR8MWI5NzVmYWN8MTMwMTYyMzkxNnw0ODEyMzA%3D

    作者: lily0314    时间: 2010-11-2 10:17

    回复 8# specialbrian


        噢,同一个文件夹内,按时间分类的界面啊,为什么我看不到这种界面?是需要怎样触发呢?
      那么STATE_MEDIA_SETS是刚打开时候的主界面(有文件夹的),STATE_GRID_VIEW是缩略图矩阵浏览的界面,对吗?

    作者: specialbrian    时间: 2010-11-2 14:24

    回复 9# lily0314
        你的理解没错,不过我习惯管STATE_MEDIA_SETS叫做相册表格页,STATE_GRID_VIEW是相片表格页,时间分类页在相片表格页的右上角控件控制,详见我图中的红色标记

    作者: lily0314    时间: 2010-11-2 14:54

    回复 10# specialbrian


        非常感谢!不知我之前的问题有没有可解?

    作者: eoe-android-com    时间: 2010-11-2 15:29

    想了解一下 缓存管理那一块的
    CacheService类 ,以及怎么进行异步加载的呢 以及缓存文件的的写入读取的过程
    特别是DCIM\.thumbnails\.thumbdata3--1967290299 缩略图文件是如何创建的
    可否 详细的讲解一下呢 谢谢
    如果方便的话可否加QQ:907288406交流一下

    作者: specialbrian    时间: 2010-11-2 15:43

    回复 11# lily0314
    正在汇总整理当中,估计今明两天给出响应帖子

    作者: lily0314    时间: 2010-11-2 16:05

    回复 13# specialbrian


        呵呵谢谢啦,我就是看到哪,想到一些问题,就问你了,很期待你的讲解!

    作者: lily0314    时间: 2010-11-2 16:55

    本帖最后由 lily0314 于 2010-11-2 16:57 编辑

    HudLayer.java文件中的MODE_NORMAL和MODE_SELECT是指哪些模式呢?是不是普通的模式和标记选中模式?我偶然能到标记选中模式下,但是不知道是怎么触发的,想请教下,可否有截图?

    作者: specialbrian    时间: 2010-11-2 21:28

    回复 5# lily0314

    已经写了另一篇帖子,写了下drawThumbnails
        http://www.eoeandroid.com/viewthread.php?tid=41731&extra=

    作者: specialbrian    时间: 2010-11-2 21:31

    回复 15# lily0314


        是的,你的理解完全正确。出发多选的方式是长按一个相册或相片。

    作者: specialbrian    时间: 2010-11-3 17:10

    回复 12# eoe-android-com

    第三篇文章
    http://www.eoeandroid.com/viewthread.php?tid=41920&extra=
        写了大体流程,如有疑问请提到这个帖子中吧

    作者: eoe-android-com    时间: 2010-11-8 15:43

    回复 18# specialbrian


        非常感谢

    作者: xiaomeigu330    时间: 2010-12-7 13:31

    非常好,学习中。。。

    作者: kuanbaobei    时间: 2010-12-8 11:45

    楼主,你太帅了!能否把你对gallery3d的学习笔记,提供打包下载呢?真是讲的太好了!

    作者: specialbrian    时间: 2010-12-30 14:38

    目前只有这三篇:gallery3d源码学习总结(一)(二)(三),留下我的QQ:634589207

    作者: contentroot    时间: 2011-1-24 11:46

    问个问题。
    大缩略图是做什么用的?
    我跟代码没看到运行过呀?

    作者: MEYEGG    时间: 2011-2-22 19:06

    :):):)

    作者: lzl26689    时间: 2011-3-7 17:39

    谢谢啦

    作者: qiuxueming    时间: 2011-3-7 18:38

    不错,做个记号


    欢迎光临 eoe·Android开发者门户 (http://www.eoeandroid.com/) Powered by Discuz! X1.5
    1 楼 337240552 2011-07-17  
    不得不说一句废话,写的真是好,收藏

        
    [3] ProgressDialog跟AsyncTask的一个例子,一次删除多个联系人
        来源: 互联网  发布时间: 2014-02-18
    ProgressDialog和AsyncTask的一个例子,一次删除多个联系人
    选择了要删除的联系人,uriData; 调用DeleteMultipleContactResult(uriData);
    private int num;
    private void  DeleteMultipleContactResult(ArrayList<Uri> uriData){
        	num = uriData.size();//获取要删除联系人的个数
        	
        	final DialogInterface.OnClickListener deleteMultipleClickListener =
                new DialogInterface.OnClickListener() {
                     public void onClick(DialogInterface dialog,int which){
                    	 connect(uriData);
                         }
            	};
            	
            //show dialog.if ok,then delete multiple contacts 
            new AlertDialog.Builder(this)
                .setTitle(R.string.deleteConfirmation_title)
                .setIcon(android.R.drawable.ic_dialog_alert)
                .setMessage(R.string.multipleContactDeleteConfirmation)
                .setNegativeButton(android.R.string.cancel, null)
                .setPositiveButton(android.R.string.ok, deleteMultipleClickListener)
                .show();
            
        }
        
        private void connect(ArrayList<Uri> uriData){
        	DeleteMultipleTask Task = new DeleteMultipleTask(this);
       	 	Task.execute(uriData);
        }
        
        class DeleteMultipleTask extends AsyncTask<ArrayList<Uri>,Integer,String>{
        	boolean mCanceled = false;
        	ProgressDialog dialog;
        	public DeleteMultipleTask(Context context){
        		dialog = new ProgressDialog(context);//删除过程中显示进度条
        		dialog.setButton(getString(android.R.string.cancel), new DialogInterface.OnClickListener(){
        			public void onClick(DialogInterface dialog,int i){
        				dialog.dismiss();
        				mCanceled = true;
        			}
        		});
        		dialog.setCancelable(false);
        		dialog.setMax(num);
        		dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        		dialog.setTitle(R.string.dialog_delete_multiple);
        		dialog.show();
        	}
        	
    		@Override
    		protected String doInBackground(ArrayList<Uri>... uriDatas) {
    			// TODO Auto-generated method stub
    			ArrayList<Uri> uriData = uriDatas[0];
    			ContentResolver resolver = getContentResolver();
                 for(int i = 0; i < num; i++){
                	 if(!mCanceled){
                		 mSelectedContactUri = uriData.get(i);
                		 resolver.delete(RawContacts.CONTENT_URI,
                				 RawContacts.CONTACT_ID + "=" + ContentUris.parseId(mSelectedContactUri),null);
                		 dialog.incrementProgressBy(1);
                	 }else{
                		 break;
                	 }
                 }
                 return null;
    		}
    		
    		protected void onPostExecute(String result){
    			dialog.dismiss();
    		}
        }

     


        
    最新技术文章:
    ▪Android开发之登录验证实例教程
    ▪Android开发之注册登录方法示例
    ▪Android获取手机SIM卡运营商信息的方法
    ▪Android实现将已发送的短信写入短信数据库的...
    ▪Android发送短信功能代码
    ▪Android根据电话号码获得联系人头像实例代码
    ▪Android中GPS定位的用法实例
    ▪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,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3