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);
    }

}

 效果图:  左边为原图,右边为下拉时的图

 

posted @ 2016-10-17 14:47  ts-android  阅读(673)  评论(0编辑  收藏  举报