Android OpenGL ES 开发教程(25):OpenGL光照模型

前面绘制球体时Android OpenGL ES 开发教程(22):绘制一个球体 ,为了能看出3D效果,给场景中添加光源。如果没有光照,绘出的球看上去和一个二维平面上圆没什么差别,如下图,左边为有光照效果的球体,右边为同一个球体但没有设置光源,看上去就没有立体效果,因此OpenGL 光照效果对显示3D效果非常明显。

在OpenGL 光照模型中光源和光照效果可以细分为红,绿,蓝三个部分,光源由红,绿,蓝强度来定义,而物体表面材料由其反射红,绿,蓝的程度和方向来定义。OpenGL 光照模型使用的计算公式是对于现实世界光照的一个近似但效果非常好并适合快速计算。

OpenGL 光照模型中定义的光源可以分别控制,打开或关闭,OpenGL ES支持最多八个光源。

OpenGL 光照模型中最终的光照效果可以分为四个组成部分:Emitted(光源), ambient(环境光),diffuse(漫射光)和specular(镜面反射光),最终结果由这四种光叠加而成。

Emitted : 一般只发光物体或者光源,这种光不受其它光源的影响。

ambient: 指光线经过多次反射后已经无法得知其方向(可以看作来自所有方向),可以成为环境光,该光源如果射到某个平面,其反射方向为所有方向。Ambient 不依赖于光源的方向。

diffuse:当一束平行的入射光线射到粗糙的表面时,因面上凹凸不平,所以入射线虽然互相平行,由于各点的法线方向不一致,造成反射光线向不同的方向无规则地反射,这种反射称之为“漫反射”或“漫射”。这个反射的光则称为漫射光。漫射光射到某个平面时,其反射方向也为所有方向。diffuse 只依赖于光源的方向和法线的方向。

specular : 一般指物体被光源直射的高亮区域,也可以成为镜面反射区,如金属。specular依赖于光源的方向,法线的方向和视角的方向。

尽管光源可能只发送某一频率的光线,但ambient,diffuse和specular可能不同。比如使用白光照射一堵红墙,散射的光线可能为红色。OpenGL允许为光源分别设置红,绿,蓝三个元素的值。

最终决定所看到物体的颜色除了光源的颜色和方向外,还取决于物体本身的颜色,比如红色的光照在红色的物体和蓝色的物体,最终看到的物体一个还是红色,一个为黑色。OpenGL 中对物体材料(Material)的颜色是通过其反射红,绿,蓝的比例来定义的。 和光源一样,物体的颜色也可以有不同的ambient,diffuse和specular,表现为反射这些光的比例。ambient,diffuse反射通常为同样的颜色,而specular常常表现为白色或灰色光,如使用白光照射一个红色的球,球的大部分区域显示为红色,而高亮区域为白色。

LWUIT 开发教程(3): UI Widgets 类继承关系

LWUIT为UI开发包,它提供了多种UI控件,如Label,Button,采用的是和其它平台如(Android,.Net Winform)类似的Composite Pattern 为UI中各种控件定义了继承关系,随UI开发包定义了如下UI控件:

其中Component 为所有UI控件的基类,为一个含绘图区域并支持用户交互的对象,UI库所有其它UI控件都是它的子类。

Container 支持在一个UI控件中嵌套其它UI控件,并可以为Container设置不同的布局Layout。

Form和Dialog可以作为UI 层次的根元素,一般一个界面可以使用一个Form子类。

和Swing和其它UI库一样,LWUIT也采用的是单UI线程设计(称为UI线程或主线程),因此所有的UI操作必须发生在UI线程中。

后面将逐个介绍LWUIT的UI控件,Layout 管理,自定义UI控件等等。

LWUIT 开发教程(2): Hello World

前面对LWUIT做了概述,本篇介绍LWUIT的开发环境并给出第一个例子“Hello World”。

后面的例子将都采用NetBean作为开发IDE,Netbean可以从http://netbeans.org/ 下载,目前的版本为7.0,缺省自带Java(TM) ME Platform SDK 3.0. 但个人建议还是是使用WTK 2.5.2 作为模拟器。可以从Oracle (sun)网站上下载 或从本网站上下载.

然后下载LWUIT开发包 或在本站下载

安装好Netbean 和WTK 2.5.2 后,可以将WTK 2.5.2 作为一个Java ME平台添加到Netbean中。Tools->Java Platforms->Add Platform->Java ME MIDP Platform Emulator

