2011年6月14日

因为 <include />标签,在android中共享和重用UI组件是非常容易的。有事,因为容易统一创建负责的UI以致最后view 非常的多,其中一些我们很少用到。幸运的是,Android给我们提供了一种特殊的叫做“ViewStub的widget,他在不会破坏用户逻辑的同时能个带给我们想<include />一样的好处。

ViewStub 是一种轻量的View,没有大小,不会参与绘图和layout,这就意味着ViewStub 在infalate 和保持视图方面是代价非常小的,ViewStub 可以被认为是一个后的include标签,被ViewStub 引用的layout会在你需要的时候才会被加入到用户的界面中。

下面的截屏来自于Shelves应用。截图的主要是给用户呈现一个可以浏览的图书列表。

 

 

 

同一个Activity同样被使用当用户添加或者导入新书时,在这中操作的过程中,应用程序呈现给用户另外一些元素。下面的截屏中在图底部展示一个进度条和取消按钮。

因为导入书籍操作不是一个很平常的操作,至少和浏览这样的操作是这样的。这里导入的panel就是使用一个viewstub.

 

当用户调用导入操作时,ViewStub 会被inflated而且内容会被指向layout替代。

为了使用ViewStub,你需要指定一个android:id 属性,给stub,一个android:layout 属性给你需要引用的layout,ViewStub允许你使用第三方的属性,android:inflatedId能够被用来覆盖被引用的根view的id,最终,在layout中参数将会被知道包含的根view,这里是一个例子

<ViewStub
  android:id="@+id/stub_import"
  android:inflatedId="@+id/panel_import"

  android:layout="@layout/progress_overlay"

  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:layout_gravity="bottom" />

当你准备inflate stub时,inflate()方法将会被调用,你可以简单改变view的可见性最终stub讲个inflate。记住。Inflate方法会形象到被填充的layout;

((ViewStub) findViewById(R.id.stub_import)).setVisibility(View.VISIBLE);
// or
View importPanel = ((ViewStub) findViewById(R.id.stub_import)).inflate();

必须记住一点是stub在stubinflate后被移除,因此没必要保存一个长生命周期的引用。例如为类的域变量;

ViewStub 是一中简单编程和高效代码的妥协。代替人工在运行时手动添加view,唯一缺点就是不支持<merge /> tag.标签

posted @ 2011-06-14 22:35 lbeing 阅读(248) 评论(0) 编辑

2011年6月13日

这篇文章帮助你更好了解Android's drawables对象,这篇文章描述现象你可以不知道,但是当你遇到了该问题也许一两天也不一定找到解决方案。

Android's drawables对编写程序是非常有用的。A Drawable通常是一个与view相关的插件后的画图容器。例如。一个aBitmapDrawable是用来显示图片的,a ShapeDrawable 是用来画图和渐变的等等。你甚至可以通过它还创建负责的渲染。

Drawables允许你不需要继承就可以很容易的定制widgets渲染。事实是,Android的应用程序和widgets 是使用该drawables对象的,在android的核心框架中大约有700个drawables被使用。正式以为他是如此广泛的被使用,Android对它进行了优化。例如,每一次你创建一个按钮时,一个新的drawable就会被装载。这就意味着应用程序中所有的使用不同drawablesd对象实现不同背景的按钮,所有的drawables对象公用一个公用的状态,我们成“constant state”,这个状态的内如根据你使用的不同drawables对象而不同,但是它通常包括一个资源所有的属性。以按钮为例,常态包括一个位图。如此一所有按钮就可以共享一张位图。这将会节省很多的资源。

下面的图介绍了你设置一张图给两个不同View作为背景的创建过程。正如你所看到的那样,两个drawables被创建,但是共享公共的部分也就是同一张位图。



 

这种状态分享特点极大避免了浪费内存,但是当你试图去修改drawable的属性时它会导致一些问题。假设是关于书的的列表的程序,书名之后会当你标注为喜欢的时候显示为不透明的而标注不喜欢的时候完全透明星星。为了达到这样的效果,你也许会在你的adapter个getView实现下面的方法:

 

Book book = ...;
TextView listItem = ...;

listItem.setText(book.getTitle());

Drawable star = context.getResources().getDrawable(R.drawable.star);
if (book.isFavorite()) {
  star.setAlpha(255); // opaque
} else {
  star.setAlpha(70); // translucent
}

不幸的是,上面的那段代码会有一个很奇怪的结果,所有的drawables对象都会有相同的透明值。

