一、几种简单的Animator
WorldWindJava中对Animator的使用主要由3个简单的Animator构成,分别为AngleAnimator、PositionAnimator和DoubleAnimator,这三个Animator在调用时最主要的区别为依据我们所持有的数据格式有目的的选择三种Animator进行调用。除此之外,还有一种CompoundAnimator,他主要是对其余几种Animator综合调用。例如,我们在WorldWind球体中执行flyTo()函数时,此时调用的Animator为FlyToOrbitViewAnimator,而其是CompoundAnimator的子类,我们来看该类的构造函数
public FlyToOrbitViewAnimator(OrbitView orbitView, Interpolator interpolator, int altitudeMode,
PositionAnimator centerAnimator, DoubleAnimator zoomAnimator,
AngleAnimator headingAnimator, AngleAnimator pitchAnimator, AngleAnimator rollAnimator)
{
//...
}
明显地可以看出该类中组合了几种简单Animator,从而达到我们所需要的效果,具体来看这几种Animator:
public static FlyToOrbitViewAnimator createFlyToOrbitViewAnimator(
OrbitView orbitView,
Position beginCenterPos, Position endCenterPos,
Angle beginHeading, Angle endHeading,
Angle beginPitch, Angle endPitch,
double beginZoom, double endZoom, long timeToMove, int altitudeMode)
{
//PositionAnimator
OnSurfacePositionAnimator centerAnimator = new OnSurfacePositionAnimator(orbitView.getGlobe(),
new ScheduledInterpolator(timeToMove),
beginCenterPos, endCenterPos,
OrbitViewPropertyAccessor.createCenterPositionAccessor(
orbitView), altitudeMode);
//DoubleAnimator
// Create an elevation animator with ABSOLUTE altitude mode because the OrbitView altitude mode applies to the
// center position, not the zoom.
ViewElevationAnimator zoomAnimator = new ViewElevationAnimator(orbitView.getGlobe(),
beginZoom, endZoom, beginCenterPos, endCenterPos, WorldWind.ABSOLUTE,
OrbitViewPropertyAccessor.createZoomAccessor(orbitView));
centerAnimator.useMidZoom = zoomAnimator.getUseMidZoom();
//AngleAnimator
AngleAnimator headingAnimator = new AngleAnimator(
new ScheduledInterpolator(timeToMove),
beginHeading, endHeading,
ViewPropertyAccessor.createHeadingAccessor(orbitView));
//AngleAnimator
AngleAnimator pitchAnimator = new AngleAnimator(
new ScheduledInterpolator(timeToMove),
beginPitch, endPitch,
ViewPropertyAccessor.createPitchAccessor(orbitView));
FlyToOrbitViewAnimator panAnimator = new FlyToOrbitViewAnimator(orbitView,
new ScheduledInterpolator(timeToMove), altitudeMode, centerAnimator,
zoomAnimator, headingAnimator, pitchAnimator, null);
return (panAnimator);
}
二、实例(定位操作)
我们通过实例来看一下Animator的使用。
1、创建调用方法
/**
* movetotime设置为动画效果运行时间
* 在Animator中,通过Interpolator进行运行时间的设定
*/
public void gotoLatLon(double lat, double lon, double zoom, double heading, long movetotime,double pitch)
{
BasicOrbitView view = (BasicOrbitView) wwd.getView();
if (!Double.isNaN(lat) || !Double.isNaN(lon) || !Double.isNaN(zoom))
{
lat = Double.isNaN(lat) ? view.getCenterPosition().getLatitude().degrees : lat;
lon = Double.isNaN(lon) ? view.getCenterPosition().getLongitude().degrees : lon;
zoom = Double.isNaN(zoom) ? view.getZoom() : zoom;
heading = Double.isNaN(heading) ? view.getHeading().degrees : heading;
pitch = Double.isNaN(pitch) ? view.getPitch().degrees : pitch;
view.addPanToAnimator(Position.fromDegrees(lat, lon, 0),
Angle.fromDegrees(heading), Angle.fromDegrees(pitch), zoom, movetotime ,true);
}
}
调用Animator时主要有两个步骤,一是定义视图(view),第二在该视图中添加Animator(addPanToAnimator()方法)。
2、进入BasicOrbitView 类中的addPanToAnimator()方法
public void addPanToAnimator(Position centerPos, Angle heading, Angle pitch, double zoom,
long timeToMove, boolean endCenterOnSurface)
{
((OrbitViewInputHandler) this.viewInputHandler).addPanToAnimator(centerPos, heading, pitch, zoom, timeToMove,
endCenterOnSurface);
}
3、F3进入OrbitViewInputHandler类中的addPanToAnimator()方法
public void addPanToAnimator(Position beginCenterPos, Position endCenterPos,
Angle beginHeading, Angle endHeading,
Angle beginPitch, Angle endPitch,
double beginZoom, double endZoom, long timeToMove, boolean endCenterOnSurface)
{
//设置为紧贴地面或者绝对高度
int altitudeMode = endCenterOnSurface ? WorldWind.CLAMP_TO_GROUND : WorldWind.ABSOLUTE;
//创建视图view
OrbitView orbitView = (OrbitView) this.getView();
//创建Animator,createFlyToOrbitViewAnimator()方法在本文第一部分写有源代码
FlyToOrbitViewAnimator panAnimator = FlyToOrbitViewAnimator.createFlyToOrbitViewAnimator(orbitView,
beginCenterPos, endCenterPos, beginHeading, endHeading, beginPitch, endPitch,
beginZoom, endZoom, timeToMove, altitudeMode);
//在声明部分有 `protected AnimationController gotoAnimControl = new AnimationController();` 可知此处为把Animator保存在AnimatorController中,因AnimatorController继承于HashMap,所以采用key->value 的方式保存
this.gotoAnimControl.put(VIEW_ANIM_PAN, panAnimator);
//firePropertyChange()方法作用为根据指定的key值调用所用相关的监听器
this.getView().firePropertyChange(AVKey.VIEW, null, this.getView());
}
public void addPanToAnimator(Position centerPos, Angle heading, Angle pitch, double zoom,
long timeToMove, boolean endCenterOnSurface)
{
OrbitView view = (OrbitView) this.getView();
//根据对应参数调用上面的addPanToAnimator()方法
addPanToAnimator(view.getCenterPosition(), centerPos,
view.getHeading(), heading,
view.getPitch(), pitch, view.getZoom(), zoom, timeToMove, endCenterOnSurface);
this.getView().firePropertyChange(AVKey.VIEW, null, this.getView());
}
在gov.nasa.worldwind.animation 包中,提供了AnimationController类和AnimationSupport类,作用分别为控制Animator的开始结束等操作以及提供一些计算方法以便我们在Animator中进行调用。
三、其他Animator
1、FlyToFlyViewAnimator
在BasicFlyView视图中调用,与FlyToOrbitViewAnimator 对应的BasicOrbitView不同,在本类注释部分给出提示
/**
* This is a basic view that implements a yaw-pitch-roll model that can be applied to first-person style view
* applications (such as flight simulation).
*/
可以看出类视图可以应用于第一人称视角的视图,例如飞行模拟。
在gov.nasa.worldwindx.examples.view包中AddAnimator类对此种Animator进行了调用。
2、OrbitViewCenterAnimator
OrbitViewCenterAnimator继承于MoveToPositionAnimator,介绍称
/**
* A position animator that has the ability to adjust the view to focus on the terrain when it is stopped.
*/
更利于地形的展示