属性动画的应用

属性动画

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <!-- 上面部分 -->

    <RelativeLayout
        android:background="#ffffff"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="4dp" >

        <ImageView
            android:id="@+id/app_detail_safe_iv_arrow"
            android:layout_width="15dp"
            android:layout_height="15dp"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:layout_marginRight="15dp"
            android:src="@drawable/arrow_down" />

        <!-- 图片容器 -->

        <LinearLayout
            android:id="@+id/app_detail_safe_pic_container"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:paddingBottom="5dp"
            android:paddingLeft="10dp"
            android:paddingTop="5dp" >
        </LinearLayout>
    </RelativeLayout>

    <!-- 下面部分 -->

    <LinearLayout
        android:background="#ffffff"
        android:id="@+id/app_detail_safe_des_container"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >
    </LinearLayout>

</LinearLayout>
public class AppDetailSafeHolder extends BaseHolder<AppInfoBean> implements OnClickListener {
    @ViewInject(R.id.app_detail_safe_pic_container)
    LinearLayout    mContainerPic;

    @ViewInject(R.id.app_detail_safe_des_container)
    LinearLayout    mContainerDes;

    @ViewInject(R.id.app_detail_safe_iv_arrow)
    ImageView       mIvArrow;

    private boolean isOpen  = true;

    @Override
    public View initHolderView() {

        View view = View.inflate(UIUtils.getContext(), R.layout.item_app_detail_safe, null);
        ViewUtils.inject(this, view);

        view.setOnClickListener(this);
        return view;
    }

    @Override
    public void refreshHolderView(AppInfoBean data) {
        List<AppInfoSafeBean> safeBeans = data.safe;
        for (AppInfoSafeBean appInfoSafeBean : safeBeans) {
            ImageView ivIcon = new ImageView(UIUtils.getContext());
            BitmapHelper.display(ivIcon, URLS.IMAGEBASEURL + appInfoSafeBean.safeUrl);
            mContainerPic.addView(ivIcon);

            LinearLayout ll = new LinearLayout(UIUtils.getContext());

            // 描述图标
            ImageView ivDes = new ImageView(UIUtils.getContext());
            BitmapHelper.display(ivDes, URLS.IMAGEBASEURL + appInfoSafeBean.safeDesUrl);
            // 描述内容
            TextView tvDes = new TextView(UIUtils.getContext());
            tvDes.setText(appInfoSafeBean.safeDes);
            if (appInfoSafeBean.safeDesColor == 0) {
                tvDes.setTextColor(UIUtils.getColor(R.color.app_detail_safe_normal));
            } else {
                tvDes.setTextColor(UIUtils.getColor(R.color.app_detail_safe_warning));
            }

            tvDes.setGravity(Gravity.CENTER);
            // 加点间距
            int padding = UIUtils.dip2Px(5);
            ll.setPadding(padding, padding, padding, padding);

            ll.addView(ivDes);
            ll.addView(tvDes);

            mContainerDes.addView(ll);

        }
        // 默认折叠
        toggle(false);
    }

    @Override
    public void onClick(View v) {
        toggle(true);
    }

    private void toggle(boolean isAnimation) {
        if (isOpen) {// 折叠

            /**
             mContainerDes高度发生变化
             应有的高度-->0
             */

            mContainerDes.measure(0, 0);
            int measuredHeight = mContainerDes.getMeasuredHeight();
            int start = measuredHeight;// 动画的开始高度
            int end = 0;// 动画的结束高度
            if (isAnimation) {
                doAnimation(start, end);
            } else {// 直接修改高度
                LayoutParams params = mContainerDes.getLayoutParams();
                params.height = end;
                mContainerDes.setLayoutParams(params);
            }
        } else {// 展开
            /**
             mContainerDes高度发生变化
             0-->应有的高度
             */
            mContainerDes.measure(0, 0);
            int measuredHeight = mContainerDes.getMeasuredHeight();
            int end = measuredHeight;// 动画的开始高度
            int start = 0;// 动画的结束高度
            if (isAnimation) {
                doAnimation(start, end);
            } else {
                LayoutParams params = mContainerDes.getLayoutParams();
                params.height = end;
                mContainerDes.setLayoutParams(params);
            }
        }
        // 箭头的旋转动画
        if (isAnimation) {// 有折叠动画的时候
            if (isOpen) {
                ObjectAnimator.ofFloat(mIvArrow, "rotation", 180, 0).start();
            } else {
                ObjectAnimator.ofFloat(mIvArrow, "rotation", 0, 180).start();
            }
        }

        isOpen = !isOpen;
    }

