自定义ListView下拉图片变大

这两天在某某平台看了这个效果,记录一下顺便问问大家有没有好思路

先看效果图吧

自定义ListView下拉图片变大



































废话不多说上代码

主页面只有一个listview 没什么好说的

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.wl.myapplication.MainActivity">

    <com.example.wl.myapplication.CustomCListview
        android:id="@+id/ls"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</RelativeLayout>
public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        CustomCListview lstview = (CustomCListview) findViewById(R.id.ls);
        View inflate = View.inflate(this, R.layout.item_listview, null);
        ImageView viewById = (ImageView) inflate.findViewById(R.id.img);
        //在自定义view中添加一个自定义方法把需要的Imageview传过去
        lstview.setHeader(viewById);
        lstview.addHeaderView(inflate);
        lstview.setAdapter(new ArrayAdapter<String>(this, R.layout.support_simple_spinner_dropdown_item, new String[]{"今天不想上班","今天不想上班","今天不想上班","今天不想上班","今天不想上班","今天不想上班","今天不想上班","今天不想上班","今天不想上班","今天不想上班","今天不想上班","今天不想上班","今天不想上班","今天不想上班","今天不想上班","今天不想上班","今天不想上班","今天不想上班","今天不想上班","今天不想上班"}));
    }
}
 接下来就是自定义listview了

/**
 * Created by bai on 2018/2/1.
 */

public class CustomCListview extends ListView {
    private ImageView imageView;
    private int height;
    private boolean aBoolean;
    private boolean aBoolean1;

    public CustomCListview(Context context, AttributeSet attrs) {
        super(context, attrs);
        height = getContext().getResources().getDimensionPixelSize(R.dimen.size);
    }

    //滑动过度的回调
    @Override
    protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) {
        /***
         * deltaY为正为上拉
         * deltaY为负为下拉
         */
        if (deltaY < 0) {  //下拉过度时
            imageView.getLayoutParams().height = imageView.getHeight() - deltaY;
            imageView.requestLayout();
        }
        //注释打开后上拉过度有点问题
//        else {
//            imageView.getLayoutParams().height = imageView.getHeight() - deltaY;
//            Log.e("拉动下", "deltaY" + imageView.getHeight());
//            imageView.requestLayout();
//        }
        return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, maxOverScrollY, isTouchEvent);
    }

    @Override
    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
        View header = (View) imageView.getParent();
        int deltaY = header.getTop();
        if (deltaY < 0 && imageView.getHeight() > height) {
            imageView.getLayoutParams().height = imageView.getHeight() + deltaY;
            //往上推时父容器的top重新设置为0
            header.layout(header.getLeft(), 0, header.getRight(), header.getHeight());
            imageView.requestLayout();
        }
        super.onScrollChanged(l, t, oldl, oldt);
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        int action = ev.getAction();
        if (action == MotionEvent.ACTION_UP) {
            //松开手还原listview
            ResetAnimation resetAnimation = new ResetAnimation(imageView, height);
            resetAnimation.setDuration(300);
            //设置动画
            imageView.setAnimation(resetAnimation);

        }
        return super.onTouchEvent(ev);
    }

    public void setHeader(ImageView imageView) {
        this.imageView = imageView;
    }

    public class ResetAnimation extends Animation {
        //原始高度
        private final int targetHeight;
        //现在高度
        private int currentHeight;
        //高度差
        private int extraHeight;

        public ResetAnimation(ImageView iv, int Height) {
            this.targetHeight = Height;
            currentHeight = iv.getHeight();
            extraHeight = currentHeight - targetHeight;
            iv.requestLayout();//这个要添加上去不然下拉后松手没有动画
        }

        @Override
        protected void applyTransformation(float interpolatedTime, Transformation t) {
            //监听动画执行的百分比        interpolatedTime  执行的百分比
            /***
             * 现在高度到初始高度
             * 现在高度-高度差*interpolatedTime
             */
            imageView.getLayoutParams().height = (int) (currentHeight - extraHeight * interpolatedTime);
            imageView.requestLayout();
            super.applyTransformation(interpolatedTime, t);
        }
    }
}

期间遇到一些问题如果有大神来过,帮帮忙解决一下。

protected boolean overScrollBy
这个方法中else中如果注释打开,向上滑动到imageview高度为0的时候会突然又蹦出来了 

还有就是在动画的构造方法中
iv.requestLayout();
如果不添加这句话,动画有时候不执行
protected void applyTransformation

这个方法 ?

大神求解答