我可以在toYDelta="100%
或toYDelta="50%
等基础上翻译布局。
但我想仅在300dp Height
。
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="500"
android:fromYDelta="0"
android:toYDelta="100%" />
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="500"
android:fromYDelta="100%"
android:toYDelta="0" />
Animation animation = AnimationUtils.loadAnimation(getActivity().getApplicationContext(),R.anim.slide_down);
animation.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationRepeat(Animation animation) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationEnd(Animation animation) {
// TODO Auto-generated method stub
// I can hide layout after animation completion
}
});
如何根据300dp高度做什么?
请帮我解决这个问题。
谢谢。
答案 0 :(得分:35)
令人惊讶的是,似乎没有办法在XML中指定300dp的翻译动画。翻译动画XML syntax接受三种不同的距离规范:
android:toYDelta="10"
)android:toYDelta="10%"
)android:toYDelta="10%p"
)创建TranslateAnimation
via Java时,您也会受到相同规格的限制。但是,在Java中,您可以计算等效的绝对像素值(对于给定的设备),并将其作为像素平移距离提供。
要获得300dp,您可以在XML中定义dimen value 300dp,或者只是在代码中执行计算。
内部dimens.xml
:
<dimen name="distance">300dp</dimen>
在您的Activity / Fragment / etc中:
float distance = getResources().getDimensionPixelSize(R.dimen.distance);
或强>
在您的Activity / Fragment / etc中:
float distance = TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, 300,
getResources().getDisplayMetrics()
);
然后,您需要做的就是在创建TranslateAnimation
时使用该距离:
TranslateAnimation animation = new TranslateAnimation(
Animation.ABSOLUTE, 0,
Animation.ABSOLUTE, 0,
Animation.ABSOLUTE, 0,
Animation.ABSOLUTE, distance
);
如果您的目标是Android 3.0及更高版本,则可以使用新的Property Animation框架更优雅地表达相同的动画:
view.animate().translationY(distance).setDuration(...).start();
如果您仍然定位到Android 2.x,则可以使用NineOldAndroids来获得向后兼容的动画语法。它会自动为支持它的设备使用新的属性动画。
ViewPropertyAnimator.animate(view).translationY(distance).setDuration(...).start();