谁来总结一下android上的桌游志啊?

转贴:【汇总】Android上的桌游_桌游吧_百度贴吧_游立方吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0可签7级以上的吧50个
本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:33贴子:
转贴:【汇总】Android上的桌游_桌游吧_百度贴吧
【汇总】Android上的桌游_桌游吧_百度贴吧来自:
贴吧热议榜
使用签名档&&
保存至快速回贴桌游《安卓纪元:矩阵潜袭》好玩吗?_百度知道安卓面试(9)
转载地址:http://blog.csdn.net/superjunjin/article/details/7860025
26.如果后台的由于某原因被系统回收了,如何在被系统回收之前保存当前状态?
当你的程序中某一个Activity&A&在运行时中,主动或被动地运行另一个新的Activity&B&
这个时候A会执行
public&void&onSaveInstanceState(Bundle&outState)&{&&&
& & & super.onSaveInstanceState(outState);&&&&
& & & outState.putLong(&id&,&);
B&完成以后又会来找A,&这个时候就有两种情况,一种是A被回收,一种是没有被回收,被回
收的A就要重新调用onCreate()方法,不同于直接启动的是这回onCreate()里是带上参数savedInstanceState,没被收回的就还是onResume就好了。
savedInstanceState是一个Bundle对象,你基本上可以把他理解为系统帮你维护的一个Map对象。在onCreate()里你可能会&用到它,如果正常启动onCreate就不会有它,所以用的时候要判断一下是否为空。
if(savedInstanceState&!=&null){&&
&&&&&long&id&=&savedInstanceState.getLong(&id&);&&
就像官方的Notepad教程&里的情况,你正在编辑某一个note,突然被中断,那么就把这个note的id记住,再起来的时候就可以根据这个id去把那个note取出来,程序就完整&一些。这也是看你的应用需不需要保存什么,比如你的界面就是读取一个列表,那就不需要特殊记住什么,哦,&没准你需要记住滚动条的位置...
27.如何退出
Activity的应用来说,退出很简单,直接finish()即可。当然,也可以用killProcess()和System.exit()这样的方法。现提供几个方法,供参考:
1、抛异常强制退出:该方法通过抛异常,使程序Force&Close。验证可以,但是,需要解决的问题是,如何使程序结束掉,而不弹出Force&Close的窗口。
2、记录打开的Activity:每打开一个Activity,就记录下来。在需要退出时,关闭每一个Activity即可。
3、发送特定广播:在需要结束应用时,发送一个特定的广播,每个Activity收到广播后,关闭即可。
4、递归退出在打开新的Activity时使用startActivityForResult,然后自己加标志,在onActivityResult中处理,递归关闭。除了第一个,都是想办法把每一个Activity都结束掉,间接达到目的。但是这样做同样不完美。你会发现,如果自己的应用程序对每一个Activity都设置了nosensor,在两个Activity结束的间隙,sensor可能有效了。但至少,我们的目的达到了,而且没有影响用户使用。为了编程方便,最好定义一个Activity基类,处理这些共通问题。
28.请解释下在单线程模型中、、、之间的关系。
答:简单的说,Handler获取当前线程中的looper对象,looper用来从存放Message的MessageQueue中取出Message,再有Handler进行Message的分发和处理.
Message Queue(消息队列):用来存放通过Handler发布的消息,通常附属于某一个创建它的线程,可以通过Looper.myQueue()得到当前线程的消息队列
Handler:可以发布或者处理一个消息或者操作一个Runnable,通过Handler发布消息,消息将只会发送到与它关联的消息队列,然也只能处理该消息队列中的消息
Looper:是Handler和消息队列之间通讯桥梁,程序组件首先通过Handler把消息传递给Looper,Looper把消息放入队列。Looper也把消息队列里的消息广播给所有的
Handler:Handler接受到消息后调用handleMessage进行处理
Message:消息的类型,在Handler类中的handleMessage方法中得到单个的消息进行处理
在单线程模型下,为了线程通信问题,设计了一个Message Queue(消息队列), 线程间可以通过该Message Queue并结合Handler和Looper组件进行信息交换。下面将对它们进行分别介绍:
1. Message
&&&&Message消息,理解为线程间交流的信息,处理数据后台线程需要更新UI,则发送Message内含一些数据给UI线程。
2. Handler
&&&&Handler处理者,是Message的主要处理者,负责Message的发送,Message内容的执行处理。后台线程就是通过传进来的 Handler对象引用来sendMessage(Message)。而使用Handler,需要implement 该类的 handleMessage(Message)方法,它是处理这些Message的操作内容,例如Update UI。通常需要子类化Handler来实现handleMessage方法。
3. Message Queue
&&&&Message Queue消息队列,用来存放通过Handler发布的消息,按照先进先出执行。
&&& 每个message queue都会有一个对应的Handler。Handler会向messagequeue通过两种方法发送消息:sendMessage或post。这两种消息都会插在message queue队尾并按先进先出执行。但通过这两种方法发送的消息执行的方式略有不同:通过sendMessage发送的是一个message对象,会被 Handler的handleMessage()函数处理;而通过post方法发送的是一个runnable对象,则会自己执行。
&&&&Looper是每条线程里的Message Queue的管家。Android没有Global的MessageQueue,而Android会自动替主线程(UI线程)建立Message Queue,但在子线程里并没有建立Message Queue。所以调用Looper.getMainLooper()得到的主线程的Looper不为NULL,但调用Looper.myLooper()得到当前线程的Looper就有可能为NULL。对于子线程使用Looper,API
Doc提供了正确的使用方法:这个Message机制的大概流程:
&&& 1. 在Looper.loop()方法运行开始后,循环地按照接收顺序取出Message Queue里面的非NULL的Message。
&&& 2. 一开始Message Queue里面的Message都是NULL的。当Handler.sendMessage(Message)到Message Queue,该函数里面设置了那个Message对象的target属性是当前的Handler对象。随后Looper取出了那个Message,则调用 该Message的target指向的Hander的dispatchMessage函数对Message进行处理。在dispatchMessage方法里,如何处理Message则由用户指定,三个判断,优先级从高到低:
&&& 1) Message里面的Callback,一个实现了Runnable接口的对象,其中run函数做处理工作;
&&& 2) Handler里面的mCallback指向的一个实现了Callback接口的对象,由其handleMessage进行处理;
&&& 3) 处理消息Handler对象对应的类继承并实现了其中handleMessage函数,通过这个实现的handleMessage函数处理消息。
&&& 由此可见,我们实现的handleMessage方法是优先级最低的!
&&& 3. Handler处理完该Message (updateUI) 后,Looper则设置该Message为NULL,以便回收!
&&& 在网上有很多文章讲述主线程和其他子线程如何交互,传送信息,最终谁来执行处理信息之类的,个人理解是最简单的方法——判断Handler对象里面的Looper对象是属于哪条线程的,则由该线程来执行!
&&& 1. 当Handler对象的构造函数的参数为空,则为当前所在线程的Looper;
& & 2. Looper.getMainLooper()得到的是主线程的Looper对象,Looper.myLooper()得到的是当前线程的Looper对象。
29.你如何评价系统?优缺点。
答:Android平台手机 5大优势:
一、开放性
在优势方面,Android平台首先就是其开发性,开发的平台允许任何移动终端厂商加入到Android联盟中来。显著的开放性可以使其拥有更多的开发者,随着用户和应用的日益丰富,一个崭新的平台也将很快走向成熟。开放性对于Android的发展而言,有利于积累人气,这里的人气包括消费者和厂商,而对于消费者来讲,随大的受益正是丰富的软件资源。开放的平台也会带来更大竞争,如此一来,消费者将可以用更低的价位购得心仪的手机。
二、挣脱运营商的束缚
在过去很长的一段时间,特别是在欧美地区,手机应用往往受到运营商制约,使用什么功能接入什么网络,几乎都受到运营商的控制。从去年iPhone 上市 ,用户可以更加方便地连接网络,运营商的制约减少。随着EDGE、HSDPA这些2G至3G移动网络的逐步过渡和提升,手机随意接入网络已不是运营商口中的笑谈,当你可以通过手机IM软件方便地进行即时聊天时,再回想不久前天价的彩信和图铃下载业务,是不是像噩梦一样?互联网巨头Google推动的Android终端天生就有网络特色,将让用户离互联网更近。
三、丰富的硬件选择
这一点还是与Android平台的开放性相关,由于Android的开放性,众多的厂商会推出千奇百怪,功能特色各具的多种产品。功能上的差异和特色,却不会影响到数据同步、甚至软件的兼容,好比你从诺基亚 Symbian风格手机 一下改用苹果 iPhone ,同时还可将Symbian中优秀的软件带到iPhone上使用、联系人等资料更是可以方便地转移,是不是非常方便呢?
四、不受任何限制的开发商
Android平台提供给第三方开发商一个十分宽泛、自由的环境,不会受到各种条条框框的阻扰,可想而知,会有多少新颖别致的软件会诞生。但也有其两面性,血腥、暴力、情色方面的程序和游戏如可控制正是留给Android难题之一。
五、无缝结合的Google应用
如今叱诧互联网的Google已经走过10年度历史,从搜索巨人到全面的互联网渗透,Google服务如地图、邮件、搜索等已经成为连接用户和互联网的重要纽带,而Android平台手机将无缝结合这些优秀的Google服务。
再说Android的5大不足:
一、安全和隐私
由于手机 与互联网的紧密联系,个人隐私很难得到保守。除了上网过程中经意或不经意留下的个人足迹,Google这个巨人也时时站在你的身后,洞穿一切,因此,互联网的深入将会带来新一轮的隐私危机。
二、首先开卖Android手机的不是最大运营商
众所周知,T-Mobile在23日,于美国纽约发布 了Android首款手机G1。但是在北美市场,最大的两家运营商乃AT&T和Verizon,而目前所知取得Android手机销售权的仅有 T-Mobile和Sprint,其中T-Mobile的3G网络相对于其他三家也要逊色不少,因此,用户可以买账购买G1,能否体验到最佳的3G网络服务则要另当别论了!
三、运营商仍然能够影响到Android手机
在国内市场,不少用户对购得移动定制机不满,感觉所购的手机被人涂画了广告一般。这样的情况在国外市场同样出现。Android手机的另一发售运营商Sprint就将在其机型中内置其手机商店程序。
四、同类机型用户减少
在不少手机论坛都会有针对某一型号的子论坛,对一款手机的使用心得交流,并分享软件资源。而对于Android平台手机,由于厂商丰富,产品类型多样,这样使用同一款机型的用户越来越少,缺少统一机型的程序强化。举个稍显不当的例子,现在山寨机泛滥,品种各异,就很少有专门针对某个型号山寨机的讨论和群组,除了哪些功能异常抢眼、颇受追捧的机型以外。
五、过分依赖开发商缺少标准配置
在使用PC端的Windows Xp系统的时候,都会内置微软Windows Media Player这样一个播放器程序,用户可以选择更多样的播放器,如Realplay或暴风影音等。但入手开始使用默认的程序同样可以应付多样的需要。在Android平台中,由于其开放性,软件更多依赖第三方厂商,比如Android系统的SDK中就没有内置音乐 播放器,全部依赖第三方开发,缺少了产品的统一性。
30.谈谈数据存储方式。
Android提供了5种方式存储数据:
(1)使用SharedPreferences存储数据;它是Android提供的用来存储一些简单配置信息的一种机制,采用了XML格式将数据存储到设备中。只能在同一个包内使用,不能在不同的包之间使用。
(2)文件存储数据;文件存储方式是一种较常用的方法,在Android中读取/写入文件的方法,与Java中实现I/O的程序是完全一样的,提供了openFileInput()和openFileOutput()方法来读取设备上的文件。
(3)SQLite存储数据;SQLite是Android所带的一个标准的数据库,它支持SQL语句,它是一个轻量级的嵌入式数据库。
(4)使用ContentProvider存储数据;主要用于应用程序之间进行数据交换,从而能够让其他的应用保存或读取此Content&Provider的各种数据类型。
(5)网络存储数据;通过网络上提供给我们的存储空间来上传(存储)和下载(获取)我们存储在网络空间中的数据信息。
31.&Android中各有什么区别。
Activity:&活动,是最基本的android应用程序组件。一个活动就是一个用户可以操作的可视化用户界面,每一个活动都被实现为一个独立的类,并且从活动基类继承而来。
Intent:&意图,描述应用想干什么。最重要的部分是动作和动作对应的数据。
Content&Provider:内容提供器,android应用程序能够将它们的数据保存到文件、SQLite数据库中,甚至是任何有效的设备中。当你想将你的应用数据和其他应用共享时,内容提供器就可以发挥作用了。
Service:服务,具有一段较长生命周期且没有用户界面的程序组件。
32.View,&surfaceView,&GLSurfaceView有什么区别。
view是最基础的,必须在UI主线程内更新画面,速度较慢。
SurfaceView&是view的子类,类似使用双缓机制,在新的线程中更新画面所以刷新界面速度比view快
GLSurfaceView&是SurfaceView的子类,opengl&专用的
33.Manifest.xml文件中主要包括哪些信息?
manifest:根节点,描述了package中所有的内容。
uses-permission:请求你的package正常运作所需赋予的安全许可。
permission:&声明了安全许可来限制哪些程序能你package中的组件和功能。
instrumentation:声明了用来测试此package或其他package指令组件的代码。
application:包含package中application级别组件声明的根节点。
activity:Activity是用来与用户交互的主要工具。
receiver:IntentReceiver能使的application获得数据的改变或者发生的操作,即使它当前不在运行。
service:Service是能在后台运行任意时间的组件。
provider:ContentProvider是用来管理持久化数据并发布给其他应用程序使用的组件。
34.根据自己的理解描述下数字签名。
(1)所有的应用程序都必须有数字证书,Android系统不会安装一个没有数字证书的应用程序
(2)Android程序包使用的数字证书可以是自签名的,不需要一个权威的数字证书机构签名认证
(3)如果要正式发布一个Android程序,必须使用一个合适的私钥生成的数字证书来给程序签名,而不能使用adt插件或者ant工具生成的调试证书来发布。
(4)数字证书都是有有效期的,Android只是在应用程序安装的时候才会检查证书的有效期。如果程序已经安装在系统中,即使证书过期也不会影响程序的正常功能。
35.&AIDL的全称是什么如何工作能处理哪些类型的数据
AIDL全称Android&Interface&Definition&Language(Android接口描述语言)是一种借口描述语言;&编译器可以通过aidl文件生成一段代码,通过预先定义的接口达到两个进程内部通信进程跨界对象访问的目的.AIDL的IPC的机制和COM或CORBA类似,&是基于接口的,但它是轻量级的。它使用代理类在客户端和实现层间传递值.&如果要使用AIDL,&需要完成2件事情:&1.&引入AIDL的相关类.;&2.&调用aidl产生的class.理论上,&参数可以传递基本数据类型和String,&还有就是Bundle的派生类,&不过在Eclipse中,目前的ADT不支持Bundle做为参数,
具体实现步骤如下:
1、创建AIDL文件,&在这个文件里面定义接口,&该接口定义了可供客户端访问的方法和属性。
2、编译AIDL文件,&用Ant的话,&可能需要手动,&使用Eclipse&plugin的话,可以根据adil文件自动生产java文件并编译,&不需要人为介入.
3、在Java文件中,&实现AIDL中定义的接口.&编译器会根据AIDL接口,&产生一个JAVA接口。这个接口有一个名为Stub的内部抽象类,它继承扩展了接口并实现了远程调用需要的几个方法。接下来就需要自己去实现自定义的几个接口了.
4、向客户端提供接口ITaskBinder,&如果写的是service,扩展该Service并重载onBind&()方法来返回一个实现上述接口的类的实例。
5、在服务器端回调客户端的函数.&前提是当客户端获取的IBinder接口的时候,要去注册回调函数,&只有这样,&服务器端才知道该调用那些函数
AIDL语法很简单,可以用来声明一个带一个或多个方法的接口,也可以传递参数和返回值。&由于远程调用的需要,&这些参数和返回值并不是任何类型.下面是些AIDL支持的数据类型:
1.&不需要import声明的简单Java编程语言类型(int,boolean等)
2.&String,&CharSequence不需要特殊声明
3.&List,&Map和Parcelables类型,&这些类型内所包含的数据成员也只能是简单数据类型,&String等其他比支持的类型.
(另外:&我没尝试Parcelables,&在Eclipse+ADT下编译不过,&或许以后会有所支持).
实现接口时有几个原则:
.抛出的异常不要返回给调用者.&跨进程抛异常处理是不可取的.
.IPC调用是同步的。如果你知道一个IPC服务需要超过几毫秒的时间才能完成地话,你应该避免在Activity的主线程中调用。也就是IPC调用会挂起应用程序导致界面失去响应.&这种情况应该考虑单起一个线程来处理.
.不能在AIDL接口中声明静态属性。
IPC的调用步骤:
1.&声明一个接口类型的变量,该接口类型在.aidl文件中定义。
2.&实现ServiceConnection。
3.&调用ApplicationContext.bindService(),并在ServiceConnection实现中进行传递.
4.&在ServiceConnection.onServiceConnected()实现中,你会接收一个IBinder实例(被调用的Service).&调用
YourInterfaceName.Stub.asInterface((IBinder)service)将参数转换为YourInterface类型。
5.&调用接口中定义的方法。你总要检测到DeadObjectException异常,该异常在连接断开时被抛出。它只会被远程方法抛出。
6.&断开连接,调用接口实例中的ApplicationContext.unbindService()
参考:http://buaadallas./090
36.android:gravity与的区别
LinearLayout有两个非常相似的属性:android:gravity与android:layout_gravity。他们的区别在&于:android:gravity用于设置View组件的对齐方式,而android:layout_gravity用于设置组件的&对齐方式。
举个例子,我们可以通过设置android:gravity=&center&来让EditText中的文字在EditText组件中居中显示;同&时我们设置EditText的android:layout_gravity=&right&来让EditText组件在LinearLayout中居右
显示。来实践以下:
正如我们所看到的,在EditText中,其中的文字已经居中显示了,而EditText组件自己也对齐到了LinearLayout的右侧。
38.&注册广播接收者两种方式的区别,及优缺点
答:首先写一个类要继承BroadcastReceiver
第一种:在清单文件中声明,添加
&receiveandroid:name=&.IncomingSMSReceiver & &
&intent-filter&
&& &actionandroid:name=&android.provider.Telephony.SMS_RECEIVED&)
&intent-filter&
&receiver&
第二种使用代码进行注册如:
IntentFilterfilter =& newIntentFilter(&android.provider.Telephony.SMS_RECEIVED&);
IncomingSMSReceiverreceiver = new IncomgSMSReceiver();
registerReceiver(receiver.filter);
两种注册类型的区别是:
1)第一种是常驻型(静态注册),也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。
2)第二种不是常驻型广播(动态注册),也就是说广播跟随程序的生命周期。
注册的方法有两种,一种是静态注册,一种是动态注册。
动态注册优点:在 Android 的广播机制中,动态注册的优先级是要高于静态注册优先级的,因此在必要的情况下,我们是需要动态注册广播接收器的。
静态注册优点:动态注册广播接收器还有一个特点,就是当用来注册的 Activity 关掉后,广播也就失效了。同时反映了静态注册的一个优势,就是无需担忧广播接收器是否被关闭,只要设备是开启状态,广播接收器就是打开着的。
39.Dalvik基于的改进
1.几个class变为一个dex,constant&pool,省内存
2.Zygote,copy-on-write&shared,省内存,省cpu,省电
3.基于寄存器的bytecode,省指令,省cpu,省电
4.Trace-based&JIT,省cpu,省电,省内存
40.android中有哪几种解析xml的类,官方推荐哪种?以及它们的原理和区别
1.XML树在内存中完整存储,因此可以直接修改其数据和结构.&
2.可以通过该解析器随时访问XML树中的任何一个节点.&
3.DOM解析器的API在使用上也相对比较简单.
缺点:如果XML文档体积比较大时,将文档读入内存是非常消耗系统资源的.
使用场景:DOM&是用与平台和语言无关的方式表示&XML&文档的官方&W3C&标准.DOM&是以层次结构组织的节点的集合.这个层次结构允许开发人员在树中寻找特定信息.分析该结构通常需要加载整个文档和构造层次结构,然后才能进行任何工作.DOM是基于对象层次结构的.
SAX&对内存的要求比较低,因为它让开发人员自己来决定所要处理的标签.特别是当开发人员只需要处理文档中所包含的部分数据时,SAX&这种扩展能力得到了更好的体现.
用SAX方式进行XML解析时,需要顺序执行,所以很难访问到同一文档中的不同数据.此外,在基于该方式的解析编码过程也相对复杂.
对于含有数据量十分巨大,而又不用对文档的所有数据进行遍历或者分析的时候,使用该方法十分有效.该方法不用将整个文档读入内存,而只需读取到程序所需的文档标签处即可.
?&Xmlpull解析
android&SDK提供了xmlpull&api,xmlpull和sax类似,是基于流(stream)操作文件,然后根据节点事件回调开发者编写的处理程序.因为是基于流的处理,因此xmlpull和sax都比较节约内存资源,不会象dom那样要把所有节点以对橡树的形式展现在内存中.xmlpull比sax更简明,而且不需要扫描完整个流.
41.Android系统中什么情况下会出现内存泄露呢?
1.&数据库的cursor没有关闭
2.构造adapter时,没有使用缓存contentview
&&&衍生listview的优化问题-----减少创建view的对象,充分使用contentview,可以使用一静态类来优化处理getview的过程
3.Bitmap对象不使用时采用recycle()释放内存
4.activity中的对象的生命周期大于activity
调试方法:&DDMS==&&HEAPSZIE==&dataobject==&[Total&Size]
42.谈谈对的理解
NDK全称:Native Development Kit。
  1、NDK是一系列工具的集合。
  * NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。这些工具对开发者的帮助是巨大的。
  * NDK集成了,并提供了相应的mk文件隔离CPU、平台、ABI等差异,开发人员只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so。
  * NDK可以自动地将so和Java应用一起打包,极大地减轻了开发人员的打包工作。
  2、NDK提供了一份稳定、功能有限的API头文件声明。
  Google明确声明该API是稳定的,在后续所有版本中都稳定支持当前发布的API。从该版本的NDK中看出,这些API支持的功能非常有限,包含有:C标准库(libc)、标准数学库(libm)、压缩库(libz)、Log库(liblog)。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:12379次
