1.做过一个需求,listview的header里面加上一个banner,使得滑动listView的时候,轮播图也能自然的往上顶。
2.需求很简单,其实就是
mPullableListView.addHeaderView(View);view你可以用View.inflate(),这个方法加载一个布局进去,这个布局中实现banner就可以了
3.以上其实已经达到了这个要求,但是bannner会要求,可以手动滑动,但是会发现,手动向左右滑动的时候,并不好操作,有时候滑不动
4.以上是什么原因呢,因为listView本身是有滑动属性的,这时候banner就是子控件了,bannner是用viewpager来实现的,这时候会发现两个控件都有滑动属性
但是viewpager作为子控件,就会受到干扰,我们只需要稍微重写一下viewpager就能结局这个问题了
5.代码
import android.annotation.SuppressLint; import android.content.Context; import android.graphics.PointF; import android.support.v4.view.ViewPager; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; /** * 自定义viewpager * * @author Administrator * */ @SuppressLint("DrawAllocation") public class MyViewPager extends ViewPager { /** * 触摸时按下的点 */ PointF downP = new PointF(); /** * 触摸时当前的点 */ PointF curP = new PointF(); // 滑动距离及坐标 private float xDistance, yDistance, xLast, yLast; public MyViewPager(Context context) { super(context); } public MyViewPager(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean dispatchTouchEvent(MotionEvent ev) { boolean boo = super.dispatchTouchEvent(ev); // switch (ev.getAction()) { // case MotionEvent.ACTION_DOWN: // xDistance = yDistance = 0f; // xLast = ev.getX(); // yLast = ev.getY(); // break; // case MotionEvent.ACTION_MOVE: // final float curX = ev.getX(); // final float curY = ev.getY(); // // xDistance += Math.abs(curX - xLast); // yDistance += Math.abs(curY - yLast); // xLast = curX; // yLast = curY; // if (xDistance > yDistance) { // getParent().requestDisallowInterceptTouchEvent(true);// 这句话的作用 // // 告诉父view,我的单击事件我自行处理,不要阻碍我。 // } else { // // boo = false; // 表示向下传递事件 // } // } curP.x = ev.getX(); curP.y = ev.getY(); if (ev.getAction() == MotionEvent.ACTION_DOWN) { // 记录按下时候的坐标 // 切记不可用 downP = curP ,这样在改变curP的时候,downP也会改变 downP.x = ev.getX(); downP.y = ev.getY(); // 此句代码是为了通知他的父ViewPager现在进行的是本控件的操作,不要对我的操作进行干扰 getParent().requestDisallowInterceptTouchEvent(true); } if (ev.getAction() == MotionEvent.ACTION_MOVE) { // 此句代码是为了通知他的父ViewPager现在进行的是本控件的操作,不要对我的操作进行干扰 if (Math.abs(downP.x - curP.x)< Math.abs(downP.y - curP.y)) { getParent().requestDisallowInterceptTouchEvent(false); }else{ getParent().requestDisallowInterceptTouchEvent(true); } } return boo; } @Override public void setOnPageChangeListener(OnPageChangeListener listener) { super.setOnPageChangeListener(listener); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int height = 0; for (int i = 0; i < getChildCount(); i++) { View child = getChildAt(i); child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); int h = child.getMeasuredHeight(); if (h > height) height = h; } heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY); super.onMeasure(widthMeasureSpec, heightMeasureSpec); }
6.再次滑动viewpager,就会发现左右滑动很流畅,上下滑动就是listView的滑动了