OBJECT和EMBED标签

一、介绍:
我们要在网页中正常显示flash内容,那么页面中必须要有指定flash路径的标 签。也就是OBJECT和EMBED标签。OBJECT标签是用于windows平台的IE浏览器的,而EMBED是用于windows和 Macintosh平台下的Netscape Navigator浏览器以及Macintosh平台下的IE浏览器。windows平台的IE利用Activex控件来播放flash而其它的浏览器则 使用Netscape插件技术来播放flash。

下面是简单的网页中插入flash的代码示例:

Code:







二、为什么要使用以上全部的标签?能省略某些标签不?
OBJECT 标签是用于windows IE3.0及以后浏览器或者其它支持Activex控件的浏览器。“classid”和“codebase”属性必须要精确地按上例所示的写法写,它们告 诉浏览器自动下载flash player的地址。如果你没有安装过flash player 那么IE3.0以后的浏览器会跳出一个提示框访问是否要自动安装flash player。当然,如果你不想让那些没有安装flash player的用户自动下载播放器,或许你可以省略掉这些代码。
EMBED标签是用于Netscape Navigator2.0及以后的浏览器或其它支持Netscape插件的浏览器。“pluginspage”属性告诉浏览器下载flash player的地址,如果还没有安装flash player的话,用户安装完后需要重启浏览器才能正常使用。
为了确保大多数浏览器能正常显 示flash,你需要把EMBED标签嵌套放在OBJECT标签内,就如上面代码例子一样。支持Activex控件的浏览器将会忽略OBJECT标签内的 EMBED标签。Netscape和使用插件的IE浏览器将只读取EMBED标签而不会识别OBJECT标签。也就是说,如果你省略了EMBED标签,那 firefox就不能识别你的flash了(不过纳闷的是,省略了object只写embed,IE也能正常显示flash,呵呵,具体的再仔细看看 了)。

下面列出了用于发布影片的OBJECT和EMBED标签的必要以及可选属性。

一、必需属性:
·CLASSID-设置浏览器的Activex控件,仅用于OBJECT标签。
·CODEBASE-设置flash Activex控件的位置,因而如果浏览器如果没有安装的话,可以自动下载安装。仅用于OBJECT标签。
·WIDTH-以百分比或象素指定flash影片的宽度。
·HEIGHT-以百分比或象素指定flash影片的高度。
·SRC-指定影片的下载地址。仅用于EMBED标签。
·PLUGINSPAGE-设置flash 插件的位置,因而如果浏览器如果没有安装的话,可以自动下载安装。仅用于EMBED标签。
·MOVIE-指定影片的下载地址。仅用于OBJECT标签。

