自定义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
这个方法 ?
大神求解答