如何在Android中将顶部的布局设置为300dp,反之亦然?

需求

我可以根据toYDelta="100%toYDelta="50%toYDelta="50%来进行布局

但是我只想在300dp Height制作animation布局。

slide_down.xml

 <translate xmlns:android="http://schemas.android.com/apk/res/android" android:duration="500" android:fromYDelta="0" android:toYDelta="100%" /> 

slide_up.xml

 <translate xmlns:android="http://schemas.android.com/apk/res/android" android:duration="500" android:fromYDelta="100%" android:toYDelta="0" /> 

Java代码(animation)

 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高度怎么做?

请帮我解决这个问题。

谢谢。

Solutions Collecting From Web of "如何在Android中将顶部的布局设置为300dp,反之亦然?"

查看animation

令人惊讶的是,似乎没有办法在XML中指定300dp的翻译animation。 翻译animationXML语法接受三种不同的距离规格:

  • 相对于正常位置的绝对像素(例如android:toYDelta="10"
  • 相对于元素宽度/高度的百分比(例如android:toYDelta="10%"
  • 相对于父宽度/高度的百分比(例如android:toYDelta="10%p"

当您通过Java创buildTranslateAnimation时,您也被限制在相同的规格。 但是,在Java中,您可以计算等效绝对像素值(对于给定设备),并将其作为像素平移距离。

要获得300dp,您可以在XML中定义300dp的维值 ,或者只需在代码中执行计算。

里面dimens.xml

 <dimen name="distance">300dp</dimen> 

在你的活动/片段/等:

 float distance = getResources().getDimensionPixelSize(R.dimen.distance); 

要么

在你的活动/片段/等:

 float distance = TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP, 300, getResources().getDisplayMetrics() ); 

然后,您只需在创buildTranslateAnimation时使用该距离即可:

 TranslateAnimation animation = new TranslateAnimation( Animation.ABSOLUTE, 0, Animation.ABSOLUTE, 0, Animation.ABSOLUTE, 0, Animation.ABSOLUTE, distance ); 

物业animation

如果您的目标是Android 3.0及更高版本,则可以使用新的Property Animation框架更优雅地expression同一个animation:

 view.animate().translationY(distance).setDuration(...).start(); 

如果您仍然定位到Android 2.x,则可以使用NineOldAndroids获取向后兼容的animation语法。 它会自动为支持它的设备使用新的属性animation。

 ViewPropertyAnimator.animate(view).translationY(distance).setDuration(...).start();