http://blog.csdn.net/ameyume/archive/2010/12/28/6102137.aspx
http://blog.csdn.net/xiangyong2008/archive/2010/03/06/5348208.aspx
http://wang-peng1.iteye.com/blog/572892
http://www.bianceng.cn/OS/extra/201011/20561_3.htm
http://news.wangmeng.cn/detailNews/2183
ViewFlipper的使用
http://wang-peng1.iteye.com/blog/572892
[功能]
1. ViewFlipper 可以包含多个View 且View之间的切换有Animation 比如:渐变效果
[代码]
1. 创建包含ViewFlipper 的main.xml 还包含2个Button 用于各个View切换
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content" > <Button android:id="@+id/previousButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Previous" /> <Button android:id="@+id/nextButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Next" /> </LinearLayout> <ViewFlipper android:id="@+id/flipper" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center" > </ViewFlipper> </LinearLayout>
2. 设定 Animation 效果
flipper = (ViewFlipper) findViewById(R.id.flipper); flipper.setInAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_in)); flipper.setOutAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_out));
3. 在 ViewFlipper 里面增加各种View
flipper.addView(addTextByText("HelloAndroid")); flipper.addView(addImageById(R.drawable.beijing_003_mb5ucom)); flipper.addView(addTextByText("eoe.Android")); flipper.addView(addImageById(R.drawable.beijing_004_mb5ucom)); flipper.addView(addTextByText("Gryphone")); ublic View addTextByText(String text){ TextView tv = new TextView(this); tv.setText(text); tv.setGravity(1); return tv; } public View addImageById(int id){ ImageView iv = new ImageView(this); iv.setImageResource(id); return iv; }
4. View 切换
* 下一个View
flipper.showNext();
* 上一个View
flipper.showPrevious();
* 任意一个View
flipper.setDisplayedChild(2);
下面是一个android API demo:
import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.animation.AnimationUtils; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Spinner; import android.widget.ViewFlipper; public class Animation2 extends Activity implements AdapterView.OnItemSelectedListener { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.animation_2); mFlipper = ((ViewFlipper) this.findViewById(R.id.flipper)); mFlipper.startFlipping(); Spinner s = (Spinner) findViewById(R.id.spinner); ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, mStrings); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); s.setAdapter(adapter); s.setOnItemSelectedListener(this); } public void onItemSelected(AdapterView parent, View v, int position, long id) { switch (position) { case 0: mFlipper.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.push_up_in)); mFlipper.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.push_up_out)); break; case 1: mFlipper.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.push_left_in)); mFlipper.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.push_left_out)); break; case 2: mFlipper.setInAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_in)); mFlipper.setOutAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_out)); break; default: mFlipper.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.hyperspace_in)); mFlipper.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.hyperspace_out)); break; } } public void onNothingSelected(AdapterView parent) { } private String[] mStrings = { "Push up", "Push left", "Cross fade", "Hyperspace"}; private ViewFlipper mFlipper; }
<?xml version="1.0" encoding="utf-8"?> <!-- Copyright (C) 2007 The Android Open Source Project Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:padding="10dip" android:layout_width="fill_parent" android:layout_height="wrap_content"> <ViewFlipper android:id="@+id/flipper" android:layout_width="fill_parent" android:layout_height="wrap_content" android:flipInterval="2000" android:layout_marginBottom="20dip" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center_horizontal" android:textSize="26sp" android:text="@string/animation_2_text_1"/> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center_horizontal" android:textSize="26sp" android:text="@string/animation_2_text_2"/> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center_horizontal" android:textSize="26sp" android:text="@string/animation_2_text_3"/> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center_horizontal" android:textSize="26sp" android:text="@string/animation_2_text_4"/> </ViewFlipper> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginBottom="5dip" android:text="@string/animation_2_instructions" /> <Spinner android:id="@+id/spinner" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout>
android 自带的TextSwitcher例子:
import android.app.Activity; import android.os.Bundle; import android.view.Gravity; import android.view.View; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.widget.Button; import android.widget.TextSwitcher; import android.widget.TextView; import android.widget.ViewSwitcher; /** * Uses a TextSwitcher. */ public class TextSwitcher1 extends Activity implements ViewSwitcher.ViewFactory, View.OnClickListener { private TextSwitcher mSwitcher; private int mCounter = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.text_switcher_1); mSwitcher = (TextSwitcher) findViewById(R.id.switcher); mSwitcher.setFactory(this); Animation in = AnimationUtils.loadAnimation(this, android.R.anim.fade_in); Animation out = AnimationUtils.loadAnimation(this, android.R.anim.fade_out); mSwitcher.setInAnimation(in); mSwitcher.setOutAnimation(out); Button nextButton = (Button) findViewById(R.id.next); nextButton.setOnClickListener(this); mSwitcher.setText(String.valueOf(mCounter)); } public void onClick(View v) { mCounter++; mSwitcher.setText(String.valueOf(mCounter)); } // 重写 ViewSwitcher.ViewFactory 的 makeView()方法,返回一个 View,TextSwitcher 交换时使用 @Override public View makeView() { TextView textView = new TextView(this); textView.setGravity(Gravity.CENTER); textView.setTextSize(36); return textView; } }
首先要明确一点,不是所有的游戏都能改的。
<2006-02-01><技术资料>
今天先发个技术资料,看懂这个技术资料就不用继续看了;不懂也没关系,我会慢慢讲解的,不过就要等一段时间了,我写得很慢得。。。
觉得有用就帮忙顶上。
以下摘抄自官方网站的N830 JavaSpec V1 (CH)
5.JAD(ADF)文件
文字编码用UTF-8。另外下面JAD和ADF两者使用时,视为同一来表示。
有关JAD(ADF)文件的注意事项。
$ JAD(ADF)大小的最大值为2Kbyte
$ MIDlet-Jar-Size的最大值为256Kbyte
$ JAD(ADF)的记述Syntax遵循MIDP1.0。
$ 属性名有大小写区别。
$ 表1中规定的【必选】属性必须要设置。
$ 同一属性名不能重复2次以上。
$ 属性值请遵循表1的Format。属性值不能省略。
$ 使用RMS时,MIDlet-Data-Size必须设置适当的值。(能够Manifest指定)
$ MIDlet通信时,需要将MIDlet-UseNetwork设置为YES。
$ 表1JAD(ADF)文件和表2(6.Manifest文件)中已与预约的属性名不能设置成任意属性。
表1JAD属性
属性名: MIDlet-Name
属性值: 用UTF-8最大32byte
值的使用的时间点: 下载MIDlet suite, AP登录,使用应用时
内容: MIDlet suite标题
!《必须》!
属性名: MIDlet-Version
属性值: 用UTF-8最大16byte(X.Y.Z格式的字符集 (0.0.0~99.99.99))
值的使用的时间点: 下载MIDlet suite, AP登录,使用应用时
内容: MIDlet suite的版本
!《必须》!
属性名: MIDlet-Vendor
属性值: 用UTF-8最大32byte
值的使用的时间点: 下载MIDlet suite, AP登录,使用应用时
内容: MIDlet suite的生产厂家名称
!《必须》!
属性名: MIDlet-Jar-URL
属性值: 用UTF-8,最大255byte的URL(/blog_article/不可使用相对路径/index.html)
值的使用的时间点: 下载MIDlet suite, AP登录,使用应用时
内容: 下载Jar的URL
!《必须》!
属性名: MIDlet-Jar-Size
属性值: 最大8byte (0~262144の値)
值的使用的时间点: 下载MIDlet suite, AP登录,使用应用时
内容: 下载的Jar文件大小
!《必须》!
属性名: MIDlet-Data-Size
属性值: 用UTF-8,最大8byte (0~10240之间的值)
值的使用的时间点: 下载MIDlet suite, AP登录,使用应用时
内容: 使用MIDlet Suite时的RMS大小
对使用RMS的MIDlet Suite,至少JAD(ADF)或Mainifest的一方是必须。
不使用的是《可选》。不指定时取为0。
属性名: MIDlet-Install-Notify
属性值: 用UTF-8,最大255byte的URL
值的使用的时间点: 下载MIDlet suite, AP登录,使用应用时
内容: 安装状态报告的发送目标地址URL(http://必须)
《可选》
属性名: MIDlet-Description
属性值: 用UTF-8最大512byte
值的使用的时间点: 下载MIDlet suite, AP登录,使用应用时
内容: 应用程序的描述
!《必须》!
属性名: MicroEdition-Profile
属性值: MIDP的版本 用UTF-8是8byte
值的使用的时间点: 下载MIDlet suite, AP登录,使用应用时
内容: 有关指定MIDP-1.0的相关内容:
!《必须》!
属性名: MicroEdition-Configuration
属性值: CLDC的版本 用UTF-8是8byte
值的使用的时间点: 下载MIDlet suite, AP登录,使用应用时
内容: 有关指定CLDC-1.0的相关内容:
!《必须》!
属性名: Media-price
属性值: 用UTF-8最大32byte
值的使用的时间点: 下载MIDlet suite, AP登录,使用应用时
内容: 应用程序的价格
!《必须》!
属性名: MIDlet-UseNetwork
属性值: 用UTF-8,YES/NO,无大小写区别,最大4byte
值的使用的时间点: 下载MIDlet suite, AP登录,使用应用时
内容: MIDlet Suite 是否使用网络
《可选》。MIDlet Suite需要通信时为必须。
不进行通信时为《可选》项。不指定时与No相同
属性名: 任意(最大32byte字符集),最多5个
属性值: 用UTF-8最大127byte
值的使用的时间点: 下载MIDlet suite, AP登录,使用应用时
内容: 可以作为MIDlet的参数来使用
《可选》。但是,ADF,Manifest 无论哪个定义的属性,当做任意属性时不能识别。
6.Manifest文件
文字编码用UTF-8。Manifest文件的相关注意事项。
$ Manifest的记述Syntax遵循http://java.sun.com/products/jdk/1.2/docs/guide/jar/manifest.html。
$ 属性名有大小写区别。
$ 表2中规定的【必选】属性必须要设置。
$ 同一属性名不能重复2次以上。
$ 属性值请遵循表2的Format。属性值不能省略。
$ MIDlet-Name、MIDlet-Version、MIDlet-Vendor的属性值与JAD(ADF)文件中的设定值必须一致。
$ MIDlet-<n> 以外的属性中Manifest和JAD(ADF)文件同时设定的情况下,JAD(ADF)的属性值优先。MIDlet-<n>
为Manifest优先。
$ 表1(5.JAD(ADF)文件)和表2(6.Manifest文件)中已预约的属性名不能设置成任意属性。另外,JAD(ADF)文
件中设定的任意属性不能作为Manifest的任意属性。
表2 Manifest属性
属性名: MIDlet-Name
属性值: 用UTF-8最大32byte
值的使用的时间点: 下载MIDlet suite, AP登录,使用应用时
内容: MIDlet suite的标题
!《必须》!
属性名: MIDlet-Version
属性值: 用UTF-8最大16byte(X.Y.Z格式的字符集 (0.0.0~99.99.99))
值的使用的时间点: 下载MIDlet suite, AP登录,使用应用时
内容: MIDlet suite的版本
!《必须》!
属性名: MIDlet-Vendor
属性值: 用UTF-8最大32byte
值的使用的时间点: 下载MIDlet suite, AP登录,使用应用时
内容: MIDlet suite的生产厂家名称
!《必须》!
属性名: MIDlet-<n>
属性值: MIDlet suite里面包含的各MIDlet的名称、类
MIDlet的名称(Name) : 用UTF-8最大64byte
类(Class Name): 用UTF-8で最大128byte
不支持ICON
MIDlet-<n>: Name,ICON,Class Name
或者MIDlet-<n>: Name, ,Class Name
值的使用的时间点: 下载MIDlet suite, AP登录,使用应用时
内容: MIDlet的标题
!《必须》!
属性名: MicroEdition-Profile
属性值: MIDP的版本 用UTF-8是8byte
值的使用的时间点: 下载MIDlet suite, AP登录,使用应用时
内容: 有关指定MIDP-1.0的相关内容:
!《必须》!
属性名: MicroEdition-Configuration
属性值: CLDC 的版本 用UTF-8是8byte
值的使用的时间点: 下载MIDlet suite, AP登录,使用应用时
内容: 有关指定CLDC-1.0的相关内容:
!《必须》!
属性名: MIDlet-Description
属性值: 用UTF-8最大512byte
值的使用的时间点: 下载MIDlet suite, AP登录,使用应用时
内容: 应用程序的描述
!《必须》!
属性名: MIDlet-Data-Size
属性值: 用UTF-8,最大8byte (0~10240之间的值)
值的使用的时间点: 下载MIDlet suite, AP登录,使用应用时
内容: 使用MIDlet Suite时RMS大小
对使用RMS的MIDlet Suite,至少在JAD(ADF)或Manifest中有一处必须设置。
不使用的是《可选》。不指定时取为0。
属性名: 以“MIDlet-“开头的任意属性(最大32byte字符集),最多5个
属性值: 用UTF-8最大127byte
值的使用的时间点: 下载MIDlet suite, AP登录,使用应用时
内容: 可以作为MIDlet的参数来利用
《可选》。但是,ADF,Manifest 无论哪个定义的属性,当作任意属性时不能识别。
_________________________________________________________________________
<改JAD文件>
JAD文件中必须有如下属性:
MIDlet-<n>
MIDlet-Name
MIDlet-Version
MIDlet-Vendor
MIDlet-Jar-URL
MIDlet-Jar-Size
MIDlet-Description
MicroEdition-Profile
MicroEdition-Configuration
Media-price
如有一个JAD文件的内容如下:
MIDlet-1: JBookMidlet,,JBook.JBookMidlet
MIDlet-Description: N830
MIDlet-Jar-Size: 140517
MIDlet-Jar-URL: JBook.jar
MIDlet-Name: JBook
MIDlet-Vendor: SnailStudio
MIDlet-Version: 1.0
Media-price: 0
MicroEdition-Configuration: CLDC-1.0
MicroEdition-Profile: MIDP-1.0
我一行一行解释。
(1)MIDlet-1: JBookMidlet,,JBook.JBookMidlet
MIDlet suite里面包含的各MIDlet的名称、类
MIDlet的名称(Name) : 用UTF-8最大64byte
类(Class Name) 用UTF-8最大128byte
不支持ICON
MIDlet-<n>: Name,ICON,Class Name
或者MIDlet-<n>: Name, ,Class Name
N830一个MIDlet Suite支持5个MIDlet,所以说n的范围是1~5,这里是1(一般都是1)
JBookMidlet是MIDlet的名称,其后有两个逗号,逗号中间应该是图标的文件名,这里没有。最后的JBook.JBookMidlet是JAVA类的名称。
[改]在这里,可以改的是MIDlet的名称(Name),改成你喜欢的名字吧,看起来也爽一些。(注意,Manifest文件中也有这个属性,要改成一样的),一般这里不会有问题的,不建议更改。
(2)MIDlet-Description: N830
应用程序的描述
[改]随便改吧(注意,如果Manifest文件中有这一项,也要改Manifest文件),一般很多其它手机的java程序的JAD都是缺这一行,加上去就好了。
(3)MIDlet-Jar-Size: 140517
Jar文件的大小,字节表示
[改]大小不对的时候再改吧,一般不需要改
(4)MIDlet-Jar-URL: JBook.jar
Jar文件的名称
[改]对应jad的jar文件名称,名称不对时再改吧,一般不需修改
(5)MIDlet-Name: JBook
MIDlet的标题
[改]可以改成喜欢的名称(注意改对应的Manifest文件),一般不需修改
(6)MIDlet-Vendor: SnailStudio
MIDlet Suite厂商的名称
[改]可以改成喜欢的名称(自己的公司?呵呵。但是要注意改对应的Manifest文件),一般不需修改
(7)MIDlet-Version: 1.0
MIDlet Suite的版本号,范围从0.0.0~99.99.99
[改]范围以内都可以,(注意改对应的Manifest文件),一般不需修改
[改]还想改??不能改啦,如果是2.0版本,不用想了,玩不了的,N830是1.0的。。
(8)Media-price: 0
价格啦。。。。我讨厌收费的!!
[改]随便改啦,我喜欢改成0(一般,对应的Manifest文件不会有这一项),一般很多其它手机的java程序的JAD都是缺这一行,加上去就好了。
(9)MicroEdition-Configuration: CLDC-1.0
(10)MicroEdition-Profile: MIDP-1.0
最后两个一起说啦,CLDC版本和MIDP的版本
综上,一般只需要在JAD文件中加上MIDlet-Description和Media-price两个属性。
_________________________________________________________________________
Manifest文件
Manifest文件必有属性:
MIDlet-Name
MIDlet-Version
MIDlet-Vendor
MIDlet-<n>
MicroEdition-Profile
MicroEdition-Configuration
MIDlet-Description属性,在N830的java规范中,指定Manifest中是必须的,但是实践证明,这个属性可以不包涵在Manifest中!!
这些属性和JAD文件中的一样,就不多说了。只要记得属性值和JAD中的保持一致就好了。
接下去就是实际动手修改了。
(1)只想改jad和manifest的,可以只安装WinRAR。
(2)想更进一步了解原理,进行修改的,建议继续安装 JDK1.5 , N830 SDK , WinHex
(3)再进一步就要涉及到修改游戏的class文件了,建议继续安装java反编译软件,nokia的com包支持库,索爱的支持库。
今天先到这里,有空就开始写实例教程了。
import android.app.Service; import android.os.Handler; public class PeriodicService extends Service { private Handler mPeriodicEventHandler; private final int PERIODIC_EVENT_TIMEOUT = 30000; @Override public void onCreate() { super.onCreate(); mPeriodicEventHandler = new Handler(); mPeriodicEventHandler.postDelayed(doPeriodicTask, PERIODIC_EVENT_TIMEOUT); } private Runnable doPeriodicTask = new Runnable() { public void run() { //your action here mPeriodicEventHandler.postDelayed(doPeriodicTask, PERIODIC_EVENT_TIMEOUT); } }; @Override public void onDestroy() { mPeriodicEventHandler.removeCallbacks(doPeriodicTask); super.onDestroy(); } }