前段时间,我们做了一下Android的几个动画(http://blog.csdn.net/qq_25193681/article/details/51777248),对Android的补间动画有了一定的了解。但是在Android的3.0之后,google又提出了属性动画的这样一个框架,他可以更好的帮助我们实现更丰富的动画效果。所以为了跟上技术的步伐,今天就聊一聊属性动画。
这一次的需求是这样的:当点击一个View的时候,显示下面隐藏的一个View,要实现这个功能,需要将V iew的visibility属性设置gone为visible即可,但是这个过程是一瞬间的,并不能实现我们要的效果。所以,属性动画是个不错的方案。
先把效果贴上
第一个:
第二个:
前面的这个是隐藏着,后面这个是显示的。当点击这个箭头的时候,来切换显示或者隐藏,
现在开始编码:
布局文件如下
= = = = = = > = = = = > = = = = = = = /> > = = = = = > = = = = = = /> = = = = = /> > = = = = = = > = = = = = = /> = = = = = /> > = = = = = = > = = = = = /> > >
这里面代码并不多,也很简单,三个线性布局,里面装载着各自的控件,并且还设置了ID。按钮是一个线性布局,采用了onClick自身的点击事件。接下来,当点击了这个线性布局的时候,需要隐藏的控件最终到达一个高度,这个就是我们的目标值,只需要通过布局中的dp转换成像素就行了。
+ );
这里是120就是我们布局里面定义的高度。
然后给这个过程增加一个动画效果。
ValueAnimator animator = ValueAnimator.ofInt(start, end); animator.addUpdateListener( AnimatorUpdateListener() { @Override (ValueAnimator arg0) { = () arg0.getAnimatedValue(); ViewGroup.LayoutParams layoutParams = v.getLayoutParams(); layoutParams.height = ; v.setLayoutParams(layoutParams); } });
通过这样一个简单的ValueAnimator ,就可以很方便的实现显示和隐藏的动画效果了。
下面是完整的代码。
android.animation.Animator; android.animation.AnimatorListenerAdapter; android.animation.ValueAnimator; android.animation.ValueAnimator.AnimatorUpdateListener; android.os.Bundle; android.support.v7.app.ActionBarActivity; android.view.View; android.view.ViewGroup; android.view.Window; android.view.animation.Animation; android.view.animation.RotateAnimation; android.widget.ImageView; android.widget.LinearLayout; { LinearLayout mHiddenLayout; mDensity; mHiddenViewMeasuredHeight; ImageView mIv; (Bundle savedInstanceState) { .onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); //URL:http://www.bianceng.cn/OS/extra/201608/50381.htm mHiddenLayout = (LinearLayout) findViewById(R.id.linear_hidden); mIv = (ImageView) findViewById(R.id.my_iv); mDensity = getResources().getDisplayMetrics().density; mHiddenViewMeasuredHeight = () (mDensity * + ); } (View v) { (mHiddenLayout.getVisibility() == View.GONE) { animateOpen(mHiddenLayout); animationIvOpen(); } { animateClose(mHiddenLayout); animationIvClose(); } } (View v) { v.setVisibility(View.VISIBLE); ValueAnimator animator = createDropAnimator(v, , mHiddenViewMeasuredHeight); animator.start(); } () { RotateAnimation animation = RotateAnimation(, , Animation.RELATIVE_TO_SELF, f, Animation.RELATIVE_TO_SELF, f); animation.setFillAfter(); animation.setDuration(); mIv.startAnimation(animation); } () { RotateAnimation animation = RotateAnimation(, , Animation.RELATIVE_TO_SELF, f, Animation.RELATIVE_TO_SELF, f); animation.setFillAfter(); animation.setDuration(); mIv.startAnimation(animation); } ( View view) { origHeight = view.getHeight(); ValueAnimator animator = createDropAnimator(view, origHeight, ); animator.addListener( AnimatorListenerAdapter() { (Animator animation) { view.setVisibility(View.GONE); } }); animator.start(); } ValueAnimator ( View v, start, end) { ValueAnimator animator = ValueAnimator.ofInt(start, end); animator.addUpdateListener( AnimatorUpdateListener() { (ValueAnimator arg0) { value = () arg0.getAnimatedValue(); ViewGroup.LayoutParams layoutParams = v.getLayoutParams(); layoutParams.height = value; v.setLayoutParams(layoutParams); } }); animator; } }
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索android
, 布局
, view
, linearlayout动态布局
, 动画
, animate
, android时间显示
, animation
, android 布局
, android布局的实现
, layoutparams
, android 动画效果
, 自定义 iew
, iew lipper
ecycler iew
css3 下拉展开 动画、android 下拉展开动画、ios 实现展开动画效果、select下拉框展开事件、android 布局展开收起,以便于您获取更多的相关知识。