这种结果能够用上面的“常态”来解释。因为我们从一个list item中获取一个drawable对象时,constant state是一样的,对BitmapDrawable来说,透明值就是一个常态,因此,改变一个drawable对象实例的透明值来说,会改变所有其他对象的透明值,更糟糕是,这种问题在1.1和1.0的是不好解决的。

在1.5或者更好的设备上通过mutate()方法是很容易解决上述问题。当你对一个drawable对象调用这个方法时,drawable对象就会被复制而不会印象其他对象。记住bitmap对象依旧是被重用的,即使是实用mutate(),下面这幅图说明调用mutate()对象之后情况:

让我更新一下我们的代码:

Drawable star = context.getResources().getDrawable(R.drawable.star);
if (book.isFavorite()) {
  star.mutate().setAlpha(255); // opaque
} else {
  star. mutate().setAlpha(70); // translucent
}

为了方便mutate()是返回drawable对象自己,这就允许我们采用链的方法调用,他不会产生新的对象,通过上面的代码片段,我的程序行为变得正常。

 

posted @ 2011-06-13 23:34 lbeing 阅读(475) 评论(0) 编辑

2011年2月28日

glAccum 操作累加缓冲区
glAddSwapHintRectWIN 定义一组被SwapBuffers拷贝的三角形
glAlphaFunc允许设置alpha检测功能
glAreTexturesResident 决定特定的纹理对象是否常驻在纹理内存中
glArrayElement 定义一个被用于顶点渲染的数组成分
glBegin,glEnd 定义一个或一组原始的顶点
glBindTexture 允许建立一个绑定到目标纹理的有名称的纹理
glBitmap 绘制一个位图
glBlendFunc 特殊的像素算法
glCallList 执行一个显示列表 
glCallLists 执行一列显示列表 
glClear 用当前值清除缓冲区 
GlClearAccum 为累加缓冲区指定用于清除的值 
glClearColor 为色彩缓冲区指定用于清除的值 
glClearDepth 为深度缓冲区指定用于清除的值 
glClearStencil 为模板缓冲区指定用于清除的值 
glClipPlane 定义被裁剪的一个平面几何体 
glColor 设置当前色彩 
glColorMask 允许或不允许写色彩组件帧缓冲区 
glColorMaterial 使一个材质色彩指向当前的色彩 
glColorPointer 定义一列色彩 
glColorTableEXT 定义目的一个调色板纹理的调色板的格式和尺寸 
glColorSubTableEXT 定义目的纹理的调色板的一部分被替换 
glCopyPixels 拷贝帧缓冲区里的像素 
glCopyTexImage1D 将像素从帧缓冲区拷贝到一个单空间纹理图象中 
glCopyTexImage2D 将像素从帧缓冲区拷贝到一个双空间纹理图象中 
glCopyTexSubImage1D 从帧缓冲区拷贝一个单空间纹理的子图象 
glCopyTexSubImage2D 从帧缓冲区拷贝一个双空间纹理的子图象 
glCullFace 定义前面或后面是否能被精选 
glDeleteLists 删除相邻一组显示列表 
glDeleteTextures 删除命名的纹理 
glDepthFunc 定义用于深度缓冲区对照的数据 
glDepthMask 允许或不允许写入深度缓冲区 
glDepthRange 定义z值从标准的设备坐标映射到窗口坐标 
glDrawArrays 定义渲染多个图元 
glDrawBuffer 定义选择哪个色彩缓冲区被绘制 
glDrawElements 渲染数组数据中的图元 
glDrawPixels 将一组像素写入帧缓冲区 
glEdgeFlag 定义一个边缘标志数组 
glEdgeFlagPointer 定义一个边缘标志数组 
glEnable, glDisable 打开或关闭OpenGL的特殊功能 
glEnableClientState,glDisableClientState 分别打开或关闭数组 
glEvalCoord 求解一维和二维贴图 
glEvalMesh1,glEvalMesh2 求解一维和二维点或线的网格 
glEvalPoint1,glEvalPoint2 生成及求解一个网格中的单点 
glFeedbackBuffer 控制反馈模式 
glFinish 等待直到OpenGL执行结束 
glFlush 在有限的时间里强制OpenGL的执行 
glFogf,glFogi,glFogfv,glFogiv 定义雾参数 
glFrontFace 定义多边形的前面和背面 
glFrustum 当前矩阵乘上透视矩阵 
glGenLists 生成一组空的连续的显示列表 
glGenTextures 生成纹理名称 
glGetBooleanv,glGetDoublev,glGetFloatv,glGetIntegerv 返回值或所选参数值 
glGetClipPlane 返回特定裁减面的系数 
glGetColorTableEXT 从当前目标纹理调色板得到颜色表数据 
glGetColorTableParameterfvEXT,glGetColorTableParameterivEXT 从颜色表中得到调色板参数 
glGetError 返回错误消息 
glGetLightfv,glGetLightiv 返回光源参数值 
glGetMapdv,glGetMapfv,glGetMapiv 返回求值程序参数 
glGetMaterialfv,glGetMaterialiv 返回材质参数 
glGetPixelMapfv,glGetpixelMapuiv,glGetpixelMapusv 返回特定的像素图 
glGetPointerv 返回顶点数据数组的地址 
glGetPolygonStipple 返回多边形的点图案 
glGetString 返回描述当前OpenGl连接的字符串 
glGetTexEnvfv 返回纹理环境参数 
glGetTexGendv,glGetTexGenfv,glGetTexGeniv 返回纹理坐标生成参数 
glGetTexImage 返回一个纹理图象 
glGetTexLevelParameterfv,glGetTexLevelParameteriv 返回特定的纹理参数的细节级别 
glGetTexParameterfv,glGetTexParameteriv 返回纹理参数值 
glHint 定义实现特殊的线索 
glIndex 建立当前的色彩索引 
glIndexMask 控制写色彩索引缓冲区里的单独位 
GlIndexPointer 定义一个颜色索引数组 
glInitName 初始化名字堆栈 
glInterleavedArrays 同时定义和允许几个在一个大的数组集合里的交替数组 
glIsEnabled 定义性能是否被允许 
glIsList 检测显示列表的存在 
glIsTexture 确定一个名字对应一个纹理 
glLightf,glLighti,glLightfv,glLightiv 设置光源参数 
glLightModelf,glLightModeli,glLightModelfv,glLightModeliv 设置光线模型参数 
glLineStipple 设定线点绘图案 
glLineWidth 设定光栅线段的宽 
glListBase 为glcallList设定显示列表的基础 
glLoadIdentity 用恒等矩阵替换当前矩阵 
glLoadMatrixd,glLoadMatrif 用一个任意矩阵替换当前矩阵 
glLoadName 将一个名字调入名字堆栈 
glLogicOp 为色彩索引渲染定义一个逻辑像素操作 
glMap1d,glMap1f 定义一个一维求值程序 
glMap2d,glMap2f 定义一个二维求值程序 
glMapGrid1d,glMapGrid1f,glMapgrid2d,glMapGrid2f 定义一个一维或二维网格 
glMaterialf,glMateriali,glMateriafv,glMaterialiv 为光照模型定义材质参数 
glMatrixMode 定义哪一个矩阵是当前矩阵 
glMultMatrixd,glMultMatrixf 用当前矩阵与任意矩阵相乘 
glNewList,glEndList 创建或替换一个显示列表 
glNormal 设定当前顶点法向 
glNormalPointer 设定一个法向数组 
glOrtho 用垂直矩阵与当前矩阵相乘 
glPassThrough 在反馈缓冲区做记号 
glPixelMapfv,glPixelMapuiv,glPixelMapusv 设定像素交换图 
glPixelStoref,glpixelStorei 设定像素存储模式 
glPixelTransferf,glPixelTransferi 设定像素存储模式 
glPixelZoom 设定像素缩放因数 
glPointSize 设定光栅点的直径 
glPolygonMode 选择一个多边形的光栅模式 
glPolygonOffset 设定OpenGL用于计算深度值的比例和单元 
glPolygonStipple 设定多边形填充图案 
glPrioritizeTextures 设定纹理固定的优先级 
glPushAttrib,glPopAttrib 属性堆栈的压入和弹出操作 
glPushClientAttrib,glPopClientAttrib 在客户属性堆栈存储和恢复客户状态值 
glPushmatrix,glPopMatrix 矩阵堆栈的压入和弹出操作 
glPushName,glPopName 名字堆栈的压入和弹出操作 
glRasterPos 定义像素操作的光栅位置 
glreadBuffer 为像素选择一个源色彩缓冲区 
glReadPixels 从帧缓冲区读取一组数据 
glRectd,glRectf,glRecti,glRects,glRectdv,glRectfv,glRectiv,glRectsv 绘制一个三角形 
glRenderMode定义光栅模式 
glRotated,glRotatef 将旋转矩阵与当前矩阵相乘 
glScaled,glScalef 将一般的比例矩阵与当前矩阵相乘 
glScissor 定义裁减框 
glSelectBuffer 为选择模式值建立一个缓冲区 
glShadeModel 选择平直或平滑着色 
glStencilFunc 为模板测试设置功能和参照值 
glStencilMask 控制在模板面写单独的位 
glStencilOp 设置激活模式测试 
glTexCoord 设置当前纹理坐标 
glTexCoordPointer 定义一个纹理坐标数组 
glTexEnvf,glTexEnvi,glTexEnvfv,glTexEnviv 设定纹理坐标环境参数 
glTexGend,glTexgenf,glTexGendv,glTexGenfv,glTexGeniv 控制纹理坐标的生成 
glTexImage1D 定义一个一维的纹理图象 
glTexImage2D 定义一个二维的纹理图 
glTexParameterf,glTexParameteri,glTexParameterfv,glTexParameteriv 设置纹理参数 
glTexSubImage1D 定义一个存在的一维纹理图像的一部分,但不能定义新的纹理 
glTexSubImage2D 定义一个存在的二维纹理图像的一部分,但不能定义新的纹理 
glTranslated,glTranslatef 将变换矩阵与当前矩阵相乘 
glVertex 定义一个顶点 
glVertexPointer 设定一个顶点数据数组 
glViewport 设置视窗