排名:千里之外
转载:106篇
(7)(11)(20)(21)(7)(9)(14)(17)Android开发(62)
属性动画作用
为什么需要属性动画
1. 补间动画只能够实现移动、缩放、旋转和淡入淡出这四种动画操作,那如果我们希望可以对View的背景色进行动态地改变呢
2. 比如说我们有一个自定义的View,在这个View当中有一个Point对象用于管理坐标,然后在onDraw()方法当中就是根据这个Point对象的坐标值来进行绘制的。也就是说,
如果我们可以对Point对象进行动画操作,那么整个自定义View的动画效果就有了。显然,补间动画是不具备这个功能的
3. 补间动画还有一个致命的缺陷,就是它只是改变了View的显示效果而已,而不会真正去改变View的属性。什么意思呢?比如说,现在屏幕的左上角有一个按钮,
然后我们通过补间动画将它移动到了屏幕的右下角,现在你可以去尝试点击一下这个按钮,点击事件是绝对不会触发的,因为实际上这个按钮还是停留在屏幕的左上角,
只不过补间动画将这个按钮绘制到了屏幕的右下角而已。
新引入的属性动画机制已经不再是针对于View来设计的了,也不限定于只能实现移动、缩放、旋转和淡入淡出这几种动画操作,同时也不再只是一种视觉上的动画效果了。
它实际上是一种不断地对值进行操作的机制,并将值赋值到指定对象的指定属性上,可以是任意对象的任意属性。
TranslateAnimation translateAnim = new TranslateAnimation(0, 100, 0, 100);
translateAnim.setDuration(1000);
translateAnim.setFillAfter(true);//被pause的时候,动画效果没有了
testBut.startAnimation(translateAnim);
@OnClick(R.id.test)
void testClick() {
Toast.makeText(this, &test click&, Toast.LENGTH_SHORT).show();
}动画执行完毕之后,testBut停留在原来位置右下偏移100px的位置,但是如果在button当前位置点击button,不会出现toast。
如果在原来位置点击button,才会出现toast。同时button还会返回到原来的位置,这很奇怪,所以以后有必要对动画的原理做一个深入的了解。同时如果startAnim.clearAnimation(),那么button也会回到原来的位置。。
ObjectAnimator translate = ObjectAnimator.ofFloat(testBut, &translationX&, 0, 100);//默认属性都发生了变化,所以不需要setFillAfter
translate.setDuration(1000);
translate.start();
如果此时换成属性动画,因为属性动画改变的是view的属性,所以仍然可以在新位置触发点击事件。同时startAnim.clearAnimation()是不生效的。。。
ValueAnimator
属性动画的运行机制是通过不断地对值进行操作来实现的,而初始值和结束值之间的动画过渡就是由ValueAnimator这个类来负责计算的。
它的内部使用一种时间循环的机制来计算值与值之间的动画过渡,我们只需要将初始值和结束值提供给ValueAnimator,并且告诉它动画所需运行的时长,
那么ValueAnimator就会自动帮我们完成从初始值平滑地过渡到结束值这样的效果.
public static ValueAnimator ofInt(int... values)
public static ValueAnimator ofFloat(float... values)
这两个方法,说明可以传入多个int或者float参数,在这些参数之间过渡动画
public static ValueAnimator ofObject(TypeEvaluator evaluator, Object... values)
ValueAnimator.ofFloat(0f, 1f);怎么做到平滑过渡的
系统内置了一个FloatEvaluator,它通过计算告知动画系统如何从初始值过度到结束值,我们来看一下FloatEvaluator的代码实现:
public class FloatEvaluator implements TypeEvaluator {
public Object evaluate(float fraction, Object startValue, Object endValue) {
float startFloat = ((Number) startValue).floatValue();
return startFloat + fraction * (((Number) endValue).floatValue() - startFloat);
}fraction这个值是哪里来的呢?
Interpolator& 补间器
控制动画的变化速率,系统默认的Interpolator其实就是一个先加速后减速的Interpolator,对应的实现类就是AccelerateDecelerateInterpolator
AccelerateInterpolator 加速补间器
DecelerateInterpolator 减速补间器
LinearInterpolator 匀速补间器
TimeInterpolator接口的getInterpolation方法返回的就是fraction值,参数input范围在0-1之间,0表示动画开始,1表示结束
* An interpolator where the rate of change is constant
@HasNativeInterpolator
public class LinearInterpolator extends BaseInterpolator implements NativeInterpolatorFactory {
public LinearInterpolator() {
public LinearInterpolator(Context context, AttributeSet attrs) {
public float getInterpolation(float input) {
/** @hide */
public long createNativeInterpolator() {
return NativeInterpolatorFactoryHelper.createLinearInterpolator();
}此时input值和fraction值是相同的,这种情况由于input值是匀速增加的,因而fraction的值也是匀速增加的,所以动画的运动情况也是匀速的
AccelerateDecelerateInterpolator
public float getInterpolation(float input) {
return (float)(Math.cos((input + 1) * Math.PI) / 2.0f) + 0.5f;
}getInterpolation()方法最终返回的结果值还是在0到1之间。只不过经过了余弦运算之后,最终的结果不再是匀速增加的了,而是经历了一个先加速后减速的过程
所以如果自己要定义动画的变化速率,必须自己实现一个补间器,实现TimeInterpolator接口的getInterpolation方法。这也是难点
如果需要对任意一个类类型对象而不是int,float型进行动画操作,那么必须自定义一个类并TypeEvaluator接口的evaluate方法。
然后添加AnimatorUpdateListener监听器,通过getAnimatedValue就可以得到evaluate计算出来的结果
public class PointEvaluator implements TypeEvaluator{
public Object evaluate(float fraction, Object startValue, Object endValue) {
Point startPoint = (Point) startV
Point endPoint = (Point) endV
float x = startPoint.getX() + fraction * (endPoint.getX() - startPoint.getX());
float y = startPoint.getY() + fraction * (endPoint.getY() - startPoint.getY());
Point point = new Point(x, y);
ValueAnimator.ofObject(new PointEvaluator(), point1, point2);
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
public void onAnimationUpdate(ValueAnimator animation) {
currentPoint = (Point) animation.getAnimatedValue();
invalidate();
start():启动动画
setDuration():设置动画持续时间
setStartDelay():设置动画延迟播放的时间,
setRepeatCount():设置动画循环播放的次数,-1表示无限循环
setRepeatMode():设置循环播放的模式,循环模式包括RESTART和REVERSE两种,分别表示重新播放和倒序播放的意思
setInterpolator():设置补间器,常见的有LinearInterpolator
ObjectAnimator
继承自ValueAnimator的,底层的动画实现机制也是基于ValueAnimator来完成的。
ObjectAnimator内部的工作机制并不是直接对我们传入的属性名进行操作的,而是会去寻找这个属性名对应的get和set方法
public static ObjectAnimator ofFloat(Object target, String propertyName, float... values)
public static ObjectAnimator ofInt(Object target, String propertyName, int... values)
public static ObjectAnimator ofObject(Object target, String propertyName, TypeEvaluator evaluator, Object... values)
类似ValueAnimator的ofObject,也必须自定义一个类实现TypeEvaluator接口的evaluate方法。只是属性必须提供get,set方法,同时不需要手动把值给取出来
ObjectAnimator anim = ObjectAnimator.ofObject(myAnimView, &color&, new ColorEvaluator(),
&#0000FF&, &#FF0000&);
anim.setDuration(5000);
anim.start();
ObjectAnimator animator = ObjectAnimator.ofFloat(textview, &scaleY&, 1f, 3f, 1f); &
animator.setDuration(5000); &
animator.start()
这里的propertyName可以是alpha-透明度,scaleY-缩放Y方向,translationX-平移X方向,rotation-旋转等只要有对应的get,set方法都可以。当然自定义view的时候也可以
注意这里的translationX是相对getLeft来的,所以一开始是0
实现组合动画功能主要需要借助AnimatorSet这个类,这个类提供了一个play()方法,如果我们向这个方法中传入一个Animator对象(ValueAnimator或ObjectAnimator)
将会返回一个AnimatorSet.Builder的实例,AnimatorSet.Builder中包括以下四个方法:
&&& after(Animator anim)&& 将现有动画插入到传入的动画之后执行
&&& after(long delay)&& 将现有动画延迟指定毫秒后执行
&&& before(Animator anim)&& 将现有动画插入到传入的动画之前执行
&&& with(Animator anim)&& 将现有动画和传入的动画同时执行
playTogether 调用这个方法,也可以同时进行动画。。&&&
Animator监听器
1. anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener()...)
动画执行过程中不断执行,可以获取得到当前动画执行的值
2. anim.addListener(new AnimatorListener()....)
onAnimationStart():会在动画开始的时候调用
onAnimationRepeat():会在动画重复执行的时候调用
onAnimationEnd():会在动画结束的时候调用
onAnimationCancel():会在动画被取消的时候调用
AnimatorListenerAdapter实现了AnimatorListener接口,可以选择实现上述方法
使用XML编写动画
&&& &animator&& 对应代码中的ValueAnimator
&&& &objectAnimator&& 对应代码中的ObjectAnimator
&&& &set&& 对应代码中的AnimatorSet
复杂的组合动画操作,比如将一个视图先从屏幕外移动进屏幕,然后开始旋转360度,旋转的同时进行淡入淡出操作,就可以这样写:
&set xmlns:android=&/apk/res/android&
android:ordering=&sequentially& &
&objectAnimator
android:duration=&2000&
android:propertyName=&translationX&
android:valueFrom=&-500&
android:valueTo=&0&
android:valueType=&floatType& &
&/objectAnimator&
&set android:ordering=&together& &
&objectAnimator
android:duration=&3000&
android:propertyName=&rotation&
android:valueFrom=&0&
android:valueTo=&360&
android:valueType=&floatType& &
&/objectAnimator&
&set android:ordering=&sequentially& &
&objectAnimator
android:duration=&1500&
android:propertyName=&alpha&
android:valueFrom=&1&
android:valueTo=&0&
android:valueType=&floatType& &
&/objectAnimator&
&objectAnimator
android:duration=&1500&
android:propertyName=&alpha&
android:valueFrom=&0&
android:valueTo=&1&
android:valueType=&floatType& &
&/objectAnimator&
ViewPropertyAnimator
ViewPropertyAnimator提供了更加易懂、更加面向对象的API
textview.animate().alpha(0f);
属性动画只能在api 11以上使用,所以如果项目支持11以下,那么就可以使用NineOldAndroids这个兼容库。。所以以后能不用补间动画就不要去使用补间动画了。。。
NineOldAndroids是github上的一个开源项目,其作用是为了在低版本android上(API11以下)使用属性动画。它的原理其实也很简单,主要就是判断当前sdk版本,如果大于API11,那么就调用官方的API,否则自己实现动画效果。另外,在API使用方面,它与官方的属性动画基本一致
XML配置文件中
alpha 渐变透明度动画效果
scale 渐变尺寸伸缩动画效果
translate 画面转换位置移动动画效果
rotate 画面转移旋转动画效果
Java Code代码中
AlphaAnimation 渐变透明度动画效果
ScaleAnimation 渐变尺寸伸缩动画效果
TranslateAnimation 画面转换位置移动动画效果
RotateAnimation 画面转移旋转动画效果
fillAfter& 当设置为true ,该动画转化在动画结束后被应用
interpolator 指定一个动画的插入器
duration& 属性为动画持续时间
startOffset& 表示动画在几秒开始执行
fromAlpha 属性为动画起始时透明度
toAlpha&& 属性为动画结束时透明度
说明: 0.0表示完全透明 1.0表示完全不透明
fromXScale 属性为动画起始时 X坐标上的伸缩尺寸&& &
toXScale&& 属性为动画结束时 X坐标上的伸缩尺寸&&& &
fromYScale 属性为动画起始时Y坐标上的伸缩尺寸&& &
toYScale&& 属性为动画结束时Y坐标上的伸缩尺寸
pivotX&&&& 属性为动画相对于物件的X坐标的开始位置
pivotY&&&& 属性为动画相对于物件的Y坐标的开始位置
说明: 以上两个属性值 从0%-100%中取值,50%为物件的X或Y方向坐标上的中点位置
fromXDelta 属性为动画起始时 X坐标上的位置&& &
toXDelta&& 属性为动画结束时 X坐标上的位置
fromYDelta 属性为动画起始时 Y坐标上的位置
toYDelta&& 属性为动画结束时 Y坐标上的位置
fromDegrees 属性为动画起始时物件的角度&& &
toDegrees&& 属性为动画结束时物件旋转的角度 可以大于360度
pivotX&&&& 属性为动画相对于物件的X坐标的开始位置
pivotY&&&& 属性为动画相对于物件的Y坐标的开始位置
旋转,缩放,平移动画中
默认值是ABSOLUTE,绝对值
* The specified dimension is an absolute number of pixels.
public static final int ABSOLUTE = 0;
* The specified dimension holds a float and should be multiplied by the
* height or width of the object being animated.
public static final int RELATIVE_TO_SELF = 1;
* The specified dimension holds a float and should be multiplied by the
* height or width of the parent of the object being animated.
public static final int RELATIVE_TO_PARENT = 2;
Animation myAnimation= AnimationUtils.loadAnimation(this, R.anim.my_action);
AnimationSet是Animation子类
AnimationSet animationSet = new AnimationSet(true);//true表示共享Interpolator
animationSet.setInterpolator(new LinearInterpolator());
animationSet.addAnimation(myAnimation);
animationSet.setFillAfter(true);//最后停到动画结束的状态,默认为false
view.startAnimation(myAnimation);//xml中定义的动画,既可以是单个动画,也可以是通过set控制的组合动画
view.startAnimation(animationSet);//代码中自定义的组合动画
&?xml version=&1.0& encoding=&utf-8&?&
&set xmlns:android=&/apk/res/android&
android:interpolator=&@android:anim/linear_interpolator&
android:fillAfter=&true&
android:shareInterpolator=&true&&
android:duration=&1000&
android:fromAlpha=&1&
android:startOffset=&1000&
android:toAlpha=&0.5&/&
&translate
android:duration=&1000&
android:fromXDelta=&0&
android:fromYDelta=&0&
android:startOffset=&2000&
android:toXDelta=&100&
android:toYDelta=&0&/&
android:duration=&1000&
android:fromXScale=&1&
android:fromYScale=&1&
android:pivotX=&50%&
android:pivotY=&50%&
android:startOffset=&3000&
android:toXScale=&2&
android:toYScale=&2&/&
&表示,共享线性插值器,均匀速度变化,同时最后view停留到动画结束的状态。1s后执行alpha从完全不透明到完全透明,再过1s执行translate动画,移动到100,0位置,相对自身来说。再然后1s后以view的中心点进行缩放到2倍。
1. /content/13/35.shtml
2. http://www./lib/view/open5.html
animation1.xml 放到drawable文件夹下
&?xml version=&1.0& encoding=&utf-8&?&
&!--根标签为animation-list,其中oneshot代表着是否只展示一遍,设置为false会不停的循环播放动画
根标签下,通过item标签对动画中的每一个图片进行声明
android:duration 表示展示所用的该图片的时间长度--&
&animation-list
xmlns:android=&/apk/res/android&
android:oneshot=&true&&
&item android:drawable=&@drawable/icon1& android:duration=&150&&&/item&
&item android:drawable=&@drawable/icon2& android:duration=&150&&&/item&
&item android:drawable=&@drawable/icon3& android:duration=&150&&&/item&
&item android:drawable=&@drawable/icon4& android:duration=&150&&&/item&
&item android:drawable=&@drawable/icon5& android:duration=&150&&&/item&
&item android:drawable=&@drawable/icon6& android:duration=&150&&&/item&
&/animation-list&
启动帧动画
animationIV.setImageResource(R.drawable.animation1);
AnimationDrawable animationDrawable = (AnimationDrawable) animationIV.getDrawable();
animationDrawable.start();
停止帧动画
AnimationDrawable animationDrawable = (AnimationDrawable) animationIV.getDrawable();
animationDrawable.stop();
帧动画原理上只是不停的绘制背景而已,所以不存在补间动画,点击然后又回到原来位置的类似情况。。。。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:25860次
积分:1031
积分:1031
排名:千里之外
原创:76篇
转载:14篇
评论:11条
(2)(19)(15)(17)(13)(19)(1)(6)

我要回帖

更多关于 桌游志 的文章

 

随机推荐