然后可以之间打开LWUIT 1.4 自带的几个例子,比如打开UIDemo, 打开UIDemo项目属性,将其运行Platform改成WTK2.5.2.

如果希望模拟器支持触摸屏,可以修改DefaultColorPhone.properties 文件(缺省目录为C:\WTK2.5.2\wtklib\devices\DefaultColorPhone),将touch_screen设为true(touch_screen=true)即可。

运行UIDemo,如下:

后面会结合UIDemo介绍LWUIT开发。

本篇新建一个工程HelloWorld. 使用Netbean新建一个Java ME Mobile Application项目,注意不要选中Create Hello MIDlet,因为我们不使用Netbean提供的UI设计器,而是使用LWUIT开发。

选择WTK2.5.2 为开发模拟器。

添加对LWUIT开发库的引用,打开HelloWorld项目属性,选择Libraries & Resources ,选择Add Jar/zip ,添加对LWUIT库的引用:

将UIDemo 的LWUITtheme.res 拷贝到HelloWorld 的src 目录下(其实这一步不是必须的,支持LWUIT缺省的主题不好看:-),这里暂时借用一下UIDemo的主题资源,后面有制作主题资源的详细介绍)。

如果正式参加HelloWorld Java ME MIDlet 应用,因此希望你有一些Java ME MIDP开发的基本知识,MIDlet可以看作是Java ME平台上应用程序的基本类型。

创建一个HelloMidlet

import com.sun.lwuit.Display;
import com.sun.lwuit.Form;
import com.sun.lwuit.Label;
import com.sun.lwuit.layouts.BorderLayout;
import com.sun.lwuit.plaf.UIManager;
import com.sun.lwuit.util.Resources;
import javax.microedition.midlet.MIDlet;

/**
 * @author james
 */
public class HelloMidlet extends MIDlet {

 public void startApp() {

 //init the LWUIT display
 Display.init(this);

 //setting the application theme
 try{
 Resources r=Resources.open("/LWUITtheme.res");
 UIManager.getInstance()
 .setThemeProps(r.getTheme
 (r.getThemeResourceNames()[0]));
 }catch (Exception e){}

 Form f=new Form();
 f.setTitle("Hello World");
 f.setLayout(new BorderLayout());
 f.addComponent("Center",
 new Label("My first LWUIT app"));
 f.show();

 }

 public void pauseApp() {
 }

 public void destroyApp(boolean unconditional) {
 }
}

使用LWUIT 开发Java ME应用的第一步是初始化LWUIT Display,这是提供传入MIDlet对象给Display的init方法,这个方法必须放在其它任何LWUIT方法之前。本例使用一个Form做为主界面,标题为Hello World, Form中间显示一个Label。后面将逐步介绍LWUIT支持的UI控件和主题制作等。

开发环境为Netbean IDE。

示例代码可以使用SVN 下载svn checkout http://lwuit-tutorials.googlecode.com/svn/trunk/ lwuit-tutorials-read-only

Android ApiDemos示例解析(199):总结

前面基本介绍完Android ApiDemos中除与OpenGL ES相关的所有示例,

ApiDemo详细介绍了Android平台主要API,分成了

  • App
  • Content
  • Graphics
  • Media
  • OS
  • Text
  • Views

几个大类,每个大类又分为几个小类,一共大约有200多个实例,涵盖了Android OS API的各个方面,下面是所有示例的列表:

