下面列出了android.app.FragmentTransaction#setCustomAnimations ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
private static void show(FragmentManager fm, int type, RootInfo root, DocumentInfo doc, String query, int anim) {
final Bundle args = new Bundle();
args.putInt(EXTRA_TYPE, type);
args.putParcelable(EXTRA_ROOT, root);
args.putParcelable(EXTRA_DOC, doc);
args.putString(EXTRA_QUERY, query);
final FragmentTransaction ft = fm.beginTransaction();
switch (anim) {
case ANIM_SIDE:
args.putBoolean(EXTRA_IGNORE_STATE, true);
break;
case ANIM_DOWN:
ft.setCustomAnimations(R.animator.dir_down, R.animator.dir_frozen);
break;
case ANIM_UP:
ft.setCustomAnimations(R.animator.dir_frozen, R.animator.dir_up);
break;
}
final DirectoryFragment fragment = new DirectoryFragment();
fragment.setArguments(args);
ft.replace(R.id.container_directory, fragment);
ft.commitAllowingStateLoss();
}
private static void show(FragmentManager fm, int type, RootInfo root, DocumentInfo doc, String query, int anim) {
final Bundle args = new Bundle();
args.putInt(EXTRA_TYPE, type);
args.putParcelable(EXTRA_ROOT, root);
args.putParcelable(EXTRA_DOC, doc);
args.putString(EXTRA_QUERY, query);
final FragmentTransaction ft = fm.beginTransaction();
switch (anim) {
case ANIM_SIDE:
args.putBoolean(EXTRA_IGNORE_STATE, true);
break;
case ANIM_DOWN:
ft.setCustomAnimations(R.animator.dir_down, R.animator.dir_frozen);
break;
case ANIM_UP:
ft.setCustomAnimations(R.animator.dir_frozen, R.animator.dir_up);
break;
}
final DirectoryFragment fragment = new DirectoryFragment();
fragment.setArguments(args);
ft.replace(R.id.container_directory, fragment);
ft.commitAllowingStateLoss();
}
private static void show(FragmentManager fm, int type, RootInfo root, DocumentInfo doc, String query, int anim) {
final Bundle args = new Bundle();
args.putInt(EXTRA_TYPE, type);
args.putParcelable(EXTRA_ROOT, root);
args.putParcelable(EXTRA_DOC, doc);
args.putString(EXTRA_QUERY, query);
final FragmentTransaction ft = fm.beginTransaction();
switch (anim) {
case ANIM_SIDE:
args.putBoolean(EXTRA_IGNORE_STATE, true);
break;
case ANIM_DOWN:
ft.setCustomAnimations(R.animator.dir_down, R.animator.dir_frozen);
break;
case ANIM_UP:
ft.setCustomAnimations(R.animator.dir_frozen, R.animator.dir_up);
break;
}
final DirectoryFragment fragment = new DirectoryFragment();
fragment.setArguments(args);
ft.replace(R.id.container_directory, fragment);
ft.commitAllowingStateLoss();
}
public void onClickTransitionEffectButton(View v, final boolean pageOrDrawer) {
Bundle bundle = new Bundle();
bundle.putBoolean(
TransitionEffectsFragment.PAGE_OR_DRAWER_SCROLL_SELECT,
pageOrDrawer);
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager
.beginTransaction();
mTransitionEffectsFragment = new TransitionEffectsFragment();
mTransitionEffectsFragment.setArguments(bundle);
fragmentTransaction.setCustomAnimations(0, 0);
fragmentTransaction.replace(R.id.launcher, mTransitionEffectsFragment,
TransitionEffectsFragment.TRANSITION_EFFECTS_FRAGMENT);
fragmentTransaction.commit();
}
private void switchTo(int id) {
FragmentTransaction ft = mManager.beginTransaction();
ft.setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out, android.R.animator.fade_in, android.R.animator.fade_out);
for (int i = 0; i < mFragments.length; i++) {
Fragment f = mFragments[i];
if (f != null) {
if (i != id) {
ft.hide(f);
} else {
ft.show(f);
}
}
}
ft.commit();
}
private LyricsViewFragment init(FragmentManager fragmentManager, boolean startEmpty) {
LyricsViewFragment lyricsViewFragment = (LyricsViewFragment) fragmentManager.findFragmentByTag(LYRICS_FRAGMENT_TAG);
if (lyricsViewFragment == null || lyricsViewFragment.isDetached())
lyricsViewFragment = new LyricsViewFragment();
lyricsViewFragment.startEmpty(startEmpty);
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.setCustomAnimations(R.animator.slide_in_end, R.animator.slide_out_start, R.animator.slide_in_start, R.animator.slide_out_end);
if (!lyricsViewFragment.isAdded()) {
fragmentTransaction.add(id.main_fragment_container, lyricsViewFragment, LYRICS_FRAGMENT_TAG);
}
Fragment[] activeFragments = getActiveFragments();
displayedFragment = getDisplayedFragment(activeFragments);
for (Fragment fragment : activeFragments)
if (fragment != null) {
if (fragment != displayedFragment && !fragment.isHidden()) {
fragmentTransaction.hide(fragment);
fragment.onHiddenChanged(true);
} else if (fragment == displayedFragment)
fragmentTransaction.show(fragment);
}
fragmentTransaction.commit();
return lyricsViewFragment;
}
void addFragmentToStack() {
mStackLevel++;
// Instantiate a new fragment.
Fragment newFragment = CountingFragment.newInstance(mStackLevel);
// Add the fragment to the activity, pushing this transaction
// on to the back stack.
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.setCustomAnimations(R.animator.fragment_slide_left_enter,
R.animator.fragment_slide_left_exit,
R.animator.fragment_slide_right_enter,
R.animator.fragment_slide_right_exit);
ft.replace(R.id.simple_fragment, newFragment);
ft.addToBackStack(null);
ft.commit();
}
/**
* 设置人体正反面
* @author leibing
* @createTime 2016/10/07
* @lastModify 2016/10/07
* @param
* @return
*/
private void setBodyFrontBack() {
switch (curSexFace){
case MAN_FRONT:
// 当为男性正面,则设置为男性反面
curSexFace = MAN_BACK;
break;
case MAN_BACK:
// 当为男性反面,则设置为男性正面
curSexFace = MAN_FRONT;
break;
case WOMEN_FRONT:
// 当为女性正面,则设置为女性反面
curSexFace = WOMEN_BACK;
break;
case WOMEN_BACK:
// 当为女性反面,则设置为女性正面
curSexFace = WOMEN_FRONT;
break;
}
if (curSexFace == MAN_FRONT || curSexFace == WOMEN_FRONT){
// 当前面为男性正面或女性正面均设置为正面
reverseTv.setText("正面");
}else if (curSexFace == MAN_BACK || curSexFace == WOMEN_BACK){
// 当前面为男性反面或女性反面均设置为反面
reverseTv.setText("反面");
}
// 执行动画更新fragment内容
FragmentTransaction fm = getFragmentManager().beginTransaction();
fm.setCustomAnimations(R.anim.animator_two_enter, R.anim.animator_one_exit);
fragmentHumanBody = HumanBodyFragment.newInstance(curSexFace);
fm.replace(R.id.ly_fragment_area, fragmentHumanBody, "FragmentHumanBody");
fm.commit();
}
@Override
public void showFragment(int id, Fragment fragment, String tag, IFragmentsManager.FragmentOpenType openType, IFragmentsManager.FragmentAnimationType animationType) {
android.app.FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
if (animationType == IFragmentsManager.FragmentAnimationType.BOTTOM_TOP) {
ft.setCustomAnimations(R.animator.animation_fragment_bototm_top, R.animator.animation_fragment_top_bototm,
R.animator.animation_fragment_bototm_top, R.animator.animation_fragment_top_bototm);
}
if (openType == IFragmentsManager.FragmentOpenType.OVERLAY) {
ft.add(id, fragment, tag);
if (this instanceof IOverlayable) {
((IOverlayable) this).toggleOverlay();
}
} else {
ft.replace(id, fragment, tag);
}
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
if (fragment instanceof IControlStackHistory) {//Decide ether fragment should be added to stack history
if (((IControlStackHistory) fragment).shouldBeAddedToStack()) {
ft.addToBackStack(tag);
}
} else {
ft.addToBackStack(tag);
}
ft.commitAllowingStateLoss();
}
/**
* 设置人体正反面
* @author leibing
* @createTime 2016/10/07
* @lastModify 2016/10/07
* @param
* @return
*/
private void setBodyFrontBack() {
switch (curSexFace){
case MAN_FRONT:
// 当为男性正面,则设置为男性反面
curSexFace = MAN_BACK;
break;
case MAN_BACK:
// 当为男性反面,则设置为男性正面
curSexFace = MAN_FRONT;
break;
case WOMEN_FRONT:
// 当为女性正面,则设置为女性反面
curSexFace = WOMEN_BACK;
break;
case WOMEN_BACK:
// 当为女性反面,则设置为女性正面
curSexFace = WOMEN_FRONT;
break;
}
if (curSexFace == MAN_FRONT || curSexFace == WOMEN_FRONT){
// 当前面为男性正面或女性正面均设置为正面
reverseTv.setText("正面");
}else if (curSexFace == MAN_BACK || curSexFace == WOMEN_BACK){
// 当前面为男性反面或女性反面均设置为反面
reverseTv.setText("反面");
}
// 执行动画更新fragment内容
FragmentTransaction fm = getFragmentManager().beginTransaction();
fm.setCustomAnimations(R.anim.animator_two_enter, R.anim.animator_one_exit);
fragmentHumanBody = HumanBodyFragment.newInstance(curSexFace);
fm.replace(R.id.ly_fragment_area, fragmentHumanBody, "FragmentHumanBody");
fm.commit();
}
private void openConversation(Conversation conversation, Bundle extras) {
ConversationFragment conversationFragment = (ConversationFragment) getFragmentManager().findFragmentById(R.id.secondary_fragment);
final boolean mainNeedsRefresh;
if (conversationFragment == null) {
mainNeedsRefresh = false;
Fragment mainFragment = getFragmentManager().findFragmentById(R.id.main_fragment);
if (mainFragment instanceof ConversationFragment) {
conversationFragment = (ConversationFragment) mainFragment;
} else {
conversationFragment = new ConversationFragment();
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
fragmentTransaction.setCustomAnimations(
R.animator.fade_right_in, R.animator.fade_right_out,
R.animator.fade_right_in, R.animator.fade_right_out
);
fragmentTransaction.replace(R.id.main_fragment, conversationFragment);
fragmentTransaction.addToBackStack(null);
try {
fragmentTransaction.commit();
} catch (IllegalStateException e) {
Log.w(Config.LOGTAG, "sate loss while opening conversation", e);
//allowing state loss is probably fine since view intents et all are already stored and a click can probably be 'ignored'
return;
}
}
} else {
mainNeedsRefresh = true;
}
conversationFragment.reInit(conversation, extras == null ? new Bundle() : extras);
if (mainNeedsRefresh) {
refreshFragment(R.id.main_fragment);
} else {
invalidateActionBarTitle();
}
IntroHelper.showIntro(this, conversation.getMode() == Conversational.MODE_MULTI);
}
/**
* Replace black list fragment with suggestion list fragment, get ready to show suggestions.
*/
private void showSuggestionFragment() {
if (mSuggestionFragment == null || mSuggestionShowing) {
return;
}
mSuggestionShowing = true;
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.setCustomAnimations(R.animator.fragment_in, R.animator.fragment_out,
R.animator.fragment_in, R.animator.fragment_out);
ft.replace(R.id.fragment_container, mSuggestionFragment)
.addToBackStack(null).commit();
}
public void updateLyricsFragment(int outAnim, int inAnim, boolean transition, boolean lock, Lyrics lyrics) {
LyricsViewFragment lyricsViewFragment = (LyricsViewFragment) getFragmentManager().findFragmentByTag(LYRICS_FRAGMENT_TAG);
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
fragmentTransaction.setCustomAnimations(inAnim, outAnim, inAnim, outAnim);
Fragment activeFragment = getDisplayedFragment(getActiveFragments());
if (lyricsViewFragment != null && lyricsViewFragment.getView() != null) {
SharedPreferences preferences = getSharedPreferences("current_music", Context.MODE_PRIVATE);
String artist = preferences.getString("artist", null);
String track = preferences.getString("track", null);
if (lyrics.isLRC() && !(lyrics.getOriginalArtist().equals(artist) && lyrics.getOriginalTitle().equals(track))) {
LrcView parser = new LrcView(this, null);
parser.setOriginalLyrics(lyrics);
parser.setSourceLrc(lyrics.getText());
lyrics = parser.getStaticLyrics();
}
lyricsViewFragment.manualUpdateLock = lock;
lyricsViewFragment.update(lyrics, lyricsViewFragment.getView(), true);
if (transition) {
fragmentTransaction.hide(activeFragment).show(lyricsViewFragment);
prepareAnimations(activeFragment);
prepareAnimations(lyricsViewFragment);
}
showRefreshFab(true);
lyricsViewFragment.expandToolbar();
} else {
Bundle lyricsBundle = new Bundle();
try {
lyricsBundle.putByteArray("lyrics", lyrics.toBytes());
} catch (IOException e) {
e.printStackTrace();
}
lyricsViewFragment = new LyricsViewFragment();
lyricsViewFragment.setArguments(lyricsBundle);
if (!(activeFragment instanceof LyricsViewFragment) && activeFragment != null)
fragmentTransaction.hide(activeFragment).add(id.main_fragment_container, lyricsViewFragment, LYRICS_FRAGMENT_TAG);
else
fragmentTransaction.replace(id.main_fragment_container, lyricsViewFragment, LYRICS_FRAGMENT_TAG);
}
fragmentTransaction.commitAllowingStateLoss();
}
public static void showFragment(Activity activity, Fragment fragment, int resID, int animationType, boolean addToBackStack) {
// check params and bail if necessary
if (fragment == null || activity == null) {
DUtils.log("bad params: " + DUtils.currentMethod());
return;
}
FragmentManager fragmentManager = activity.getFragmentManager();
FragmentTransaction ft = fragmentManager.beginTransaction();
switch (animationType) {
case 0:
break;
// case 1:
// ft.setCustomAnimations(R.animator.slide_in_left, R.animator.slide_out_left, R.animator.slide_in_right, R.animator.slide_out_right);
// break;
// case 2:
// ft.setCustomAnimations(R.animator.slide_in_down, R.animator.slide_out_down, R.animator.slide_in_up, R.animator.slide_out_up);
// break;
// case 3:
// ft.setCustomAnimations(R.animator.fraggy_enter, R.animator.fraggy_exit, R.animator.fraggy_pop_enter, R.animator.fraggy_pop_exit);
// break;
default:
ft.setCustomAnimations(R.animator.fade_enter, R.animator.fade_exit, R.animator.fade_enter, R.animator.fade_exit);
break;
}
ft.replace(resID, fragment);
if (addToBackStack)
ft.addToBackStack(null);
ft.commit();
}
public void onTabSelected(Tab tab, FragmentTransaction ft) {
// Check if the fragment is already initialized
if (mFragment == null) {
// If not, instantiate and add it to the activity
mFragment = Fragment.instantiate(mActivity, mClass.getName());
ft.add(android.R.id.content, mFragment, mTag);
} else {
// If it exists, simply attach it in order to show it
ft.setCustomAnimations(android.R.animator.fade_in,
R.animator.animationtest);
ft.attach(mFragment);
}
}
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
if (mFragment != null) {
ft.setCustomAnimations(android.R.animator.fade_in,
R.animator.test);
ft.detach(mFragment);
}
}
private void switchToFragment(int i) {
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
fragmentTransaction.setCustomAnimations(android.R.animator.fade_in,
android.R.animator.fade_out);
if (mCurrentFragmentIndex == i) {
fragmentTransaction.add(R.id.fragmentContainer, getFragment(i));
fragmentTransaction.commitAllowingStateLoss();
mCurrentFragmentIndex = i;
if (i == BOTTOM_ITEM_TITLE_MEIZI_INDEX) {
mGirlFragmentAdded = true;
}
return;
}
fragmentTransaction.hide(getFragment(mCurrentFragmentIndex));
switch (i) {
case BOTTOM_ITEM_TITLE_MEIZI_INDEX:
if (mGirlFragmentAdded) {
fragmentTransaction.show(getFragment(i));
} else {
fragmentTransaction.add(R.id.fragmentContainer, getFragment(i));
mGirlFragmentAdded = true;
}
break;
case BOTTOM_ITEM_TITLE_ANDROID_INDEX:
if (mAndroidFragmentAdded) {
fragmentTransaction.show(getFragment(i));
} else {
fragmentTransaction.add(R.id.fragmentContainer, getFragment(i));
mAndroidFragmentAdded = true;
}
break;
case BOTTOM_ITEM_TITLE_IOS_INDEX:
if (mIOSFragmentAdded) {
fragmentTransaction.show(getFragment(i));
} else {
fragmentTransaction.add(R.id.fragmentContainer, getFragment(i));
mIOSFragmentAdded = true;
}
break;
case BOTTOM_ITEM_TITLE_VIDEO_INDEX:
if (mVideoFragmentAdded) {
fragmentTransaction.show(getFragment(i));
} else {
fragmentTransaction.add(R.id.fragmentContainer, getFragment(i));
mVideoFragmentAdded = true;
}
break;
case BOTTOM_ITEM_TITLE_WEB_INDEX:
if (mWebFragmentAdded) {
fragmentTransaction.show(getFragment(i));
} else {
fragmentTransaction.add(R.id.fragmentContainer, getFragment(i));
mWebFragmentAdded = true;
}
break;
default:
break;
}
fragmentTransaction.commitAllowingStateLoss();
mCurrentFragmentIndex = i;
}
public void updateLyricsFragment(int outAnim, String... params) { // Should only be called from SearchFragment or IdDecoder
String artist = params[0];
String song = params[1];
String url = null;
if (params.length > 2)
url = params[2];
LyricsViewFragment lyricsViewFragment = (LyricsViewFragment)
getFragmentManager().findFragmentByTag(LYRICS_FRAGMENT_TAG);
if (lyricsViewFragment != null) {
if (!lyricsViewFragment.isActiveFragment) {
selectItem(0);
}
lyricsViewFragment.fetchLyrics(true, null, 0L, params);
} else {
Lyrics lyrics = new Lyrics(Lyrics.SEARCH_ITEM);
lyrics.setArtist(artist);
lyrics.setTitle(song);
lyrics.setURL(url);
Bundle lyricsBundle = new Bundle();
try {
if (artist != null && song != null)
lyricsBundle.putByteArray("lyrics", lyrics.toBytes());
} catch (IOException e) {
e.printStackTrace();
}
lyricsViewFragment = new LyricsViewFragment();
lyricsViewFragment.setArguments(lyricsBundle);
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
fragmentTransaction.setCustomAnimations(R.animator.slide_in_start, outAnim, R.animator.slide_in_start, outAnim);
Fragment activeFragment = getDisplayedFragment(getActiveFragments());
if (activeFragment != null) {
prepareAnimations(activeFragment);
fragmentTransaction.hide(activeFragment);
}
fragmentTransaction.add(id.main_fragment_container, lyricsViewFragment, LYRICS_FRAGMENT_TAG);
lyricsViewFragment.isActiveFragment = true;
fragmentTransaction.commit();
}
if (drawer instanceof DrawerLayout && !mDrawerToggle.isDrawerIndicatorEnabled()) {
mDrawerToggle.setDrawerIndicatorEnabled(true);
((DrawerLayout) drawer).setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
}
}
private void selectItem(int position) {
FragmentManager fragmentManager = getFragmentManager();
Fragment newFragment;
String tag;
switch (position) {
default:
// Lyrics
tag = LYRICS_FRAGMENT_TAG;
newFragment = fragmentManager.findFragmentByTag(tag);
if (newFragment == null || !(newFragment instanceof LyricsViewFragment))
newFragment = new LyricsViewFragment();
((LyricsViewFragment) newFragment).showTransitionAnim = true;
break;
case 1:
// Recent Tracks
tag = RECENT_TRACKS_FRAGMENT_TAG;
newFragment = fragmentManager.findFragmentByTag(tag);
if (newFragment == null || !(newFragment instanceof RecentTracksFragment))
newFragment = new RecentTracksFragment();
((RecentTracksFragment) newFragment).showTransitionAnim = true;
break;
case 2:
// Saved Lyrics
tag = LOCAL_LYRICS_FRAGMENT_TAG;
newFragment = fragmentManager.findFragmentByTag(tag);
if (newFragment == null || !(newFragment instanceof LocalLyricsFragment))
newFragment = new LocalLyricsFragment();
((LocalLyricsFragment) newFragment).showTransitionAnim = true;
break;
case 3:
// Separator
return;
case 4:
// Settings
if (drawer instanceof DrawerLayout)
((DrawerLayout) drawer).closeDrawer(drawerView);
drawer.postDelayed(new Runnable() {
@Override
public void run() {
Intent settingsIntent = new Intent(MainActivity.this, SettingsActivity.class);
startActivityForResult(settingsIntent, 77);
}
}, 250);
return;
case 5:
// Feedback
return;
case 6:
// About Dialog
if (drawer instanceof DrawerLayout)
((DrawerLayout) drawer).closeDrawer(drawerView);
drawer.postDelayed(new Runnable() {
@Override
public void run() {
Intent aboutIntent = new Intent(MainActivity.this, AboutActivity.class);
startActivityForResult(aboutIntent, 77);
}
}, 250);
return;
}
final Fragment activeFragment = getDisplayedFragment(getActiveFragments());
prepareAnimations(activeFragment);
// Insert the fragment by replacing any existing fragment
if (newFragment != activeFragment) {
if (mActionMode != null)
mActionMode.finish();
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
fragmentTransaction.setCustomAnimations(R.animator.slide_in_start, R.animator.slide_out_start, R.animator.slide_in_start, R.animator.slide_out_start);
fragmentTransaction.hide(activeFragment);
if (newFragment.isAdded())
fragmentTransaction.show(newFragment);
else
fragmentTransaction.add(id.main_fragment_container, newFragment, tag);
((CollapsingToolbarLayout) findViewById(R.id.toolbar_layout)).setCollapsedTitleTextColor(Color.WHITE);
fragmentTransaction.commitAllowingStateLoss();
if (activeFragment instanceof LyricsViewFragment || newFragment instanceof LyricsViewFragment) {
final Fragment newFragmentCopy = newFragment;
activeFragment.getView().postDelayed(() -> {
if (activeFragment instanceof LyricsViewFragment && activeFragment.getView() != null) {
expandToolbar(false);
showRefreshFab(false);
} else if (newFragmentCopy instanceof LyricsViewFragment && activeFragment.getView() != null) {
expandToolbar(true);
showRefreshFab(true);
}
}, getResources().getInteger(android.R.integer.config_longAnimTime));
}
MaterialSuggestionsSearchView suggestionsSearchView = findViewById(id.material_search_view);
if (suggestionsSearchView.isSearchOpen())
suggestionsSearchView.closeSearch();
}
if (drawer instanceof DrawerLayout && (newFragment == activeFragment))
((DrawerLayout) drawer).closeDrawer(drawerView);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.orrery_main);
ImageView orrery = (ImageView) findViewById(R.id.orrery);
OrreryDrawable myOrreryDrawable = OrreryDrawable.Create();
orrery.setImageDrawable(myOrreryDrawable);
// ================================================================
// 分别控制两种属性的动画
// PropertyValuesHolder earthPositionValues = PropertyValuesHolder
// .ofFloat("EarthPosition", 0, (float) (2 * Math.PI));
// PropertyValuesHolder moonPositionValues =
// PropertyValuesHolder.ofFloat(
// "MoonPosition", 0, (float) (2 * Math.PI * 13));
// ObjectAnimator orreryAnimator =
// ObjectAnimator.ofPropertyValuesHolder(
// myOrreryDrawable, earthPositionValues, moonPositionValues);
// ================================================================
// 使用新的数据结构,同时控制地球和月球
OrreryDrawable.SolarSystemData startSolarSystemData = new OrreryDrawable.SolarSystemData();
startSolarSystemData.rotationEarth = 0;
startSolarSystemData.rotationMoon = 0;
OrreryDrawable.SolarSystemData endSolarSystemData = new OrreryDrawable.SolarSystemData();
endSolarSystemData.rotationEarth = (float) (2 * Math.PI);
endSolarSystemData.rotationMoon = (float) (2 * Math.PI * 13);
// 使用自定义的Evaluator
OrreryEvaluator orreryEvaluator = new OrreryEvaluator();
// ObjectAnimator orreryAnimator = ObjectAnimator.ofObject(
// myOrreryDrawable, "SolarSystemData", orreryEvaluator,
// startSolarSystemData, endSolarSystemData);
// ================================================================
// 尝试一下Keyframe
Keyframe startFrame = Keyframe.ofObject(0, startSolarSystemData);
Keyframe endFrame = Keyframe.ofObject(1, endSolarSystemData);
PropertyValuesHolder solarSystemFrames = PropertyValuesHolder
.ofKeyframe("SolarSystemData", startFrame, endFrame);
solarSystemFrames.setEvaluator(orreryEvaluator);
ObjectAnimator orreryAnimator = ObjectAnimator.ofPropertyValuesHolder(
myOrreryDrawable, solarSystemFrames);
// Default value is 10
Log.i("FrameDelay", "delay: " + ValueAnimator.getFrameDelay());
ValueAnimator.setFrameDelay(50);
orreryAnimator.setDuration(60000);
orreryAnimator.setInterpolator(new LinearInterpolator());
orreryAnimator.setRepeatCount(ValueAnimator.INFINITE);
orreryAnimator.setRepeatMode(ValueAnimator.RESTART);
orreryAnimator.start();
// add the fragment:
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.setCustomAnimations(R.anim.fade_in, android.R.animator.fade_out);
ft.add(R.id.frame, new OrreryInfo());
ft.commit();
}