    public void doAnimation(int start, int end) {
        ValueAnimator animator = ValueAnimator.ofInt(start, end);
        animator.start();// 开始动画
        animator.addUpdateListener(new AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator value) {
                int height = (Integer) value.getAnimatedValue();
                // 通过layoutParams,修改高度
                LayoutParams params = mContainerDes.getLayoutParams();
                params.height = height;
                mContainerDes.setLayoutParams(params);
            }
        });
    }

}
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="4dp" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@android:color/white"
        android:orientation="vertical"
        android:padding="5dp" >

        <!-- 简介 -->

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:singleLine="true"
            android:text="简介"
            android:textColor="@android:color/black"
            android:textSize="16sp" />

        <!-- 描述详情区域 -->

        <TextView
            android:id="@+id/app_detail_des_tv_des"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="5dp"
            android:text="内容"
            android:textColor="@android:color/darker_gray"
            android:textSize="14sp" />

        <!-- 作者区域 -->

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="25dp" >

            <TextView
                android:id="@+id/app_detail_des_tv_author"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerVertical="true"
                android:text="作者 : "
                android:textColor="@android:color/darker_gray"
                android:textSize="14sp" />

            <ImageView
                android:id="@+id/app_detail_des_iv_arrow"
                android:layout_width="15dp"
                android:layout_height="15dp"
                android:layout_alignParentRight="true"
                android:layout_centerVertical="true"
                android:src="@drawable/arrow_down" />
        </RelativeLayout>
    </LinearLayout>

</FrameLayout>
public class AppDetailDesHolder extends BaseHolder<AppInfoBean> implements OnClickListener {
    @ViewInject(R.id.app_detail_des_tv_author)
    TextView            mTvAuthor;

    @ViewInject(R.id.app_detail_des_iv_arrow)
    ImageView           mIvArrow;

    @ViewInject(R.id.app_detail_des_tv_des)
    TextView            mTvDes;
    private boolean     isOpen  = true;
    private int         mTvDesMeasuredHeight;

    private AppInfoBean mData;

    @Override
    public View initHolderView() {
        View view = View.inflate(UIUtils.getContext(), R.layout.item_app_detail_des, null);
        ViewUtils.inject(this, view);
        view.setOnClickListener(this);
        return view;
    }

    @Override
    public void refreshHolderView(AppInfoBean data) {
        mData = data;

        mTvAuthor.setText(data.author);
        mTvDes.setText(data.des);

        mTvDes.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {

            @Override
            public void onGlobalLayout() {
                mTvDesMeasuredHeight = mTvDes.getMeasuredHeight();
                // 默认折叠
                toggle(false);
                // 如果不移除,一会高度变成7行的时候.mTvDesMeasuredHeight就会变
                mTvDes.getViewTreeObserver().removeGlobalOnLayoutListener(this);
            }
        });

    }

    @Override
    public void onClick(View v) {
        toggle(true);
    }

    private void toggle(boolean isAnimation) {
        if (isOpen) {// 折叠

            /**
             mTvDes高度发生改变
             应有的高度-->7行的高度
             */
            int start = mTvDesMeasuredHeight;
            int end = getShortHeight(7, mData);
            if (isAnimation) {
                doAnimation(start, end);
            } else {
                mTvDes.setHeight(end);
            }
        } else {// 展开
            int start = getShortHeight(7, mData);
            int end = mTvDesMeasuredHeight;
            if (isAnimation) {
                doAnimation(start, end);
            } else {
                mTvDes.setHeight(end);
            }
        }

        if (isAnimation) {// mTvDes正在折叠或者展开
            if (isOpen) {
                ObjectAnimator.ofFloat(mIvArrow, "rotation", 180, 0).start();
            } else {
                ObjectAnimator.ofFloat(mIvArrow, "rotation", 0, 180).start();
            }
        }
        isOpen = !isOpen;

    }

    public void doAnimation(int start, int end) {
        ObjectAnimator animator = ObjectAnimator.ofInt(mTvDes, "height", start, end);
        animator.start();
        animator.addListener(new AnimatorListener() {

            @Override
            public void onAnimationStart(Animator arg0) {// 动画开始
            }

            @Override
            public void onAnimationRepeat(Animator arg0) {// 动画重复
            }

            @Override
            public void onAnimationEnd(Animator arg0) {// 动画结束
                ViewParent parent = mTvDes.getParent();
                while (true) {
                    parent = parent.getParent();
                    if (parent == null) {// 已经没有父亲
                        break;
                    }
                    if (parent instanceof ScrollView) {// 已经找到
                        ((ScrollView) parent).fullScroll(View.FOCUS_DOWN);
                        break;
                    }

                }
            }

            @Override
            public void onAnimationCancel(Animator arg0) {// 动画取消
            }
        });
    }

    /**
     * @param i 指定行高
     * @param data 指定textView的内容
     * @return
     */
    private int getShortHeight(int i, AppInfoBean data) {
        //临时textView,只做测绘用
        TextView tempTextView = new TextView(UIUtils.getContext());
        tempTextView.setLines(7);
        tempTextView.setText(data.des);

        tempTextView.measure(0, 0);

        int measuredHeight = tempTextView.getMeasuredHeight();

        return measuredHeight;
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值