[OpenGL应用函数库] 
gluBeginCurve,gluEndCurve 定义一条不一至的有理的NURBS曲线 
gluBeginPolygon,gluEndPolygon 定义一个非凸多边形 
gluBeginSurface,gluEndSurface 定义一个NURBS曲线 
gluBeginTrim,gluEndTrim 定义一个NURBS整理循环 
gluBuild1Dmipmaps 建立一维多重映射 
gluBuild2Dmipmaps 建立二维多重映射 
gluCylinder 绘制一个圆柱 
gluDeleteNurbsRenderer 删除一个NURBS对象 
gluDeleQuadric 删除一个二次曲面对象 
gluDeleteTess 删除一个镶嵌对象 
gluDisk 绘制一个盘子 
gluErrorString 根据OpenGL或GLU错误代码产生错误字符串 
gluGetNutbsProperty 得到一个NURBS属性 
gluGetString 得到一个描述GLU版本号或支持GLU扩展调用的字符串 
gluGetTessProperty 得到一个镶嵌对象 
gluLoadSamplingMatrices 加载NUMRBS例子和精选矩阵 
gluLookAt 设定一个变换视点 
gluNewNurbsRenderer 创建一个NURBS对象 
gluNewQuadric 建立一个二次曲面对象 
gluNewTess 建立一个镶嵌对象 
gluNextContour 为其他轮廓的开始做标记 
gluNurbsCallback 为NURBS对象设定一个回调 
gluNnrbsCurve 设定一个NuRBS曲线的形状 
gluNurbsProperty 设定一个NURBS属性 
gluNurbsSurface 定义一个NURBS表面的形状 
gluOrtho2D 定义一个二位正交投影矩阵 
gluPartialDisk 绘制一个盘子的弧 
gluPerspective 设置一个透视投影矩阵 
gluPickMatrix 定义一个拾取区间 
gluProject 将对象坐标映射为窗口坐标 
gluPwlCurve 描述一个分段线性NURBS修剪曲线 
gluQuadricCallback 为二次曲面对象定义一个回调 
gluQuadricDrawStyle 为二次曲面设定合适的绘制风格 
gluQuadricNormals 定义二次曲面所用的法向的种类 
gluQuadricOrientation 定义二次曲面内部或外部方向 
gluQuadricTexture 定义是否带二次其面做纹理帖图 
gluScaleImage 将图象变换为任意尺寸 
gluSphere 绘制一个球体 
gluTessBeginContour,gluTessEndContour 划定一个边界描述 
gluTessBeginPolygon,gluTessEndPolygon 划定一个多边形描述 
gluTessCallback 为镶嵌对象定义一个回调 
gluTessNormal 为一个多边行形定义法向 
gluTessProperty 设置镶嵌对象的属性 
gluTessVertex 定义在一个多边形上的顶点 
gluUnProject 将窗口坐标映射为对象坐标
posted @ 2011-02-28 22:01 lbeing 阅读(121) 评论(0) 编辑

