ListView头图片下拉放大效果

效果图;

下拉前

160117_u58P_1428946.jpg

下拉之后

160118_sUW9_1428946.jpg

布局文件

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >
    <com.xaozu.count.app.view.ImgListView
        android:id="@+id/xListView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:cacheColorHint="#00000000"
        android:dividerHeight="0dp"
        android:divider="#ffffff"
        android:fadingEdgeLength="0dp"
        android:padding="0dp"
        android:layout_margin="0dp"
        />
</RelativeLayout>

activity文件

public class ImagList extends Activity {
    public static ImageView imageView;
    public static int displayWidth;
    private Bitmap bmp;
    /** 用于记录拖拉图片移动的坐标位置 */
    public static  Matrix matrix = new Matrix();
    /** 用于记录图片要进行拖拉时候的坐标位置 */
    public static  Matrix currentMatrix = new Matrix();
    public static  Matrix defaultMatrix = new Matrix();
    public static  float imgHeight,imgWidth;
    /** 记录是拖拉照片模式还是放大缩小照片模式 */
    public static int mode = 0;// 初始状态
    /** 拖拉照片模式 */
    public static final int MODE_DRAG = 1;

    /** 用于记录开始时候的坐标位置 */
    public static PointF startPoint = new PointF();
    private ImgListView sListView;
    private List<News> sNewsList;
    private NewsAdapter sNewsAdapter;
    private Context sContext;
    private View headerView;
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.test);

        //取得屏幕分辨率大小
        DisplayMetrics dm=new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dm);
        displayWidth=dm.widthPixels;
        sContext = ImagList.this;
        sNewsList = new ArrayList<News>();
        geneItems();
        sListView = (ImgListView) findViewById(R.id.xListView);
//		sListView.setPullLoadEnable(true);

        bmp= BitmapFactory.decodeResource(getResources(), R.drawable.top_img);

        headerView=getLayoutInflater().inflate(R.layout.top_img, null);
        imageView = (ImageView) headerView.findViewById(R.id.imageView);
        initView();
        sListView.addHeaderView(headerView);

        sNewsAdapter = new NewsAdapter();
        sListView.setAdapter(sNewsAdapter);
//        sListView.setOnTouchListener(new TouchListener());
    }

    /**
     * 初始化图片
     */
    private void initView(){
        float scale = (float)displayWidth/(float)bmp.getWidth();//1080/1800
        matrix.postScale(scale, scale,0,0);
        imageView.setImageMatrix(matrix);
        defaultMatrix.set(imageView.getImageMatrix());
        imgHeight=scale*bmp.getHeight();
        imgWidth=scale*bmp.getWidth();
        ListView.LayoutParams relativeLayout=new ListView.LayoutParams((int)imgWidth,(int)imgHeight);
        imageView.setLayoutParams(relativeLayout);
    }

    protected void onDestroy() {
        super.onDestroy();
        bmp.recycle();
        matrix=new Matrix();
    }


    private class NewsAdapter extends BaseAdapter {

        private LayoutInflater mInflater;

        public NewsAdapter() {
            mInflater = LayoutInflater.from(sContext);
        }

        @Override
        public int getCount() {
            return sNewsList.size();
        }

        @Override
        public Object getItem(int position) {
            return sNewsList.get(position);
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            Holder h = null;
            if (convertView == null) {
                h = new Holder();
                convertView = mInflater.inflate(R.layout.list_item,
                        null);
                h.tv = (TextView) convertView.findViewById(R.id.tv_time);
                h.iv = (TextView) convertView.findViewById(R.id.iv_icon);
                h.content = (TextView) convertView.findViewById(R.id.tv_content);
                convertView.setTag(h);
            } else {
                h = (Holder) convertView.getTag();
            }
            News news = sNewsList.get(position);
            int time = news.getTime();
            int icon = news.getIcon();
            int img = news.getPic();

            h.tv.setText(sContext.getString(time));
//			h.iv.setText(position+"");
//			h.content.setBackgroundResource(img);

            return convertView;
        }

        private class Holder {
            public TextView tv;
            public TextView iv;
            public TextView content;
        }
    }
    private void geneItems() {
        for (int i = 0; i != 5; ++i) {
            //items.add("refresh cnt " + (++start));
//            ++start;
            News news = new News();
            news.setTime(R.string.str_time);
            news.setIcon(R.drawable.psd);
//			news.setPic(R.drawable.hn_sms_in_bg);
            sNewsList.add(news);
        }
    }

listview文件

public class ImgListView extends ListView {

    public ImgListView(Context context) {
        super(context);
    }
    public ImgListView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public ImgListView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }


    public void setAdapter(ListAdapter adapter) {
        super.setAdapter(adapter);
    }

    public void addHeaderView(View v) {
        super.addHeaderView(v);
    }

    /**
     * 向下滑动让图片变大
     * @param event
     * @return
     */
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction() & MotionEvent.ACTION_MASK) {
            // 手指压下屏幕
            case MotionEvent.ACTION_DOWN:
                ImagList.mode = ImagList.MODE_DRAG;
                // 记录ImageView当前的移动位置
                ImagList.currentMatrix.set(ImagList.imageView.getImageMatrix());
                ImagList.startPoint.set(event.getX(), event.getY());
                break;
            // 手指在屏幕上移动,改事件会被不断触发
            case MotionEvent.ACTION_MOVE:
                // 拖拉图片
                if (ImagList.mode == ImagList.MODE_DRAG) {
                    float dx = event.getX() - ImagList.startPoint.x; // 得到x轴的移动距离
                    float dy = event.getY() - ImagList.startPoint.y; // 得到x轴的移动距离
                    // 在没有移动之前的位置上进行移动
                    ImagList.matrix.set(ImagList.currentMatrix);
                    float scale = (dy+ImagList.imgHeight) / ImagList.imgHeight;// 得到缩放倍数
                    if(dy>0){
                        ListView.LayoutParams relativeLayout=new ListView.LayoutParams((int)(scale*ImagList.imgWidth),(int)(scale*ImagList.imgHeight));
                        ImagList.imageView.setLayoutParams(relativeLayout);
                        ImagList.matrix.postScale(scale, scale,ImagList.imgWidth/2,0);
                    }
                }
                break;
            // 手指离开屏幕
            case MotionEvent.ACTION_UP:
                // 当触点离开屏幕,图片还原
                ListView.LayoutParams relativeLayout=new ListView.LayoutParams((int)ImagList.imgWidth,(int)ImagList.imgHeight);
                ImagList.imageView.setLayoutParams(relativeLayout);
                ImagList.matrix.set(ImagList.defaultMatrix);
            case MotionEvent.ACTION_POINTER_UP:
                ImagList.mode = 0;
                break;
        }
        ImagList.imageView.setImageMatrix(ImagList.matrix);

        return super.onTouchEvent(event);
    }
}


偷懒用了 public static


源码地址:

http://pan.baidu.com/s/1ntocyrZ


转载于:https://my.oschina.net/zhulunjun/blog/209683

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值