App/Activity/Animation
App/Activity/Custom Dialog
App/Activity/Custom Title
App/Activity/Dialog
App/Activity/Forwarding
App/Activity/Hello World
App/Activity/Persistent State
App/Activity/QuickContactsDemo
App/Activity/Receive Result
App/Activity/Redirection
App/Activity/Reorder Activities
App/Activity/Save & Restore State
App/Activity/SetWallpaper
App/Activity/Translucent
App/Activity/Translucent Blur
App/Activity/Wallpaper
App/Alarm/Alarm Controller
App/Alarm/Alarm Service
App/Device Admin
App/Dialog
App/Intents
App/Launcher Shortcuts
App/Menu/Inflate from XML
App/Notification/IncomingMessage
App/Notification/Notifying Service Controller
App/Notification/NotifyWithText
App/Notification/Status Bar
App/Preferences/1. Preferences from XML
App/Preferences/2. Launching preferences
App/Preferences/3. Preference dependencies
App/Preferences/4. Default values
App/Preferences/5. Preferences from code
App/Preferences/6. Advanced preferences
App/Search/Invoke Search
App/Search/Query Search Results
App/Service/Foreground Service Controller
App/Service/Local Service Binding
App/Service/Local Service Controller
App/Service/Messenger Service
App/Service/Remote Service Binding
App/Service/Remote Service Controller
App/Service/Service Start Arguments Controller
App/Text-To-Speech
App/Voice Recognition
Content/Assets/Read Asset
Content/Resources/Resources
Content/Resources/Styled Text
Content/Storage/External Storage
Graphics/AlphaBitmap
Graphics/AnimateDrawables
Graphics/Arcs
Graphics/BitmapDecode
Graphics/BitmapMesh
Graphics/BitmapPixels
Graphics/CameraPreview
Graphics/Clipping
Graphics/ColorFilters
Graphics/ColorMatrix
Graphics/Compass
Graphics/CreateBitmap
Graphics/Density
Graphics/Drawable/GradientDrawable
Graphics/Drawable/ShapeDrawable
Graphics/FingerPaint
Graphics/Layers
Graphics/MeasureText
Graphics/PathEffects
Graphics/PathFillTypes
Graphics/Patterns
Graphics/Pictures
Graphics/Points
Graphics/PolyToPoly
Graphics/PurgeableBitmap/NonPurgeable
Graphics/PurgeableBitmap/Purgeable
Graphics/Regions
Graphics/RoundRects
Graphics/ScaleToFit
Graphics/SensorTest
Graphics/Sweep
Graphics/Text Align
Graphics/Touch Paint
Graphics/Typefaces
Graphics/UnicodeChart
Graphics/Vertices
Graphics/Xfermodes
Media/MediaPlayer
Media/VideoView
OS/Morse Code
OS/Sensors
OS/SMS Messaging
Text/Linkify
Text/LogTextBox
Text/Marquee
Views/Animation/3D Transition
Views/Animation/Interpolators
Views/Animation/Push
Views/Animation/Shake
Views/Auto Complete/1. Screen Top
Views/Auto Complete/2. Screen Bottom
Views/Auto Complete/3. Scroll
Views/Auto Complete/4. Contacts
Views/Auto Complete/5. Contacts with Hint
Views/Auto Complete/6. Multiple items
Views/Buttons
Views/Chronometer
Views/Controls/1. Light Theme
Views/Controls/2. Default Theme
Views/Custom
Views/Date Widgets/1. Dialog
Views/Date Widgets/2. Inline
Views/Expandable Lists/1. Custom Adapter
Views/Expandable Lists/2. Cursor (People)
Views/Expandable Lists/3. Simple Adapter
Views/Focus/1. Vertical
Views/Focus/2. Horizontal
Views/Focus/3. Circular
Views/Focus/4. Internal Selection
Views/Gallery/1. Photos
Views/Gallery/2. People
Views/Grid/1. Icon Grid
Views/Grid/2. Photo Grid
Views/ImageButton
Views/ImageSwitcher
Views/ImageView
Views/Layout Animation/1. Grid Fade
Views/Layout Animation/2. List Cascade
Views/Layout Animation/3. Reverse Order
Views/Layout Animation/4. Randomize
Views/Layout Animation/5. Grid Direction
Views/Layout Animation/6. Wave Scale
Views/Layout Animation/7. Nested Animations
Views/Layouts/Baseline/1. Top
Views/Layouts/Baseline/2. Bottom
Views/Layouts/Baseline/3. Center
Views/Layouts/Baseline/4. Everywhere
Views/Layouts/Baseline/5. Multi-line
Views/Layouts/Baseline/6. Relative
Views/Layouts/Baseline/Nested Example 1
Views/Layouts/Baseline/Nested Example 2
Views/Layouts/Baseline/Nested Example 3
Views/Layouts/LinearLayout/1. Vertical
Views/Layouts/LinearLayout/10. Background Image
Views/Layouts/LinearLayout/2. Vertical (Fill Screen)
Views/Layouts/LinearLayout/3. Vertical (Padded)
Views/Layouts/LinearLayout/4. Horizontal
Views/Layouts/LinearLayout/5. Simple Form
Views/Layouts/LinearLayout/6. Uniform Size
Views/Layouts/LinearLayout/7. Fill Parent
Views/Layouts/LinearLayout/8. Gravity
Views/Layouts/LinearLayout/9. Layout Weight
Views/Layouts/RelativeLayout/1. Vertical
Views/Layouts/RelativeLayout/2. Simple Form
Views/Layouts/ScrollView/1. Short
Views/Layouts/ScrollView/2. Long
Views/Layouts/ScrollView/3. Internal Selection
Views/Layouts/TableLayout/01. Basic
Views/Layouts/TableLayout/02. Empty Cells
Views/Layouts/TableLayout/03. Long Content
Views/Layouts/TableLayout/04. Stretchable
Views/Layouts/TableLayout/05. Spanning and Stretchable
Views/Layouts/TableLayout/06. More Spanning and Stretchable
Views/Layouts/TableLayout/07. Column Collapse
Views/Layouts/TableLayout/08. Toggle Stretch
Views/Layouts/TableLayout/09. Toggle Shrink
Views/Layouts/TableLayout/10. Simple Form
Views/Layouts/TableLayout/11. Gravity
Views/Layouts/TableLayout/12. Cell Spanning
Views/Lists/1. Array
Views/Lists/10. Single choice list
Views/Lists/11. Multiple choice list
Views/Lists/12. Transcript
Views/Lists/13. Slow Adapter
Views/Lists/14. Efficient Adapter
Views/Lists/2. Cursor (People)
Views/Lists/3. Cursor (Phones)
Views/Lists/4. ListAdapter
Views/Lists/5. Separators
Views/Lists/6. ListAdapter Collapsed
Views/Lists/7. Cursor (Phones)
Views/Lists/8. Photos
Views/Lists/9. Array (Overlay)
Views/Progress Bar/1. Incremental
Views/Progress Bar/2. Smooth
Views/Progress Bar/3. Dialogs
Views/Progress Bar/4. In Title Bar
Views/Radio Group
Views/Rating Bar
Views/ScrollBars/1. Basic
Views/ScrollBars/2. Fancy
Views/ScrollBars/3. Style
Views/Seek Bar
Views/Spinner
Views/Tabs/Content By Factory
Views/Tabs/Content By Id
Views/Tabs/Content By Intent
Views/TextSwitcher
Views/Visibility
Views/WebView