2011年1月24日

 


  字号:
 订阅

Android给每个APK进程分配一个单独的用户空间,其manifest中的userid就是对应一个Linux用户
(Android 系统是基于Linux)的.
所以不同APK(用户)间互相访问数据默认是禁止的.
但是它也提供了2种APK间共享数据的形式:
1. Share Preference. / Content Provider
APK可以指定接口和数据给任何其他APK读取. 需要自己实现接口和Share的数据.
本文对于这个不做详细解释

2. Shared User id
通过Shared User id,拥有同一个User id的多个APK可以配置成运行在同一个进程中.所以默认就是
可以互相访问任意数据. 也可以配置成运行成不同的进程, 同时可以访问其他APK的数据目录下的
数据库和文件.就像访问本程序的数据一样.
比如某个公司开发了多个Android 程序, 那么可以把数据,图片等资源集中放到APK  A中去. 然后
这个公司的所有APK都使用同一个User ID, 那么所有的资源都可以从APK A中读取.

举个例子:
APK A 和APK B 都是C公司的产品,那么如果用户从APK A中登陆成功.那么打开APK B的时候就不用
再次登陆. 具体实现就是 A和B设置成同一个User ID:
    * 在2个APK的AndroidManifest.xml 配置User ID:
    <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.android.demo.a1"
    android:sharedUserId="com.c">
   这个"com.c" 就是user id, 然后packagename APK A就是上面的内容,  APK B可能
   是"com.android.demo.b1" 这个没有限制

