
Paste_Image.png
圖片位于listview的頂部,
上代碼--重寫listview
public class ParallaxListView extends ListView {
private static final String TAG = "ParallaxListView";
private int maxHeight;//ImageVIew的最大高度
public ParallaxListView(Context context) {
this(context, null);
}
public ParallaxListView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public ParallaxListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
ImageView imageView;
int originalHeight;//最初的高度,就是那個(gè)120dp
public void setImageView(ImageView imageView){
this.imageView = imageView;
//獲取圖片的本身高度
maxHeight = imageView.getDrawable().getIntrinsicHeight()*2;
originalHeight = getResources().getDimensionPixelSize(R.dimen.img_height);
}
/**
* 該方法就是當(dāng)listview滑動到頭的時(shí)候執(zhí)行,可以獲取到繼續(xù)滑動的距離
* @param deltaY 繼續(xù)滑動的距離 ,負(fù)值是頂部到頭,正是底部
* @param scrollY 就是scrollTo方法產(chǎn)生的距離
* @param scrollRangeY 一般沒有用,就是0
* @param maxOverScrollY 到頭后,最大還可以繼續(xù)滾動的距離
* @param isTouchEvent 是否是手指拖動到頭的,true:是 false:表示是靠慣性滑動到頭(fling)
* @return
*/
@Override
protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) {
if(deltaY<0 && isTouchEvent){
//根據(jù)deltaY讓IMageVIew的高度增高
int newHeight = imageView.getHeight() - deltaY/3;
//對newHeight進(jìn)行限制
newHeight = Math.min(newHeight, maxHeight);
ViewGroup.LayoutParams params = imageView.getLayoutParams();
params.height = newHeight;
imageView.setLayoutParams(params);
}
return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, maxOverScrollY, isTouchEvent);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
if(ev.getAction()==MotionEvent.ACTION_UP){
//讓ImageView從當(dāng)前高度恢復(fù)到最初的高度
ValueAnimator animator = ValueAnimator.ofInt(imageView.getHeight(), originalHeight);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
int animatedValue = (int) animation.getAnimatedValue();
//更新高度
ViewGroup.LayoutParams params = imageView.getLayoutParams();
params.height = animatedValue;
imageView.setLayoutParams(params);
}
});
animator.setInterpolator(new OvershootInterpolator());
animator.setDuration(500).start();
}
return super.onTouchEvent(ev);
}
}
布局中使用
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
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.kailing.parallax.MainActivity">
<com.kailing.parallax.ParallaxListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
mainactivity
public class MainActivity extends AppCompatActivity {
@BindView(R.id.listview)
ParallaxListView listview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
//去掉listview到頭的邊緣陰影
listview.setOverScrollMode(View.OVER_SCROLL_NEVER);
View headerView = View.inflate(this,R.layout.header,null);
ImageView imageView = (ImageView) headerView.findViewById(R.id.iv_image);
listview.setImageView(imageView);
listview.addHeaderView(headerView);
listview.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,Constant.NAMES));
}
}