最近学习的很多,将近20天的集训,收获了不少的东西,下面就来说说这几天的主要成果。首先来说一下动画。
所谓的动画,其实就是不断地画,就好比我们看动画片一样,最早期的动画片都是人们画的图然后以很快的速度播放,
最后我们看到的就是动态效果。java和android中动画都是这样形成的。而控制让图片不断画上去,就用到了我们以前学过的
线程。
以前说过,线程的运用形式有两种,通过继承Thread类,或是实现Runnable接口。而用他们的主要手段都是要①重写run()方法
②然后,我们怎样让图片不断地画,那就要用一个永远跳不出去一直画的语句,while(true),当然,我们也可以用一个标志位,比如
while(Flag),通过改变Flag来控制线程的进行。③我们要有两个方法,那就是draw()和move();当然,move()方法并不是必须的
只要你有连续的图片即可,可以一张一张的画上去而不用自己控制它的移动了。④缓存图片。我们在做线程小球的时候,往往用的
是覆盖的方法,但是在本次动画时,我们可以借助缓存图片,缓存图片只在后台运行,我们看不到,所以看到的就是不会重叠。
⑤画图的时候,我们可能会有背景,有其他的图片,所以,我们最好把这些都存在一个数组中,通过两个线程来进行实现。我觉得在这里
,android里边,我们仅借助一个列表就可以了,这个列表中我们可以装任意继承了某一父类的子类,我们知道,
在画图的时候,着重不同的地方就是draw()方法和move()方法,而在draw()方法中我们主要是负责把图片画上去,所以,类似于background和boss类,
不同的就是我们要画的图片了,这里我们就可以用Hash表来装载图片,进而可以很方便的获取到图片。现在的你有没有想过要尝试做一个动画出来呢?
android里边,画动画效果在我看来比java要复杂一些,说到这里,我们就要先说说Application类和Activity类了。这两个东西是很奇特的东西。那么,
就先让我们说说Application类。我觉得既然Application很伟大的功能是实现了资源共享,数据共享,那么,我是不是可以把他看成类似于一个接口的
东西,当然,这样东西很正常,因为他是一个类,还是可以有自己的方法,方法体。所以,我们习惯把自己的一些资源放到这里边。但是有一点,我们
在调用Application类时,不能像调用其他类一样去实例化一个对象,因为每个Android程序中都只有一个Application类,你可以使用系统自带的,也可
以自己去创建一个类继承Application类。而在获取上面也是很有区别的,通常,我们现在所用到的类中,有三种:
Activity,View,自己定义的类。那么就有三种方法来获取Application:
在Activity中:用getApplication()这个方法
在View中:用context.getApplicationContext(),来获取资源;
而在自己定义的类中,就有些麻烦了,因为没有直接的get方法,所以我们只能去获取我们自己定义的Application类的对象,然后再去获取里边的资源,
而我们现在的方法是 在Application类中自己定义一个Application类对象,定义get方法,然后再来获取里边的资源
总之,我们都是味蕾获取里边的资源,全局共享。
而Activity类,就有点像我们所学的JFrame类,同样类似一个容器,这个容器里边可以装各种对象,同样的,也会有各种方法,比如onTouch方法,onClick方法,等等,这也有点像
我们的那个主类,但是不同的是我们可以切换主类,就像我们可以从一个Activity到另外一个Activity中一样,但是,每次都只能在前台运行一个,其余在后台运行,我们看不到。
在android中实现动画,很多跟java中是相同的,其中最需要我们注意的有以下几点:
下面,就通过实例来看看怎么实现上述画图方法:
①线程的调用。因为在android中,在线程中是不方便访问界面上的组件的,就好比我们在画图时要借助画布,可是我们是不好直接访问的,所以我们需要一个媒介来进行访问。
而我们借助的,就是SurfaceView类(在探索Application,Activity,SurfaceView时,我都看到了生命周期这个概念,那么什么是生命周期呢?)。而在了解SurfaceView
时我们需要了解另外两个,SurfaceHolder和SurfaceHolder.Callback。以前我是没有这个意识去了解这个的,但是这好像是必须的。SurfaceHolder.Callback是一个接口
,它其中的方法就很好的展示了SuifaceView的生命周期。即:
public void surfaceCreated(SurfaceHolder holder) {
//这里是创建一个Surface,我们都是在这里边启动线程
//new Thread(this).start();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// surface 发生改变
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
//surface被销毁,伴随着它被销毁,线程也要停止哦
}
说了这么多,我还是没有说到怎么通过holder这个媒介来访问界面上的组件,在surfaceView中有一个直接获取方法getHolder(),通过这么多的get方法我们会发现
在Android中,很多的东西都是已经给我们定义好了的,我们只需要去调用,而不需要自己再去创建。获得了holder,我们就可以通过它获取画布了,当然,这些只有通过程序来展示
了。
②存储数据的方式有些不同,就是我们上边解读的Application。这种类似于我们使用的接口一样的东西。
未完待续。。。