有时候想把标题下的内容折叠/展示以减少空间,这里有个控件叫CollapseView,效果图:

其中CollapseView.java

import android.content.Context;import android.graphics.Color;import android.text.TextUtils;import android.util.AttributeSet;import android.util.Log;import android.view.Gravity;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.view.animation.Animation;import android.view.animation.Transformation;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.RelativeLayout;import android.widget.TextView;import com.edwin.R;/** * 折叠/展开ViewGroup * * @USER Edwin * @DATE 16/6/5 上午1:57 */public class CollapseView extends LinearLayout {    private final Context mContext;    private long duration = 555;//展开/折叠的时间(s)    private TextView mNumberTextView;    private TextView mTitleTextView;    private RelativeLayout mTitleRelativeLayout;    private RelativeLayout mContentRelativeLayout;    private ImageView mArrowImageView;    private int parentWidthMeasureSpec;    private int parentHeightMeasureSpec;    public CollapseView(Context context, AttributeSet attrs) {        super(context, attrs);        mContext = context;        LayoutInflater.from(context).inflate(R.layout.collapse_layout, this);        init();    }    @Override    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {        super.onMeasure(widthMeasureSpec, heightMeasureSpec);        parentWidthMeasureSpec = widthMeasureSpec;        parentHeightMeasureSpec = heightMeasureSpec;    }    private void init() {        mNumberTextView = (TextView) findViewById(R.id.numberTextView);        mTitleTextView = (TextView) findViewById(R.id.titleTextView);        mTitleRelativeLayout = (RelativeLayout) findViewById(R.id.titleRelativeLayout);        mContentRelativeLayout = (RelativeLayout) findViewById(R.id.contentRelativeLayout);        mArrowImageView = (ImageView) findViewById(R.id.arrowImageView);        mTitleRelativeLayout.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View v) {                rotateArrow();            }        });        collapse(mContentRelativeLayout);    }    public void setNumber(String number) {        if (!TextUtils.isEmpty(number)) {            mNumberTextView.setText(number);        }    }    public void setTitle(String title) {        if (!TextUtils.isEmpty(title)) {            mTitleTextView.setText(title);        }    }    public void setContent(int resID) {        LinearLayout layout = new LinearLayout(mContext);        layout.setBackgroundColor(Color.parseColor("#E7E7EF"));        LayoutParams params = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);        layout.setLayoutParams(params);        ImageView view = new ImageView(mContext);        params.gravity = Gravity.CENTER;        view.setLayoutParams(params);        view.setImageResource(resID);        layout.addView(view);        mContentRelativeLayout.addView(layout);    }    public void setContent(String content) {        TextView view = new TextView(mContext);        view.setText(content);        mContentRelativeLayout.addView(view);    }    private void rotateArrow() {        int angle = 0;        if (mArrowImageView.getTag() == null || mArrowImageView.getTag().equals(true)) {            mArrowImageView.setTag(false);            angle = -180;            //TODO 展开            expand(mContentRelativeLayout);        } else {            angle = 0;            mArrowImageView.setTag(true);            //TODO 折叠            collapse(mContentRelativeLayout);        }        mArrowImageView.animate().setDuration(duration).rotation(angle);    }    /**     * 折叠     *     * @param view 视图     */    private void collapse(final View view) {        final int measuredHeight = view.getMeasuredHeight();        Animation animation = new Animation() {            /*绘制动画的过程中会反复的调用applyTransformation 函数,每次调用参数interpolatedTime值都会变化,                该参数从0渐变为1,当该参数为1时表明动画结束。*/            @Override            protected void applyTransformation(float interpolatedTime, Transformation t) {                Log.e("TAG", "interpolatedTime = " + interpolatedTime);                if (interpolatedTime == 1) {                    mContentRelativeLayout.setVisibility(GONE);                } else {                    view.getLayoutParams().height = measuredHeight - (int) (measuredHeight * interpolatedTime);                    view.requestLayout();                }            }        };        animation.setDuration(duration);        view.startAnimation(animation);    }    @Override    protected void onLayout(boolean changed, int l, int t, int r, int b) {        super.onLayout(changed, l, t, r, b);    }    /**     * 展开     *     * @param view 视图     */    private void expand(final View view) {        view.measure(parentWidthMeasureSpec, parentHeightMeasureSpec);        final int measuredHeight = view.getMeasuredHeight();        view.setVisibility(View.VISIBLE);        Animation animation = new Animation() {            @Override            protected void applyTransformation(float interpolatedTime, Transformation t) {                Log.e("TAG", "interpolatedTime = " + interpolatedTime);                if (interpolatedTime == 1) {                    view.getLayoutParams().height = measuredHeight;                } else {                    view.getLayoutParams().height = (int) (measuredHeight * interpolatedTime);                }                view.requestLayout();            }            @Override            public boolean willChangeBounds() {                return true;            }        };        animation.setDuration(duration);        view.startAnimation(animation);    }}
java:

private CollapseView CollapseView1;CollapseView1 = (CollapseView) findViewById(R.id.collapseView1);CollapseView1.setNumber("1");CollapseView1.setTitle("女友");CollapseView1.setContent(R.mipmap.aaa);
xml:


来源: https://github.com/why168/CollapseView


更多相关文章

  1. android 属性动画之 ObjectAnimator
  2. Android 自定义SurfaceView实现加载GIF动画
  3. Android Activity或者Fragment 向Adapter实时传递参数
  4. Android 动画效果学习笔记
  5. android 视图设置多个setTag数据
  6. Android Activity屏幕切换动画-左右滑动切换
  7. 今天发现了一个不错的android加载动画
  8. Android:Handler实现ProgressDialog动画加载

随机推荐

  1. Protobuf的使用和原理
  2. Nodejs 源码阅读指南
  3. kafka数据定时导入hive便于后续做数据清
  4. 【DB笔试面试663】在Oracle中,死锁的产生
  5. 【DB笔试面试661】在Oracle中,在新建或重
  6. js bridge 实现原理
  7. Shell脚本中的while getopts用法小结
  8. 全文检索技术ElasticSearch使用
  9. 【js效果】倒计时
  10. 【DB笔试面试672】在Oracle中,errorstack