用ListView实现下拉图片放大的效果

来源:互联网 发布:大数据产业创新研究院 编辑:程序博客网 时间:2024/06/04 21:15

跟上一篇的ScrollView实现的效果是一样的,方法是重写ListView:

package com.example.lenovo.listview.view;import android.content.Context;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;import android.view.animation.Animation;import android.view.animation.Transformation;import android.widget.AbsListView;import android.widget.AbsListView.OnScrollListener;import android.widget.ImageView;import android.widget.ListView;import com.example.lenovo.listview.R;public class DampListView extends ListView implements OnScrollListener {    public final static double ZOOM_VALUE = 5;    private ImageView mImageView;    private int mDrawableMaxHeight = -1;    private int mImageViewHeight = -1;    private int mDefaultImageViewHeight = 0;    private double mZoomRatio;    private interface OnOverScrollByListener {         boolean overScrollBy(int deltaX, int deltaY, int scrollX,int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent);    }    private interface OnTouchEventListener {         void onTouchEvent(MotionEvent ev);    }    public DampListView(Context context, AttributeSet attrs, int defStyle) {        super(context, attrs, defStyle);        init(context);    }    public DampListView(Context context, AttributeSet attrs) {        super(context, attrs);        init(context);    }    public DampListView(Context context) {        super(context);        init(context);    }    public void init(Context context) {        mDefaultImageViewHeight = context.getResources().getDimensionPixelSize(R.dimen.size_default_height);    }    @Override    protected void onLayout(boolean changed, int l, int t, int r, int b) {        super.onLayout(changed, l, t, r, b);        initViewsBounds(mZoomRatio);    }    @Override    public void onScrollStateChanged(AbsListView view, int scrollState) {    }    @Override    protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) {        boolean isCollapseAnimation = false;        isCollapseAnimation = scrollByListener.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX,                maxOverScrollY, isTouchEvent) || isCollapseAnimation;        return isCollapseAnimation ? true : super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, maxOverScrollY, isTouchEvent);    }    @Override    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {    }    @Override    protected void onScrollChanged(int l, int t, int oldl, int oldt) {        super.onScrollChanged(l, t, oldl, oldt);        View firstView = (View) mImageView.getParent();        if (firstView.getTop() < getPaddingTop() && mImageView.getHeight() > mImageViewHeight) {            mImageView.getLayoutParams().height = Math.max(mImageView.getHeight() - (getPaddingTop() - firstView.getTop()), mImageViewHeight);            firstView.layout(firstView.getLeft(), 0, firstView.getRight(), firstView.getHeight());            mImageView.requestLayout();        }    }    @Override    public boolean onTouchEvent(MotionEvent ev) {        touchListener.onTouchEvent(ev);        return super.onTouchEvent(ev);    }    public void setParallaxImageView(ImageView iv) {        mImageView = iv;        mImageView.setScaleType(ImageView.ScaleType.CENTER_CROP);    }    private void initViewsBounds(double zoomRatio) {        if (mImageViewHeight == -1) {            mImageViewHeight = mImageView.getHeight();            if (mImageViewHeight <= 0) {                mImageViewHeight = mDefaultImageViewHeight;            }            double ratio = ((double) mImageView.getDrawable().getIntrinsicWidth()) / ((double) mImageView.getWidth());            mDrawableMaxHeight = (int) ((mImageView.getDrawable().getIntrinsicHeight() / ratio) * (zoomRatio > 1 ? zoomRatio : 1));        }    }    public void setZoomRatio(double zoomRatio) {        mZoomRatio = zoomRatio;    }    private OnOverScrollByListener scrollByListener = new OnOverScrollByListener() {        @Override        public boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY,                                    int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) {            if (mImageView.getHeight() <= mDrawableMaxHeight && isTouchEvent) {                if (deltaY < 0) {                    if (mImageView.getHeight() - deltaY / 2 >= mImageViewHeight) {                        mImageView.getLayoutParams().height = mImageView.getHeight() - deltaY / 2 < mDrawableMaxHeight ?                                mImageView.getHeight() - deltaY / 2 : mDrawableMaxHeight;                        mImageView.requestLayout();                    }                } else {                    if (mImageView.getHeight() > mImageViewHeight) {                        mImageView.getLayoutParams().height = mImageView.getHeight() - deltaY > mImageViewHeight ?                                mImageView.getHeight() - deltaY : mImageViewHeight;                        mImageView.requestLayout();                        return true;                    }                }            }            return false;        }    };    private OnTouchEventListener touchListener = new OnTouchEventListener() {        @Override        public void onTouchEvent(MotionEvent ev) {            if (ev.getAction() == MotionEvent.ACTION_UP) {                if (mImageViewHeight - 1 < mImageView.getHeight()) {                    ResetAnimimation animation = new ResetAnimimation(mImageView, mImageViewHeight);                    animation.setDuration(300);                    mImageView.startAnimation(animation);                }            }        }    };    public class ResetAnimimation extends Animation {        int targetHeight;        int originalHeight;        int extraHeight;        View mView;        protected ResetAnimimation(View view, int targetHeight) {            this.mView = view;            this.targetHeight = targetHeight;            originalHeight = view.getHeight();            extraHeight = this.targetHeight - originalHeight;        }        @Override        protected void applyTransformation(float interpolatedTime, Transformation t) {            int newHeight;            newHeight = (int) (targetHeight - extraHeight * (1 - interpolatedTime));            mView.getLayoutParams().height = newHeight;            mView.requestLayout();        }    }}

代码中使用:

package com.example.lenovo.listview.activity;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.widget.AdapterView;import android.widget.ArrayAdapter;import android.widget.ImageView;import android.widget.Toast;import com.example.lenovo.listview.R;import com.example.lenovo.listview.view.DampListView;import java.util.ArrayList;import java.util.List;public class MainActivity extends Activity implements AdapterView.OnItemClickListener,View.OnClickListener{    private DampListView list_view;    private List<String> mList = new ArrayList<>();    private ImageView imageView;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        list_view = (DampListView) findViewById(R.id.list_view);        initData();        View headerview = View.inflate(this,R.layout.header_image,null);        imageView = (ImageView) headerview.findViewById(R.id.image_view);        list_view.setZoomRatio(DampListView.ZOOM_VALUE);//设置阻尼限制的大小        list_view.setParallaxImageView(imageView);        list_view.addHeaderView(headerview);        list_view.setAdapter(new ArrayAdapter<>(this,android.R.layout.simple_list_item_1,mList));        list_view.setOnItemClickListener(this);        imageView.setOnClickListener(this);    }    private void initData() {        for(int i = 0;i<30;i++){            mList.add("数据"+i);        }    }    @Override    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {        Toast.makeText(this,"点击的位置:"+(position-list_view.getHeaderViewsCount()),Toast.LENGTH_SHORT).show();    }    @Override    public void onClick(View v) {        Toast.makeText(this,"点击了图片",Toast.LENGTH_SHORT).show();    }}

核心代码就这几句:

View headerview = View.inflate(this,R.layout.header_image,null);imageView = (ImageView) headerview.findViewById(R.id.image_view);list_view.setZoomRatio(DampListView.ZOOM_VALUE);//设置阻尼限制的大小list_view.setParallaxImageView(imageView);list_view.addHeaderView(headerview);
0 0
原创粉丝点击