近期开发时,遇到一个头图下拉,从中间放大的实现,弃掉PullToRefresh,采用ScrollView嵌套GridView的布局。
但是踩到了好多坑,重写GridView中的OnMeasure方法就不用说了,关键是我需要监听滚到顶部以及底部,下拉放大头图进行数据刷新,拉上进行分页加载。
从整体来说,采用这种布局会出现,进入此界面会自动滚到GridView的位置,我说这也太智能了吧~但不是我要的效果,还是好好老实给我现实吧!我才用的方法是
gridViewForScrollView.setFocusable(false);加上这句代码,可避免上述情况发生,当然网上还有其他办法,在这就不一一列出了。
监听ScrollView的触摸事件:
scrollView.setOnTouchListener(new View.OnTouchListener() { private int lastY = 0; @Override public boolean onTouch(View v, MotionEvent event) { ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) img.getLayoutParams(); switch (event.getAction()) { case MotionEvent.ACTION_UP: //手指离开后恢复图片 if(mScaling==true){ final float w = img.getLayoutParams().width;// 图片当前宽度 if(metric.widthPixels!=w) { channeldata.clear(); initData(); } } mScaling = false; replyImage(); lastY = scrollView.getScrollY(); if(lastY == (linearLayout.getHeight() - scrollView.getHeight())){ //ToastUtils.showAtCenter(getApplicationContext(),"到达底部,加载更多数据",Toast.LENGTH_SHORT); loadingMore.setVisibility(View.VISIBLE); if(!isLoadMore==true) { initData(); } } break; case MotionEvent.ACTION_MOVE: if (!mScaling) { if (scrollView.getScrollY() == 0) { whiteContainer.setVisibility(View.VISIBLE); mFirstPosition = event.getY();// 滚动到顶部时记录位置,否则正常返回 } else { break; } } int distance = (int) ((event.getY() - mFirstPosition) * 0.6); // 滚动距离乘以一个系数 if (distance < 0) { // 当前位置比记录位置要小,正常返回 break; } // 处理放大 mScaling = true; lp.width = metric.widthPixels + distance; lp.height = (metric.widthPixels + distance) * 4 / 10; lp.leftMargin = -1*distance/2; Logger.d("wepp",lp.leftMargin+""); img.setLayoutParams(lp); return true; // 返回true表示已经完成触摸事件,不再处理 } return false; } });里面的代码中也有一部分图片处理方法。
先这样,有不理解的可以私信我~