ListView下拉时将头布局中的图片放大
动态的为listVIew添加一个头,头布局中放入一个图片,当下拉时,将图片放大:
import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import android.view.ViewGroup; import android.widget.AbsListView; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ListView; import com.my.baidulvyou.R; /** * listView下拉时,放大头布局中的图片 */ public class MyListView extends ListView { /** * listView的头布局与布局参数 */ private LinearLayout headerLayout; private AbsListView.LayoutParams layoutParams; /** * 头布局中的图片 */ private ImageView headerImg; /** * 屏幕的宽高 */ private int screenHeight; private int screenWidth; /** * 头布局的参数,因为imgView为填充父布局,所以改变该参数值就可以改变图片的高度 * 这里设置为屏幕高度的五分之二 */ private int layoutHeight; /** * 头布局是否缩放的标记 */ private boolean isScal = false; /** * 记录第一次在Y轴按下的位置 */ private float firstY; public MyListView(Context context) { this(context,null); } public MyListView(Context context, AttributeSet attrs) { this(context, attrs,0); } public MyListView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(context); } /** * 初始化控件 */ private void init(Context context) { //获得屏幕的宽高 screenHeight = getResources().getDisplayMetrics().heightPixels; screenWidth = getResources().getDisplayMetrics().widthPixels; Log.i("tag","宽高:"+screenWidth +","+screenHeight); //创建头布局 headerLayout = new LinearLayout(context); layoutHeight = screenHeight * 2 / 5;//设置头布局的高度 layoutParams = new AbsListView.LayoutParams(screenWidth, layoutHeight); //设置头布局的长宽 headerLayout.setLayoutParams(layoutParams); //设置头部View的初始化大小 headerImg = new ImageView(context); LinearLayout.LayoutParams imgParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); headerImg.setLayoutParams(imgParams); //设置图片的缩放类型为截取中间显示,这样才有明显的放大 headerImg.setScaleType(ImageView.ScaleType.CENTER_CROP); headerImg.setBackgroundResource(R.drawable.a); headerLayout.addView(headerImg);//将图片添加到布局中 //将头布局添加到listView this.addHeaderView(headerLayout); } @Override public boolean onTouchEvent(MotionEvent ev) { switch (ev.getAction()){ case MotionEvent.ACTION_DOWN: firstY = ev.getRawY();//获取初始触摸点 break; case MotionEvent.ACTION_MOVE: int moveY = (int) (ev.getRawY() - firstY); //向下滑动,并且显示的第一个item为头布局时 if(moveY>0 && getFirstVisiblePosition() == 0 && headerLayout.getTop() == 0) { Log.i("tag", "可以放大"); //layoutParams.width = screenWidth + moveY / 4;这样就只Y轴变 layoutParams.height = layoutHeight + moveY / 4; headerLayout.setLayoutParams(layoutParams); isScal = true; } break; case MotionEvent.ACTION_UP: if(getFirstVisiblePosition() == 0 && isScal){ //还原图片的宽度 layoutParams.width = screenWidth ; layoutParams.height = layoutHeight; headerLayout.setLayoutParams(layoutParams); isScal = false; // 当前正处于图片放大状态,要让ListView失去焦点,屏蔽掉单击事件,不然松手会触发listView的单击事件 this.setPressed(false);//不可按压 this.setFocusable(false); this.setFocusableInTouchMode(false); // 当前正处于下拉或释放状态,通过返回true屏蔽掉ListView的滚动事件 return true; } break; default: break; } return super.onTouchEvent(ev); } }
效果图: 左边为原图,右边为下拉时的图