作用:
1、对于一个没有被载入或者想要动态载入的界面, 都需要使用inflate来载入.
2、对于一个已经载入的Activity, 就可以使用实现了这个Activiyt的的findViewById方法来获得其中的界面元素.
方法:
Android里面想要创建一个画面的时候, 初学一般都是新建一个类, 继承Activity基类, 然后在onCreate里面使用setContentView方法来载入一个在xml里定义好的界面.
其实在Activity里面就使用了LayoutInflater来载入界面, 通过getSystemService(Context.LAYOUT_INFLATER_SERVICE)方法可以获得一个 LayoutInflater, 然后使用inflate方法来载入layout的xml,
// Inflate our contents, and add it (to ourself) as a child.
//Obtains the LayoutInflater from the given context.
LayoutInflater inflater = LayoutInflater.from(context);
//Inflate a new view hierarchy from the specified xml resource.
inflater.inflate(
R.layout.incall_touch_ui, // resource
this, // root
true);
一般我们要重写这个方法:
protected void onFinishInflate() {
super.onFinishInflate();
//处理动态装载后的逻辑代码
// Look up the various UI elements.
// "Dial-to-answer" widget for incoming calls.
mIncomingCallWidget = (SlidingTab) findViewById(R.id.incomingCallWidget);
mIncomingCallWidget.setLeftTabResources(
R.drawable.ic_jog_dial_answer,
com.android.internal.R.drawable.jog_tab_target_green,
com.android.internal.R.drawable.jog_tab_bar_left_answer,
com.android.internal.R.drawable.jog_tab_left_answer
);
mIncomingCallWidget.setRightTabResources(
R.drawable.ic_jog_dial_decline,
com.android.internal.R.drawable.jog_tab_target_red,
com.android.internal.R.drawable.jog_tab_bar_right_decline,
com.android.internal.R.drawable.jog_tab_right_decline
);
......
......
}
这一节我们使用定向光,涉及漫射光的高级应用和镜面光源。
我们将展示镜面光的显示效果,使用红色的小球和照在小球上的光源。
程序代码:
第一步依然是定义属性值,这里我们要加上镜面光的属性值定义。
float lightAmbient[] = { 0.2f, 0.0f, 0.0f, 1.0f };
float lightDiffuse[] = { 0.5f, 0.0f, 0.0f, 1.0f };
float lightSpecular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
同样,定义材质对镜面光的反射值
float matAmbient[] = { 1.0f, 1.0f, 1.0f, 1.0f };
float matDiffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };
float matSpecular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
因为是定向光,所以我们需要知道光的位置和方向,下面代码就是定义位置和方向,
float lightPosition[] = { 2.0f, 2.0f, 3.0f, 0.0f };
float lightDirection[] = { -2.0f, -2.0f, -3.0f };
下面启用第一个光源
void init()
{
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
设置材质属性
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, matAmbient);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, matDiffuse);
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, matSpecular);
另一个可以用glMaterialf 设置的属性是GL_SHININESS,它的值在0到128之间,它表明镜面光的焦距度,值越大镜面光焦距越多。
glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 20.0f);
下一步设置光属性
glLightfv(GL_LIGHT0, GL_AMBIENT, lightAmbient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, lightDiffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, lightSpecular);
设置光源的位置和方向,使用glLightfv 函数,它的第二个参数可以指明设置的是位置还是方向。
glLightfv(GL_LIGHT0, GL_POSITION, lightPosition);
glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, lightDirection);
另一个有用的标记是GL_SPOT_CUTOFF,它指定光锥体的大小,想象一个火把远离你时所产生的火光锥体,1.2将产生2.4度大的光锥体,如果设置为180度,则发射的光会照到各个角落。
glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 1.2f);
我们要讨论的下一个标记是GL_SPOT_EXPONENT,它控制圆锥体内光强分布的指数因子,值在0到128之间,值越大,锥体轴线部分的光越强。
glLightf(GL_LIGHT0, GL_SPOT_EXPONENT, 20.0f);
glLightf 函数还有三个标记可以设置,是用来控制衰减方式的,分别是:GL_CONSTANT_ATTENUATION(1),
GL_LINEAR_ATTENUATION(0),GL_QUADRATIC_ATTENUATION。即常数衰减,线性衰减和二次衰减。括号中的值是
它的默认值。
衰减指的是光的强度逐渐减弱,就像你离火光越来越远一样。设置这些属性会导致程序大幅减慢。
display 函数余下部分不变。
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClearDepthf(1.0f);
glEnable(GL_CULL_FACE);
glShadeModel(GL_SMOOTH);
}
我们简单的使用glutSolidSphere / ugSolidSpheref 来创建求面体,这个球面体由水平24栈和垂直24片组成,这样可以更多的体现光照细节。
也许你奇怪我们为什么没有指定球面的法线,令人高兴的是UG / GLUT|ES库中创建的形状物体,法线是自动生成的,均由库自动计算,这大大简化了我们的任务。
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
gluLookAtf(
0.0f, 0.0f, 4.0f,
0.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f);
glRotatef(xrot, 1.0f, 0.0f, 0.0f);
glRotatef(yrot, 0.0f, 1.0f, 0.0f);
ugSolidSpheref(1.0f, 24, 24);
glFlush();
glutSwapBuffers();
}
运行程序,会呈现一个红色的球,注意镜面光源在球的右上方,那么现在你可以把定向光加入自己的程序了。
注:来自3S News
Robert Scoble打算去Nevada州Stateline的Harrah’s(一家休闲中心)度一个假。从半月湾的家到Harrah’s有一段路程,Scoble连接上位置服务软件FourSquare,一边请虚拟个人助理Siri帮忙订餐,一边用FourSquare找到距离最近的麦当劳并选择最佳驾驶路径,甚至当Scoble到达目的地的时候,FourSquare报告说:“周围有29个你认识的人中,有3个人还是你的好朋友。”
看起来如此完美的位置信息服务并非是Scoble毫无根据的杜撰。Scoble是最活跃的地理位置信息服务(LBS)用户之一,仅在FourSquare上,他就有8215名好友,这一场景是他对LBS在2012年的预测——单个的LBS将以互动的方式结合起来,让我们的生活更有趣。
但仅仅是LBS的叠加,似乎还不能引起诸如Geek这样的网络潮人的兴趣,如果把位置服务和增强现实功能连接到一起呢?只要将手机对准某个方向,软件就会根据位置服务和增强现实功能,给出你面前环境的详细信息:附近有哪些热门餐厅或特色小店;哪里有银行、ATM机和诊所;甚至能够找到附近的哪些公司在招聘,哪些商场在打折销售,而你的好友正在哪里“血拼”,之后他们要去哪里进餐……得到这一切可没有什么操作门槛,刚刚接触智能手机的大妈都可应用自如。
Gartner评出了2011年移动市场10大技术趋势,增强型地理位置服务和移动互联网、移动Widgets(小工具)、移动广告工具、应用程序商店、移动宽带,触摸屏技术以及应用程序商店等同时上榜。很明显,增强型地理位置服务是地理位置服务功能上的提升,服务的增强性给了人们对于位置服务更广阔的想象空间。
目前,最吸引眼球的LBS当属应用程序Foursquare。用户可以手动控制(Check in)分享自己的位置,在游戏过程中获得周围的商业信息并和附近的好友产生互动。这种以LBS为主要应用的SNS一度成为了风险投资家追逐的对象,效仿者也络绎不绝,因为,LBS很容易通过与本地商户合作或是推送精准广告创造收入,商业模式显而易见。
6月30日,Foursquare获得了由风险投资公司安德森·霍洛维茨基金领衔的2000万美元风险投资。Google、Facebook等互联网大鳄纷纷表示很快将会推出自己的地理位置服务。其实,Google已经有了自己的LBS产品Google Latitude,其要做的是,将Latitude和新业务Buzz整合起来,只要用户的手机上安装了Google Buzz就可以和附近的用户分享内容。
与LBS一衣带水的增强现实功能正在丰富位置服务的多样性。增强现实技术是现实世界和虚拟世界的完美融合,它将虚拟的信息应用到真实世界。欧洲软件开发商SPRXmobile推出了全球首款“增强现实”浏览器Layar,通过其你可以了解到周围环境的详细信息;创立于纽约的颗豆柏德公司则致力于通过增强现实技术开发各种接合自然的应用程序和设备。通过iPhone或者其他设备的摄像头就可以巧妙的把视觉不能企及的范围以虚拟的方式呈现出来。“移动设备会成为一个替身,代你搜索周遭的一切。” 颗豆柏德公司创始人赵逸龙表示。
如果LBS和增强现实功能完美融合,诸如GPS这样单纯提供位置服务的厂商可能要失望了,技术变现的大赢家可能还将是苹果、Google、Facebook等用户黏性极强的公司。不仅仅是因为这些公司笼络了最大的用户数量、提供了不逊色于GPS的位置服务,还在于其搭建了人与人互动的平台。巨头之间的竞争或将催生更加个性化的服务,技术演进最大的受益者将从技术提供者转化为技术使用者,人与机器之间的交互最终将转化成为人与人之间的交互,终端或者说应用程序只是交互的一种方式。