【关键词】

Android 高度 动画

【问题】
  • 实现可见度为 gone 的 view ,高度从0变化到测量的高度;
  • 如果view 可见度为 gone, 直接通过 view.getHeight();得到的是0;
  • 虽然可以通过一个固定值来设置高度,但是如果高度设置的不准就会存在适配问题(应该有一种方法在gone的情况下也可以获取到view的高度);
【效果图】
【分析】
  • 找到一种方式可以在 可见度为 GONE 的情况下,也能获取到准确的高度的方法,具体信息参见最后【参考资料】;
【解决方案】
  • 如果是显示:在动画执行之前,设置可见性为 Visible; 获取到要显示到的最大高度,让其高度通过动画的方式逐渐变大;
  • 如果是隐藏:通过 view.getLayoutParam.height 获取到当前显示时的高度,让其逐渐变化到0;动画执行后设置可见性为GONE;

【代码】

使用方法:

            // 显示             View vHead = findViewById(R.id.llyt_v_head);             AnimatorUtil.animHeightToView(this, vHead, true, 200);             // 隐藏             View vHead = findViewById(R.id.llyt_v_head);             AnimatorUtil.animHeightToView(this, vHead, false, 200);          

帮助类

            public class AnimatorUtil {              // 高度渐变的动画;              public static void animHeightToView(final View v, final int start, final int end, final boolean isToShow,              long duration) {                            ValueAnimator va = ValueAnimator.ofInt(start, end);              final ViewGroup.LayoutParams layoutParams = v.getLayoutParams();              va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {              @Override              public void onAnimationUpdate(ValueAnimator animation) {              int h = (int) animation.getAnimatedValue();              layoutParams.height = h;              v.setLayoutParams(layoutParams);              v.requestLayout();              }              });                            va.addListener(new AnimatorListenerAdapter() {              @Override              public void onAnimationStart(Animator animation) {              if (isToShow) {              v.setVisibility(View.VISIBLE);              }              super.onAnimationStart(animation);              }                            @Override              public void onAnimationEnd(Animator animation) {              super.onAnimationEnd(animation);              if (!isToShow) {              v.setVisibility(View.GONE);              }              }              });              va.setDuration(duration);              va.start();              }                            public static void animHeightToView(final Activity context, final View v, final boolean isToShow, final long duration) {                            if (isToShow) {              // 显示:通过上下文对象context获取可见度属性为 gone 的 view 的高度;              Display display = context.getWindowManager().getDefaultDisplay();              Point size = new Point();              display.getSize(size);              v.measure(size.x, size.y);              int end= v.getMeasuredHeight();              animHeightToView(v, 0, end, isToShow, duration);              } else {              // 隐藏:从当前高度变化到0,最后设置不可见;              animHeightToView(v, v.getLayoutParams().height, 0, isToShow, duration);              }              }                       
【扩展】
            // WindowManager也可以直接通过Context获取;             WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);             Display display = wm.getDefaultDisplay();          
【参考资料】
  • Android - 在View显示前获取其高度和宽度
                         Android开发经常需要在Activity显示前获取某个View的高度和宽度,例如:程序需要在onCreate()方法中得到一个View的高度和宽度,或者需要知道一个VisibilityGoneView的高度和宽度。此时如果直接调用ViewgetWidth()和getHeight()方法,得到的结果是0                       原因是在上述情况中,View并没有实际绘制,既然原因找到了,解决办法也就有了,我们可以调用View.measure()方法,之后在获取View.getMeasuredWidth()和View.getMeasuredHeight()。                      Display display = getWindowManager().getDefaultDisplay();                      Point size = new Point();                      display.getSize(size);                      view.measure(size.x, size.y);                      int width = view.getMeasuredWidth();                      int height = view.getMeasuredHeight();                  

更多相关文章

  1. 国行Android手机使用google全套GMS服务小结
  2. Android(安卓)Demo:读取本地图库与调用摄像头拍摄
  3. Android获取本机号码(双卡双待无法获取两个号码)
  4. 手机上, 除了游戏, 还能做什么?
  5. 记录WebView从开始加载到渲染结束的时间
  6. [Android] AlertDialog获取网上天气并显示各城市天气
  7. Android常用的一些服务demo源码
  8. [Android] SharedPreferences(轻量级的存储方式)
  9. Android通过URI获取文件路径

随机推荐

  1. 谈谈Android的那些事
  2. Android安全加密:对称加密
  3. android:scaleType、android:layout_alig
  4. 搭建 Android(安卓)2.2 开发环境
  5. android 小知识
  6. Android(安卓)新手扫盲
  7. Android接入WebView(五)——浏览器制作总结
  8. Windows下Android平台搭建_2
  9. 控件的android:layout_alignParentTop属
  10. Android实现录屏直播(二)需求才是硬道理之