这个设定好之后, APK B就可以像打开本地数据库那样 打开APK A中的数据库了.
APK A把登陆信息存放在A的数据目录下面. APK B每次启动的时候读取APK A下面的数据库
判断是否已经登陆:
APK B中的代码:
            friendContext = this.createPackageContext(
                    "com.android.demo.a1",
                    Context.CONTEXT_IGNORE_SECURITY);
通过A的package name 就可以得到A的 packagecontext
通过这个context就可以直接打开数据库

 

posted @ 2011-01-24 09:45 lbeing 阅读(786) 评论(0) 编辑

2011年1月23日

"Whatever you undertake, act with prudence and consider the consequences" Anon

No matter how comfortable a schedule looks at the beginning of an iteration, you can't avoid being under pressure some of the time. If you find yourself having to choose between "doing it right" and "doing it quick" it is often appealing to "do it quick" on the understanding that you'll come back and fix it later. When you make this promise to yourself, your team, and your customer, you mean it. But all too often the next iteration brings new problems and you become focused on them. This sort of deferred work is known as technical debt and it is not your friend. Specifically, Martin Fowler calls this deliberate technical debt in his taxonomy of technical debt, which should not be confused with inadvertent technical debt.

Technical debt is like a loan: You benefit from it in the short-term, but you have to pay interest on it until it is fully paid off. Shortcuts in the code make it harder to add features or refactor your code. They are breeding grounds for defects and brittle test cases. The longer you leave it, the worse it gets. By the time you get around to undertaking the original fix there may be a whole stack of not-quite-right design choices layered on top of the original problem making the code much harder to refactor and correct. In fact, it is often only when things have got so bad that you must fix it, that you actually do go back to fix it. And by then it is often so hard to fix that you really can't afford the time or the risk.

There are times when you must incur technical debt to meet a deadline or implement a thin slice of a feature. Try not to be in this position, but if the situation absolutely demands it, then go ahead. But (and this is a big BUT) you must track technical debt and pay it back quickly or things go rapidly downhill. As soon as you make the decision to compromise, write a task card or log it in your issue tracking system to ensure that it does not get forgotten.

If you schedule repayment of the debt in the next iteration, the cost will be minimal. Leaving the debt unpaid will accrue interest and that interest should be tracked to make the cost visible. This will emphasize the effect on business value of the project's technical debt and enables appropriate prioritization of the repayment. The choice of how to calculate and track the interest will depend on the particular project, but track it you must.

 

Pay off technical debt as soon as possible. It would be imprudent to do otherwise.

posted @ 2011-01-23 21:46 lbeing 阅读(29) 评论(0) 编辑

2010年9月29日

摘要: 最近写的一个程序中内存会不断增加,网上查找相关资料。整理如下:0:原因:Java的内存管理与内存泄露(http://immortal.5d6d.com/thread-36-1-1.html)Java内存泄漏是每个Java程序员都会遇到的问题,程序在本地运行一切正常,可是布署到远端就会出现内存无限制的增长,最后系统瘫痪,那么如何最快最好的检测程序的稳定性,防止系统崩盘,作者用自已的亲身经历与各位网友...阅读全文
posted @ 2010-09-29 23:28 lbeing 阅读(2888) 评论(0) 编辑

2010年8月18日

posted @ 2010-08-18 20:45 lbeing 阅读(128) 评论(0) 编辑
posted @ 2010-08-18 11:00 lbeing 阅读(153) 评论(0) 编辑

2010年8月12日

摘要: 代码阅读全文
posted @ 2010-08-12 23:26 lbeing 阅读(680) 评论(2) 编辑
posted @ 2010-08-12 23:24 lbeing 阅读(1699) 评论(0) 编辑

公告

导航

统计