码迷,mamicode.com
首页 > 其他好文 > 详细

一步步实现gif动画下拉(二)

时间:2015-07-31 14:57:40      阅读:246      评论:0      收藏:0      [点我收藏+]

标签:listview   下拉自动刷新   

http://blog.csdn.net/yoyo_newbie/article/details/47167933

第二步,隐藏头部文件headerview,对于菜鸟来说这一步很关键。

原理是通过设置他的marginTop的总高度的负数来隐藏它。然而我们通过直接调用

view.getMeasuredHeight()
直接获取的高度为0!所以就要解决这个问题。我们可以通过通知父布局测量总高度即可、如下

    /**
     * 测量view的真实高度,并返回
     */
    private int measureView(View view)
{
    LinearLayout.LayoutParams params = (LayoutParams) view.getLayoutParams();
    int width = LinearLayout.getChildMeasureSpec(0, 0, params.width);
    int tempHeight = params.height;
    int height = tempHeight>0? MeasureSpec.makeMeasureSpec(tempHeight, MeasureSpec.EXACTLY): MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
    view.measure(width, height);
    return view.getMeasuredHeight();
}
其中部分知识我就不多讲了,自己去查,一时半刻是无法解析的,比较抽象,需要自己动手理解,自己动手吧骚年。



然后我们定义一个高度变量,隐藏头部文件的方法和设置headerView的marginTop的方法

/**
 * 头部文件的高度
 */
private int headerViewHeight;

/**
 * 隐藏headerView
 */
private  void hideHeaderView()
{

    //设置margintop为负数的总高度可以直接隐藏它
    setHeaderViewMarginTop(-headerViewHeight);
}

/**
 * 设置头部文件magrintop
 */
private void setHeaderViewMarginTop(int top)
{
    LinearLayout.LayoutParams params = (LayoutParams) heanderView.getLayoutParams();
    params.setMargins(0,top, 0, 0);
    heanderView.setLayoutParams(params);
}

于是我们就完成了隐藏headerview这个方法。

拼接后的代码。如下

/**
 *带gif下拉
 * @author  Sam
 */
public abstract class BaseGifRefresh<V extends View>  extends LinearLayout
{
    /**
     * 内容部分
     */
    private V childerView;

    /**
     * 实现内容部分
     * @param context
     * @return
     */
    protected  abstract V getConvertView(Context context);

    public BaseGifRefresh(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context);
    }

    /**
     * 刷新时候,显示的头部
     */
    private View heanderView;




    /**
     * 初始化ui
     * @param context
     */
    private void init(Context context) {
        //设置垂直布局
        setOrientation(LinearLayout.VERTICAL);
        //添加头部
        heanderView = newHeaderView(context);
        addView(heanderView);
        //添加内容部分
        childerView = newChildView(context);
        addView(childerView);

        //第二步,获取头部高度, 隐藏headerview

        //获取头部的高度
        //直接获取view的高度的话,结果为0.所以要先测量出头部的高度
        headerViewHeight = measureView(heanderView);

        //隐藏headerView
        hideHeaderView();
    }

    /**
     * 头部文件的高度
     */
    private int headerViewHeight;

    /**
     * 隐藏headerView
     */
    private  void hideHeaderView()
    {

        //设置margintop为负数的总高度可以直接隐藏它
        setHeaderViewMarginTop(-headerViewHeight);
    }

    /**
     * 设置头部文件magrintop
     */
    private void setHeaderViewMarginTop(int top)
    {
        LinearLayout.LayoutParams params = (LayoutParams) heanderView.getLayoutParams();
        params.setMargins(0,top, 0, 0);
        heanderView.setLayoutParams(params);
    }

    /**
     * 构造一个头部header
     * @param context
     * @return
     */
    private View newHeaderView(Context context)
    {
       View  heanderView = LayoutInflater.from(context).inflate(R.layout.refresh_list_header,null);
        LinearLayout.LayoutParams headerViewParams = new LinearLayout.LayoutParams( LayoutParams.MATCH_PARENT,  LayoutParams.WRAP_CONTENT);
        heanderView.setLayoutParams(headerViewParams);
        return heanderView;
    }

    /**
     * 构件内容部分
     * @param context
     * @return
     */
    private V newChildView(Context context)
    {
        LinearLayout.LayoutParams convertViewParams = new LinearLayout.LayoutParams( LayoutParams.MATCH_PARENT,  LayoutParams.MATCH_PARENT);
        convertViewParams.weight = 1;
        V  childView =   getConvertView(context);
        childView.setBackgroundColor(Color.RED);//TODO 为了看效果,测试一下
        childView.setLayoutParams(convertViewParams);
        return childView;
    }

    /**
 * 测量view的真实高度,并返回
 */
private int measureView(View view)
{
    LinearLayout.LayoutParams params = (LayoutParams) view.getLayoutParams();
    int width = LinearLayout.getChildMeasureSpec(0, 0, params.width);
    int tempHeight = params.height;
    int height = tempHeight>0? MeasureSpec.makeMeasureSpec(tempHeight, MeasureSpec.EXACTLY): MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
    view.measure(width, height);
    return view.getMeasuredHeight();
}


}
效果图:


技术分享


版权声明:本文为博主原创文章,未经博主允许不得转载。

一步步实现gif动画下拉(二)

标签:listview   下拉自动刷新   

原文地址:http://blog.csdn.net/yoyo_newbie/article/details/47168873

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!