同一个表单可以根据用户的选择,提交给不同的后台处理程序。即,表单的分向提交。
如:在编写论坛程序时,如果我们希望实现用户在发送贴子的时候,既发送提交功能又有预览功能时,就会遇到上述问题。
即,当用户点击提交按钮时,我们希望表单提交给"提交"处理程序;而当用户点击预览按钮时,我们希望表单提交 给"预览"处理程序。那么,如何实现上述功能呢?下面代码可以很好的解决这个问题。
<form name="form" method="post"> 测试表单:<input name="test"><br> <input type="button" value="提交" onClick=send()> <input type="button" value="预览" onClick=preview()> </form> <script language=javascript> function send() { document.form.action="/blog_article/send.html" document.form.submit() } function preview() { document.form.action="/blog_article/preview.html" document.form.submit() } </script>
关于上面实例的两点说明:
1、在整个表单中,不应有名字为action或submit的标签,否则将会产生"对象不支持此属性和方法"的错误。如代码 "<input type='xxxx' name='action' >"在表单中是不允许出现的;
2、在form标签中应该存在name属性。即,应该给表单取一个名字。语句document.form.action和document.form.submit中的"form"也就是表单的名字。
表单的分向提交不仅仅使用在论坛的程序中,它还可以运用在许多场合下。恰当的运用表单的分向提交功能可以大大的增强网站的人性化程度。
昨天,我调试程序就出现了这样的问题,就是出现了"对象不支持此属性和方法"的错误,一直无法定位出来,都快疯掉了,后来在发现一个button命名为submit了。
1.-------- <form name="formname" action=""> <input name="inputname"> <input type="submit" onclick="document.formname.action='/blog_article/a.html'" value="button a"> <input type="submit" onclick="document.formname.action='/blog_article/b.html'" value="button b"> <input type="submit" onclick="document.formname.action='/blog_article/c.html'" value="button c"> </form> 2.---------- <input type=button name="a" value="a" onclick="this.form.action='/blog_article/a.html';this.form.submit();"> <input type=button name="b" value="b" onclick="this.form.action='/blog_article/b.html';this.form.submit();"> <input type=button name="c" value="c" onclick="this.form.action='/blog_article/c.html';this.form.submit();"> <input type=button name="d" value="d" onclick="this.form.action='/blog_article/d.html';this.form.submit();">
第五章 颜色、材料和光照
学习如何在3D场景中添加颜色以及平滑着色,如何指定一个或多个光源,并根据环境、散射和镜面成分定义它们的光照特征。
a) 在OpenGL中使用颜色,通过分别指定红、绿、蓝成分的强度来指定一种特定的颜色。设置绘图颜色void glColor<x><t>(red , green , blue , alpha);<x>表示参数的数量,<t>表示参数的数据类型。
b) 接着,讲讲着色,可以简单地定义为一种颜色到下一种颜色的平滑过渡(渐变)。glShadeModel(GL_SMOOTH),启用平滑着色,还有其他模式GL_FLAT,单调着色,即图元内部不进行着色技术,内部颜色就是最后一个顶点所指定的颜色。但GL_POLYGON图元,它的内部颜色是第一个顶点的颜色。
c) 现实世界的颜色 在OpenGL光照模型中,除非一个物体自己会发光,否则都会受到3种不同类型的光的照射:环境光(ambient)、散射光(diffuse)和镜面光(specular)。环境光并不来自任何特定的方向,散射光具有方向性,来自于一个特定的方向,镜面反射具有很强的方向性,只沿一个特定的方向反射。真实的颜色还有与材料有密切关系,光照和材料一齐影响才显示人眼看到的颜色。
d) 向场景添加光照 启动光照glEnble(GL_LIGHTING);设置光照模式GLfloat ambientLight[]={1.0f,1.0f,1.0f,1.0f}; ....glLightModelfv(GL_LIGHT_MODEL_AMBIENT , ambientLight);ambientLight是RGBA值;设置材料属性 GLfloat gray[]={0.75f,0.75f,0.75f,0.75f};.....glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,gray);另一种方法是颜色追踪,仅仅通过调用glColor来设置材料属性。代码如下:glEnable(GL_COLOR_MATERIAL); glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE);...glColor3f(0.75f,0.75f,0.75f);随着多边形的数量增加,它的执行速度将会更快。
e) 使用光源 除了强度和颜色之外,这些光源具有位置和方向。法线是很好的充当方向这个角色,使用以下函数可以找一条法线void m3dFindNormal(M3DVector3f vNormal, const M3DVector3f vP1,const M3DVector3f vP2,const M3DVector3f vP3);设置光源glEnable(GL_LIGHT0);GLfloat lightPos[]={-50.0f,50.0f,100.0f,1.0f};.......glLightfv(GL_LIGHT0,GL_POSITION,lightPos);lightPos[]包含了光的位置,最后一个值是1.0表示指定的坐标是光源的位置,当该值为0.0时则表示光是从无限远处沿着这个数组所指定的向量照射过来的。
f) 光照效果,OpenGL提供一些有关光照效果函数:镜面光glLightfv(GL_LIGHT0,GL_SPECULAR,specular);镜面反射GLfloat specref[]=(1.0f,1.0f,1.0f,1.0f);....glMaterialfv(GL_FROAT,GL_SPECULAR,specref);镜面指数glMaterial(GL_FRONT,GL_SHININESS,128);GL_SHININESS属性设置材料的镜面指数。另外还有法线均衡(normal averaging),它可以产生一些有趣的光学幻觉,可以做一些球体。
g) 有光就离不开阴影,它可以极大的提高场景的真实性以及视觉效果。用到math3d函数库的m3dMakePlanarShadowMatrix函数,它接受的参数包括我们希望阴影所出现的平面的平面方程和光源位置,它返回这个函数所创建的一个变换矩阵。
android3.0之后设置属性有专门的方式显示,基于PrefenceFragment,通过addPreferencesFromResource(R.xml.preferences);加载界面。
如图:
我的布局大致如下:
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory android:title="@string/Display">
<CheckBoxPreference
android:key="pref_hiddenFiles"
android:title="@string/Show_Hidden_Files"
android:summary="@string/Display_hidden_files_and_folders"/>
<CheckBoxPreference
android:key="pref_thumbnail"
android:title="@string/Show_Image_Thumbnails"
android:summary="@string/Display_a_thumbnail_for_image_files"/>
<ListPreference
android:key="pref_view"
android:title="@string/View_Type"
android:summary="@string/Display_files_in_a_grid_or_a_list"
android:entries="@array/view"
android:entryValues="@array/view_value"
android:dialogTitle="@string/Choose_a_View" />
</PreferenceCategory>
<PreferenceCategory android:title="@string/Sorting">
<ListPreference
android:key="pref_sorting"
android:title="@string/Sorting_Type"
android:summary="@string/Choose_how_to_sort_files_and_folders"
android:entries="@array/sorting"
android:entryValues="@array/sorting_value"
android:dialogTitle="@string/Choose_a_Sorting_Option" />
</PreferenceCategory>
<PreferenceCategory android:title="@string/folderSetting">
<CheckBoxPreference
android:key="pref_DisplayRootDir"
android:title="@string/inital_Root_Dir"
android:summary="@string/dispaly_Root_Dir"/>
</PreferenceCategory>
<PreferenceCategory android:title="@string/version_info">
<Preference
android:key="pref_version"
android:title="@string/version_number"
android:summary="@string/version_info_number">
</Preference>
<Preference
android:key="pref_check_version"
android:title="@string/check_version"
android:summary="@string/check_version_summary">
</Preference>
</PreferenceCategory>
</PreferenceScreen>
Preference中的控件有点特殊之处就是,当你运用了PreferenceFragment之后,在data->data->工程名下面有一个preference文件,该文件中记录了你的选择,如果你将checkpreference设置为选中状态,你会发现preference文件中对应的id的对应值变为true,这样的好处是为了后来取值方便,读取该文件就能获取到当前控件的状态,取值方法为:private SharedPreferences mPreferences;
mPreferences = PreferenceManager.getDefaultSharedPreferences(this);
mPreferences.getBoolean( settingFragment.PREF_HIDDEN_KEY, false);
由于Fragment的使用必须要在Activity之中,因此定义一个settingActivity,
public class settingActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
FragmentManager fragmentManager = getFragmentManager();
settingFragment setting = new settingFragment();
FragmentTransaction fragmentTransaction =fragmentManager.beginTransaction();
fragmentTransaction.replace(android.R.id.content, setting);
fragmentTransaction.commit();
}
}