另外提供了Android ApiDemos 索引页面

Android ApiDemos示例解析(198):Views->WebView

本例介绍了WebView的最简单的用法,显示HTML 链接, 其实WebView的功能远不止如此,你基本上可以使用WebView实现你自己的浏览器。

WebView内部使用了WebKit 实现网页的前翻和后退,放大,缩小,网页搜索等,如果要打开内置的缩放控制,可以调用WebSettings.setBuiltInZoomControls(boolean)。

此外,如果WebView需要访问Internet,需要在 AndroidManifest.xml 中添加INTERNET 权限:

<uses-permission android:name=”android.permission.INTERNET” />

基本用法:

缺省情况下WebView 没有提供和Browser类似的UI,也不支持JavaScript,同时也忽略网页错误,如果只是为了显示HTML文档,这个缺省设置是够用了,但如果需要支持用户交互,可以通过URL启动Android系统浏览器。

 Uri uri = Uri.parse("http://www.example.com");
 Intent intent = new Intent(Intent.ACTION_VIEW, uri);
 startActivity(intent);

本例将WebView 显示一个HTML链接:

setContentView(R.layout.webview_1);

final String mimeType = "text/html";
final String encoding = "utf-8";

WebView wv;

wv = (WebView) findViewById(R.id.wv1);
wv.loadData("<a href='x'>Hello World! - 1</a>", mimeType, encoding);
...

Android ApiDemos示例解析(197):Views->Visibility

View缺省为可见的,在应用可以通过setVisibility 修改View的可见性,View可用性可以有如下三种状态:

  • View.VISIBLE View可见
  • View.INVISIBLE View不可以见,但仍然占据可见时的大小和位置。
  • View.GONE View不可见,且不占据空间。

本例使用三个按钮来修改View B的可见性:

OnClickListener mVisibleListener = new OnClickListener() {
 public void onClick(View v) {
 mVictim.setVisibility(View.VISIBLE);
 }
};

OnClickListener mInvisibleListener = new OnClickListener() {
 public void onClick(View v) {
 mVictim.setVisibility(View.INVISIBLE);
 }
};

OnClickListener mGoneListener = new OnClickListener() {
 public void onClick(View v) {
 mVictim.setVisibility(View.GONE);
 }
};