用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
- 用ListView实现下拉图片放大的效果
- 下拉放大图片的效果
- 经验之谈—实现图片下拉放大的效果
- iOS下拉tableView实现上面的图片放大效果
- 下拉UITableview实现图片放大效果
- Android好用的下拉图片放大效果
- ListView拓展-下拉刷新,顶部图片放大效果
- tableview下拉的时候,头部图片放大效果view下拉的时候,头部图片放大效果
- ios下拉放大图片效果
- iOS_下拉图片放大效果
- 图片下拉缩小放大效果
- 快速实现 ListView下拉,图片放大刷新操作
- 快速实现 ListView下拉,图片放大刷新操作
- 快速实现 ListView下拉,图片放大刷新操作
- 快速实现 ListView下拉,图片放大刷新操作
- 安卓学习笔记---实现下拉图片放大,松开又自动回去效果 (ListView与ScrollView)
- 用xib画的表头实现下拉放大图片
- swift实现图片下拉放大,导航栏渐变效果
- 使用恶意USB设备解锁任意锁屏状态Windows、Mac(含工具、视频演示)
- Qt播放音视频文件
- android项目源码大全
- Hadoop下将大量小文件生成一个sequenceFile文件
- 建议124:考虑在命名空间中使用复数
- 用ListView实现下拉图片放大的效果
- FreeCMS视频教程 自定义表单
- 二叉树的遍历---栈实现
- 三种纯css实现三角形的方法
- 建议125:避免用FCL的类型名称命名自己的类型
- 项目经验分享——Java常用工具类集合
- Android中SwipeBack右滑返回(手势返回)的实现(带源码)
- sed 处理替换字符中的特殊字符
- 支付宝退款接口(即时到帐有密退款)