看了QQ动脑学院关于Android课程后编写的,下面直接上干货:
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.Transformation;
import android.widget.ImageView;
import android.widget.ListView;
/**
* 仿QQ空间头部下拉 图片放大
* Created by Mr.ZAN on 2017/7/28.
*/
public class ScrollZoomListView extends ListView {
private ImageView mImageView;
private int mImageViewHeight;//初始高度
public ScrollZoomListView(Context context, AttributeSet attrs) {
super(context, attrs);
mImageViewHeight=context.getResources().getDimensionPixelSize(R.dimen.defult_image_height_size);
}
public void setZoomImageView(ImageView iv){
mImageView=iv;
}
@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进行放大效果----修改image 的高度
mImageView.getLayoutParams().height = mImageView.getHeight() - deltaY;
mImageView.requestLayout();
} else {//上拉过度
mImageView.getLayoutParams().height = mImageView.getHeight() - deltaY;
mImageView.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) mImageView.getParent();
//listView 会滑出去的高度(负数)
int deltaY=header.getTop();
//只有当image被放大才执行缩小
if (mImageView.getHeight()>mImageViewHeight) {
mImageView.getLayoutParams().height = mImageView.getHeight() + deltaY;
//由于滑出去一段,所以要让header父容器重新摆放top为0
header.layout(header.getLeft(),0,header.getRight(),header.getHeight());
mImageView.requestLayout();
}
super.onScrollChanged(l, t, oldl, oldt);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
int action=ev.getAction();
//当手指抬起 并且图片有放大时执行回弹效果
if (action==MotionEvent.ACTION_UP && mImageView.getHeight() > mImageViewHeight) {
//渐渐恢复原来的高度----渐变动画:height
ResetAnmiation resetAnmiation = new ResetAnmiation();
resetAnmiation.setDuration(500);
mImageView.startAnimation(resetAnmiation);
int i = mImageView.getHeight() - mImageViewHeight;
Log.d("++ Mr ZAN ++", "onTouchEvent: " + i);
}
return super.onTouchEvent(ev);
}
public class ResetAnmiation extends Animation{
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
//动画执行百分比 ,interpolatedTime: 0f~1f
/**比例关系
* 0 ~ 1
* height~ 初始高度
* 现在的高度-(变化的高度差) * interpolatedTime
*/
mImageView.getLayoutParams().height = (int) ((mImageView.getHeight() - (mImageView.getHeight()-mImageViewHeight))*interpolatedTime);
mImageView.requestLayout();
super.applyTransformation(interpolatedTime, t);
}
}
}
用法:
public class MainActivity extends AppCompatActivity { private List<String> mList =new ArrayList<>(); private ScrollZoomListView mListView; @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mListView = (ScrollZoomListView) findViewById(R.id.listview); View view1=LayoutInflater.from(this).inflate(R.layout.header,null); ImageView imageView =view1.findViewById(R.id.iv_header); ImageView head =view1.findViewById(R.id.iv_icon); mListView.addHeaderView(view1); mListView.setZoomImageView(imageView); initdata(); ListAdapter adapter =new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,mList); mListView.setAdapter(adapter); } public void initdata(){ for (int i = 0; i < 10; i++) { mList.add("条目 "+i); } } }