二、可选属性及可用的值:
·ID-设定变量名,用于脚本代码的引用。仅用于OBJECT。
·NAME -设定变量名,用于脚本代码(如javascript)的引用。仅用于EMBED。
·SWLIVECONNECT – (true或false)指定当flash player第一次下载时,是否启用java。如果些属性省略,默认值为false。你果你在相同页同使用javascript和flash,java必须使用FSCommand来工作。
·PLAY -(true或false)指定flash影片是否在下载完成后就自动播放,如果省略此属性,则默认为true。
·LOOP – (true或false)指定影片播放完最后一帧后是停止还是继续循环播放,如果省略此属性,则默认为true。
·MENU – (true或false)
·True 显示全部的菜单,允许用户放大,缩小等控制影片播放等操作。
·False 显示只包含设置选项和关于flash的菜单。
·QUALITY – (low, high, autolow, autohigh, best )
·Low 速度优于美观,而且不应用反锯齿。
·Autolow 刚开始着重于速度,但当需要时随时提升美观。
·Autohigh 同时着重播放速度和美观,但需要时则牺牲美观来保证播放速度。
·Medium 应用一些反锯齿而不平滑位图。它质量高于low设置而低于high设置。
·High 美观优于播放速度,而且一直应用反锯齿。如果影片不包含动画,位图会被平滑化;而如果影片包含动画,位图将不变平滑。
·Best 提供最好的显示质量而不考虑播放速度。所有输出都应用反锯齿及所有位图都被平滑化。
·SCALE – (showall, noborder, exactfit)
·Default(Show all)影片在指定的区域内显示,但保持原始的比例。影片两侧将会出现边框。
·No Boder 收缩影片以适合指定的区域,保持影片不失真,但部分影片将可能将裁切。然而保持影片的原始比例。
·Exact Fit 使整个影片在指定的区域内显示,影片有可能变形失真,而且不保持原始的比例。
·ALIGN – (l, t, r, b)
·默认为居中,当浏览器窗口小于影片时,边缘会被裁切。
·Left,Right,Top,Bottom按照相应的设置沿浏览器的边缘对齐。如果需要,另外三边将被裁切。
·SALIGN – (l, t, r, b, tl, tr, bl, br)
·L,R,T,B
·TL,TR
·BL,BR
·WMODE- (window, opaque, transparent) 设置flash影片的window mode属性,指定flash在浏览器中的透明,层叠及位置。
·Window 影片在浏览器中自己的矩形窗口内播放。
·Opaque 影片隐藏了所有在它后面的内容。
·Transparent 使flash影片透明,显示透明影片后面的网页内容。这将会降低动画的性能。而且这个属性不是在所有浏览器中都可用的。
·BGCOLOR – (#RRGGBB, 十六进制RGB值。)指定影片的背景颜色。使用这个属性覆盖flash中设定的背景颜色。
·BASE – 设定基准目录或URL,用来解决所以flash中的相对路径。类似网页中的标签。
·FLASHVARS 传递变量到flash player,需要flash player6及以后的版本。
·传递root级变量到影片。字符串的格式是用“&”分隔的name=value集。
·浏览器支持64kB大小的字符串长度。
·更多关于FlashVars的信息,请查看相关文档。

onInterceptTouchEvent和onTouchEvent

本帖记录onInterceptTouchEvent和onTouchEvent调用关系,即各种return true和return false的运行情况。

return true和return false,代表的是是否消费完该事件,也就是该事件是否会继续传递给下层或者上层组件继续处理。return true代表消费完不会继续传递,return false代表没有消费完将会继续传递。

如果没有onInterceptTouchEvent,只考虑onTouchEvent的话,比较容易分析和理解。假如有三层布局结构,linearLayout1,linearLayout2,textView,从前到后是包含的关系。那么下面分情况说明。
1.如果它们的onTouchEvent都返回false的话,DOWN事件会自上而下(textView位于最上层)依次传递,最终都没有消费完此事件,都只会进入onTouchEvent方法一次并且MotionEvent的action为MotionEvent.ACTION_DOWN,move和up等事件不会继续处理。
2.如果textView的onTouchEvent返回true,表示textView消费了此事件,不会传给父组件linearLayout2和linearLayout1了,并且还会继续处理move和up等事件。
3.linearLayout2和linearLayout1的onTouchEvent返回true和上面的情况一样,都不会继续传给父容器而且本身继续处理move和up等事件。
OK,这种情况还是比较容易理解的。

下面加入onInterceptTouchEvent。
onInterceptTouchEvent只有ViewGroup才会有,用于在进入自身onTouchEvent或者子组件onTouchEvent之前处理事件。注意onTouch是自上而下传递,而onInterceptTouch却是由下而上传递的。来了一个DOWN事件,首先进入的必然是最底层的viewGroup的onInterceptTouchEvent方法,然后根据return的值进入自身或者子组件的onTouch事件,当然如果子组件也是viewgroup的话,在进入子组件的onTouch之前也会进入子组件的onInterceptTouchEvent方法。
下面也分几种情况介绍:
1.当onInterceptTouchEvent返回false时,表示没有消费完此事件,会继续传递个子组件的onTouch继续处理。注意这种情况不会就不会传递给这个ViewGroup自身的onTouch事件处理了。这和onTouch如果返回false,后续的move、up等事件都不会继续处理了可以做同样理解。
2.当onInterceptTouchEvent返回true时,表示消费完此事件,或者说将在此组件上消费该事件。这种情况该事件会传递给ViewGroup自身的onTouch事件去处理,而不会传递给子组件的onTouch方法了。
由此可以总结,onInterceptTouchEvent返回值只是决定了是要把事件传递给自身的onTouch事件还是传递给子组件的onTouch事件。返回false表示没有消费完将传递个子组件的onTouch方法,返回true表示自身消费此事件,将传递给自身的onTouch方法而不会传递给子组件的onTouch方法了。

android 设置APN

android的APN设置,也就是移动网络的接入点设置,有些时候可能项目需要会用到一些专用的apn专网,如果需要用户去手动设置的话显然可行性不高,所以需要在代码中自动为客户生成一个接入点,并在应用启动的时候自动切换到改接入点,退出的时候重新换回用户的默认接入点,这里只讲关键技术点,具体实现自行研究,实践才能出真知;

1、首先了解一下APN的位置,
// APN列表资源
private static Uri APN_LIST_URI = Uri.parse(“content://telephony/carriers”);

// 默认APN资源(当前正在使用的apn)
private static Uri PREFERRED_APN_URI = Uri.parse(“content://telephony/carriers/preferapn”);

2、检测一个APN是否存
int id = -1;
ContentResolver resolver = context.getContentResolver();
Cursor c = resolver.query(APN_LIST_URI, new String[] { “_id”, “name”, “apn” }, “apn like ‘%myapn%'”, null, null); //从apn列表中查找apn名称为myapn的apn信息
if (c != null && c.moveToNext()) {
id = c.getShort(c.getColumnIndex(“_id”)); //获取该apn的id信息
System.out.println(“APN已经存在”);
} else {
System.out.println(“APN不存在”);
}

3、添加一个新的APN,设置apn的信息还需要获取当前SIM卡的运营商信息

protected String getSIMInfo() {
TelephonyManager iPhoneManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
return iPhoneManager.getSimOperator();
}

public int AddXFTApn() {
System.out.println(“添加一个新的apn ==> XFT APN”);
int apnId = -1;
String NUMERIC = getSIMInfo();
if (NUMERIC == null) {
Toast.makeText(context, “不存在SIM卡”, Toast.LENGTH_SHORT).show();
return -1;
}
ContentResolver resolver = context.getContentResolver();
ContentValues values = new ContentValues();

values.put(“name”,“专用APN”); //apn中文描述
values.put(“apn”, “myapn”); //apn名称
values.put(“type”, “default,supl”);
values.put(“numeric”, NUMERIC);
values.put(“mcc”, NUMERIC.substring(0, 3));
values.put(“mnc”, NUMERIC.substring(3, NUMERIC.length()));
values.put(“proxy”, “”);
values.put(“port”, “”);
values.put(“mmsproxy”, “”);
values.put(“mmsport”, “”);
values.put(“user”, “”);
values.put(“server”, “”);
values.put(“password”, “”);
values.put(“mmsc”, “”);
Cursor c = null;
// 获取新添加的apn的ID
try {
Uri newRow = resolver.insert(APN_LIST_URI, values);
if (newRow != null) {
c = resolver.query(newRow, null, null, null, null);
int idindex = c.getColumnIndex(“_id”);
c.moveToFirst();
apnId = idindex;
}
} catch (SQLException e) {
e.printStackTrace();
}
if (c != null)
c.close();
return apnId;
}

4、设置使用指定的apn接入点连接网络

public boolean setDefaultApn(int apnId) {
// System.out.println(“设置选中的apnID ==》 ” + apnId);
boolean res = false;
ContentResolver resolver = context.getContentResolver();
ContentValues values = new ContentValues();
values.put(“apn_id”, apnId);
try {
resolver.update(PREFERRED_APN_URI, values, null, null);
Cursor c = resolver.query(PREFERRED_APN_URI, new String[] { “name”, “apn” }, “_id=” + apnId, null, null);
if (c != null) {
res = true;
c.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
return res;
}

如何打开Anroid系统自带邮件应用

在网上很容易找到如何调用系统自带的邮件系统发送邮件,但是关于如何打开邮件应用的主界面的文章很少。

android系统一般都会带系统自带的Email应用,包括一些定制机。android自带的Email应用的包名是com.android.email,这个可以从应用管理器中查找到。只有一个包名信息打开应用不太可能。android系统允许通过组件名(ComponentName)打开一个应用。组件是包含应用包名和主Activity的对象。如何找到Email的主Activity呢?通过执行如下代码可以列如系统中所有应用的主Activity类和主包名。

private String listPackage() {

List<ApplicationInfo> mApplications = null;
PackageManager manager = getPackageManager();
Intent mainIntent = new Intent(Intent.ACTION_MAIN, null); // 取出Intent
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER); // 分辨出位默认Laucher启动的程序
final List<ResolveInfo> apps = manager.queryIntentActivities(mainIntent, 0); // 利用包管理器将起取出来
Collections.sort(apps, new ResolveInfo.DisplayNameComparator(manager));
StringBuffer sb = new StringBuffer();
if (apps != null) {
final int count = apps.size();

if (mApplications == null) {
mApplications = new ArrayList<ApplicationInfo>(count);
}
mApplications.clear();

for (int i = 0; i < count; i++) {
ResolveInfo info = apps.get(i);
sb.append(“Label:”).append(info.loadLabel(manager)).append(“;\n\r”);
sb.append(“packageName:”).append(info.activityInfo.applicationInfo.packageName).append(“;\n\r”);
sb.append(“name:”).append(info.activityInfo.name).append(“;\n\r”);
sb.append(“icon:”).append(info.activityInfo.loadIcon(manager)).append(“\n\r\n\r”);
}
}
return sb.toString();
}

通过查找发现Email的主Activity的类名是com.android.email.activity.Welcome。这样打开邮件主界面就很易容了。

ApplicationInfo application = new ApplicationInfo();
application.name = “电邮”;
application.className = “com.android.email.activity.Welcome”;
application.packageName = “com.android.email”;
ComponentName c = new ComponentName(“com.android.email”,”com.android.email.activity.Welcome”);

Intent intent = new Intent();
intent.setComponent(c);
startActivity(intent);

用DisplayMetrics判断屏幕密度

如果用下述代码判断屏幕密度,只能识别出密度为240,160,120的屏幕,其它的将无法识别;

DisplayMetrics dm = new DisplayMetrics();

switch (dm.densityDpi) {
case DisplayMetrics.DENSITY_HIGH:
break;
case DisplayMetrics.DENSITY_MEDIUM:

break;
case DisplayMetrics.DENSITY_LOW:

break;
default :

}

因为android终端种类很多,比如魅族M9的为320 所以在识别时最好加对上不是上述三种类型手机的处理:

DisplayMetrics dm = new DisplayMetrics();

switch (dm.densityDpi) {
case DisplayMetrics.DENSITY_HIGH:

break;
case DisplayMetrics.DENSITY_MEDIUM:

break;
case DisplayMetrics.DENSITY_LOW:

break;
default :
if(dm.densityDpi>DisplayMetrics.DENSITY_HIGH){

} else if(dm.densityDpi < DisplayMetrics.DENSITY_LOW){

} else {

}
}

 

如何使32位与64位的eclipse同时运行

首先,要安装两个java虚拟机32位的和64位的,分别供两个eclipse使用;

其次,分别在两个eclipse的配置文件eclipse.ini中指定各自使用的虚拟机,具体是在配置文件中增加如下:(注意:参数名称-vm与虚拟机路径在两行)

-vm
C:Program Files (x86)Javajre6bin

这样,两个eclipse能同时使用了。

另外说明一下eclipse寻找jre的优先顺序是:
1、eclipse.ini中的-vm参数所指定的虚拟机;
2、eclipse同目录下的jre;
3、系统环境变量中指定的jre;

 

android: 不需要焦点的 TextView跑马灯 MarqueeTextView

public class MarqueeTextView extends TextView {

public MarqueeTextView(Context appCon) {
super(appCon);
}

public MarqueeTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}

public MarqueeTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}

@Override
public boolean isFocused() {
return true;
}

@Override
protected void onFocusChanged(boolean focused, int direction,
Rect previouslyFocusedRect) {
}
}

android文字阴影效果

最近用到文字的阴影效果,特将研究结果写 篇文章。 关于android文字阴影,共有四个属性可以 设置: android:shadowColor :阴影颜色 android:shadowDx :阴影x方向位移 android:shadowDy :阴影y方向位移 android:shadowRadius :阴影的半径 注意:阴影的半径必须设,为0时没有效 果。 下面为改变x位移: android:shadowColor=”#ff000000″

两位为透明度) android:shadowDx=”2″ android:shadowDy=”0″ android:shadowRadius=”1″ 效果(向右为正)

下面为改变y位移: android:textColor=”#979790″ android:shadowColor=”#ff000000″ android:shadowDx=”0″ android:shadowDy=”2″ android:shadowRadius=”1″ 效果(向下为正)

下面改变半径: android:shadowDx=”1″ android:shadowDy=”1″ android:shadowRadius=”1″

android SQLite3

SQLite库可以解析大部分标准SQL语言。但它也省去了一些特性 并且加入了一些自己的新特性。这篇文档就是试图描述那些SQLite支持/不支持的SQL语法的。查看关键字列表 。

如下语法表格中,纯文本用蓝色粗体显示。非终极符号为斜体红色。作为语法一部分的运算符用黑色Roman字体表示。

这篇文档只是对SQLite实现的SQL语法的综述,有所忽略。想要得到更详细的信息,参考源代码和语法文件“parse.y”。 继续阅读android SQLite3

Android下的图形引擎

1、AngleAngle是一款专为Android平台设计的,敏捷且适合快速开发的2D游戏引擎,基于OpenGL ES技术开发。该引擎全部用Java代码编写,并且可以根据自己的需要替换里面的实现,缺陷在于文档不足,而且下载的代码中仅仅包含有少量的示例教程。

最低运行环境要求不详。

项目地址:code.google.com/p/angle/  继续阅读Android下的图形引擎