gpt4 book ai didi

java - Android ViewFlipper中Rotate3dAnimation的更好实现

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:20:06 26 4
gpt4 key购买 nike

我想在一个 View 中创建一个带有 map 的 Android MapActivity,它可以翻转过来,然后在另一个 View 中进行配置,然后再次翻转回 map 。我想出的解决方案有效,但我想知道是否有更好的方法来做到这一点。

我从 Android ApiDemos 复制了 Rotate3DAnimation 类,并在我的 MapActivity 类的顶部声明了它们:

private MapView mMapView;
private ViewFlipper mFlipper;
private Rotate3dAnimation mInMapAnimation;
private Rotate3dAnimation mInStgAnimation;
private Rotate3dAnimation mOutMapAnimation;
private Rotate3dAnimation mOutStgAnimation;

接下来,在 MapActivity 的 onCreate 方法中我这样做了:

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mapoverviewlayout);

// Initialize the map.
MapView mapView = (MapView) findViewById(R.id.mapview);
mapView.setBuiltInZoomControls(true);

// Obtain the view flipper.
mFlipper = (ViewFlipper)findViewById(R.id.mapviewflipper);

// Initialize the settings view and handle the setting clicks.
Button stgMapDone = (Button)findViewById(R.id.MapViewOptionsDone);
stgMapDone.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
UnitOverviewMapActivity.this.mFlipper.showNext();
}
});



}

最后,我使用菜单按钮来选择适当的翻转动画。我这样做是因为如果 map 翻转一个方向以显示设置 View ,我希望它反向翻转以隐藏设置 View 。所以在我的 onPrepareOptionsMenu 中(因为那是我的按钮所在的位置)我这样做了:

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
if (mInMapAnimation == null) {
mInMapAnimation = new Rotate3dAnimation(-90, 0, mMapView.getWidth() / 2, mMapView.getHeight() / 2, 0.0f, false);
mInMapAnimation.setDuration(1000);
mInMapAnimation.setStartOffset(1000);
}

if (mInStgAnimation == null) {
mInStgAnimation = new Rotate3dAnimation(90, 0, mMapView.getWidth() / 2, mMapView.getHeight() / 2, 0.0f, false);
mInStgAnimation.setDuration(1000);
mInStgAnimation.setStartOffset(1000);
}

if (mOutMapAnimation == null) {
mOutMapAnimation = new Rotate3dAnimation(0, -90, mMapView.getWidth() / 2, mMapView.getHeight() / 2, 0.0f, false);
mOutMapAnimation.setDuration(1000);
}

if (mOutStgAnimation == null) {
mOutStgAnimation = new Rotate3dAnimation(0, 90, mMapView.getWidth() / 2, mMapView.getHeight() / 2, 0.0f, false);
mOutStgAnimation.setDuration(1000);
}

if (mFlipper.getCurrentView().getId() == R.id.mapparentlayout) {
mFlipper.setInAnimation(mInStgAnimation);
mFlipper.setOutAnimation(mOutMapAnimation);
}
else {
mFlipper.setInAnimation(mInMapAnimation);
mFlipper.setOutAnimation(mOutStgAnimation);
}


return true;
}

这工作正常,但似乎效率低下。我(显然错误地)假设“翻转”将是 ViewFlipper 容器的内置功能。有没有更好或更有效的方法来实现这一目标?

最佳答案

这是我能想到的最好的。部分问题是无法确定 mapView 的大小以便计算动画构造函数的大小参数。我将我的 onCreate 代码更改为以下内容,它缩短了很多。

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mapoverviewlayout);

// Initialize the map.
mMapView = (MapView) findViewById(R.id.mapview);
mMapView.setBuiltInZoomControls(true);

// Obtain the view flipper.
mFlipper = (ViewFlipper)findViewById(R.id.mapviewflipper);

// Initialize the animations.
Display display = ((WindowManager)getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
int h2 = display.getHeight() / 2;
int w2 = display.getWidth() / 2;

mInMapAnimation = new Rotate3dAnimation(-90, 0, w2, h2, 0.0f, false);
mInMapAnimation.setDuration(500);
mInMapAnimation.setStartOffset(500);

mInStgAnimation = new Rotate3dAnimation(90, 0, w2, h2, 0.0f, false);
mInStgAnimation.setDuration(500);
mInStgAnimation.setStartOffset(500);

mOutMapAnimation = new Rotate3dAnimation(0, -90, w2, h2, 0.0f, false);
mOutMapAnimation.setDuration(500);

mOutStgAnimation = new Rotate3dAnimation(0, 90, w2, h2, 0.0f, false);
mOutStgAnimation.setDuration(500);

}

关于java - Android ViewFlipper中Rotate3dAnimation的更好实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3452687/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com