168.n1-事件处理

ViewPager和Indicator绑定的时候,滑动监听要设置给Indicator

详情页,tab下面的详情页和子页面banner是相互抵触的,banner需要处理滑动,父页面在位置0处需要拉出菜单栏,这样产生了矛盾,因此需要进行详细的处理,在banner和其父亲的非banner处分别处理

NewsMenuDetailPager.java详情页滑动的处理

 

package com.ldw.news.base.menudetails;

import java.util.ArrayList;

import android.app.Activity;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.View;
import android.view.ViewGroup;

import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu;
import com.ldw.news.MainActivity;
import com.ldw.news.R;
import com.ldw.news.base.BaseMenuDetailPager;
import com.ldw.news.base.TabDetailPager;
import com.ldw.news.domain.NewsData.NewsTabData;
import com.lidroid.xutils.ViewUtils;
import com.lidroid.xutils.view.annotation.event.OnClick;
import com.viewpagerindicator.TabPageIndicator;

/*
 * 菜单详情页-新闻
*/ 
public class NewsMenuDetailPager extends BaseMenuDetailPager implements OnPageChangeListener{

	private ViewPager vp_menu_detail;
	private ArrayList<TabDetailPager> mPagerList;
	private ArrayList<NewsTabData> mNewsTabData;//页签的网络数据
	private TabPageIndicator mIndicator;
	
	public NewsMenuDetailPager(Activity activity, ArrayList<NewsTabData> children) {
		super(activity);
		//接受传过来的children数据,有11个
		mNewsTabData = children;
	}

	@Override
	public View initView() {
		View view = View.inflate(mActivity, R.layout.news_menu_details, null);

		vp_menu_detail = (ViewPager) view.findViewById(R.id.vp_menu_detail);
		mIndicator = (TabPageIndicator) view.findViewById(R.id.indicator);
		
		//xUtils使用注解
		ViewUtils.inject(this, view);
		//不是对vp_menu_detail监听而是对mIndicator监听,viewPager。
		//vp_menu_detail.setOnPageChangeListener(this);
		//ViewPager和Indicator绑定的时候,滑动监听要设置给Indicator
		mIndicator.setOnPageChangeListener(this);
        
		return view;
	}
	
	@Override
	public void initData(){
		//数据是通过从服务器中获取大数据来初始化
		mPagerList = new ArrayList<TabDetailPager>();
		for(int i = 0; i < mNewsTabData.size(); i++){
			TabDetailPager tabDetailPager = new TabDetailPager(mActivity, mNewsTabData.get(i));
			//添加到链表
			mPagerList.add(tabDetailPager);
		}
		vp_menu_detail.setAdapter(new MenuDetailAdapter());
		//在vp_menu_detail设置完成adapter以后才能调用,viewpager和indicator关联
		mIndicator.setViewPager(vp_menu_detail);
		
	}
	
	
	//监听右边的箭头,切换内容,内容+1
	@OnClick(R.id.btn_next)
	public void nextPage(View view){
		int currentItem = vp_menu_detail.getCurrentItem();
		vp_menu_detail.setCurrentItem(++ currentItem);
	}
	
	
	class MenuDetailAdapter extends PagerAdapter{
		//使用开源的框架PageIndicator初始化标题,重写这个方法设置tab
		@Override
        public CharSequence getPageTitle(int position) {
            return mNewsTabData.get(position).title;
        }

		@Override
		public int getCount() {
			// TODO Auto-generated method stub
			return mPagerList.size();
		}

		@Override
		public boolean isViewFromObject(View view, Object object) {
			// TODO Auto-generated method stub
			return view == object;
		}
		
		@Override
		public Object instantiateItem(ViewGroup container, int position) {
			//初始化页面
			TabDetailPager tabDetailPager = new TabDetailPager(mActivity, mNewsTabData.get(position));
			//添加view
			container.addView(tabDetailPager.mRebootView);
			//初始化数据
			tabDetailPager.initData();
			//显示界面
			return tabDetailPager.mRebootView;
		}

		@Override
		public void destroyItem(ViewGroup container, int position, Object object) {
			container.removeView((View) object);
		}
	}


	@Override
	public void onPageScrolled(int position, float positionOffset,
			int positionOffsetPixels) {
		// TODO Auto-generated method stub
		
	}

	//页面被选中,这个是对触摸事件的处理,监听触摸事件,只有在滑倒了最左边才会拉出菜单
	@Override
	public void onPageSelected(int position) {
		//获取到左侧的菜单栏
		MainActivity mainUi = (MainActivity) mActivity;
		SlidingMenu slidingMenu = mainUi.getSlidingMenu();
		if(position == 0){
			//当前位置为0的时候可以全屏触摸,可以拉出来菜单栏
			slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
		}else{
			//不为0的时候不让触摸
			slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_NONE);
		}
		
	}

	@Override
	public void onPageScrollStateChanged(int state) {
		// TODO Auto-generated method stub
		
	}

}

list_header_topnews.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    
	<!-- banner图,继承处理以后的ViewPager,防止父类拦截 -->
    <com.ldw.news.view.TopNewsViewPager
        android:id="@+id/vp_news"
        android:layout_width="match_parent"
    	android:layout_height="200dp"
        />
    <!-- 下方的页签和文本 -->
    	<RelativeLayout 
    	    android:layout_width="match_parent"
    		android:layout_height="wrap_content"
    		android:layout_alignParentBottom="true"
    		android:padding="5dp"
    		android:background="#a000"
    	    >
    	   <TextView 
    	       android:id="@+id/tv_title"
    	       android:layout_width="wrap_content"
    			android:layout_height="wrap_content"
    			android:textColor="#ffffff"
    			android:textSize="16sp"
    			android:text=""
    	       />
    	   <!-- 使用viewpagerindicator实现小圆点 -->
    	   <com.viewpagerindicator.CirclePageIndicator
		        android:id="@+id/indicator"
		        android:padding="10dip"
		        android:layout_height="wrap_content"
		        android:layout_alignParentRight="true"
		        android:layout_width="wrap_content"
		        app:radius="4dp"
		        app:fillColor="#FF0000"
		        app:pageColor="@android:color/darker_gray"
		        app:strokeWidth="2dp"
		        />
    	</RelativeLayout>
</RelativeLayout>

TopNewsViewPager.java 详情页的banner的处理,需要出来几种情形的滑动

package com.ldw.news.view;

import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;

/*
 * banner图中不让父亲拦截ViewPager
 */
public class TopNewsViewPager extends ViewPager {

	int startX;
	int startY;

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

	public TopNewsViewPager(Context context) {
		super(context);
	}

	/**
	 * 事件分发, 请求父控件及祖宗控件是否拦截事件 
	 * 1. 右划, 而且是第一个页面, 需要父控件拦截 ,拉出菜单栏
	 * 2. 左划, 而且是最后一个页面, 需要父控件拦截,这样跳到父亲的下一页
	 * 3. 上下滑动, 需要父控件拦截,拉出listView,banner只需要处理左右滑动即可
	 */
	@Override
	public boolean dispatchTouchEvent(MotionEvent ev) {
		//滑动事件的处理
		switch (ev.getAction()) {
		//按下
		case MotionEvent.ACTION_DOWN:
			//按下的时候先让父亲控件不要拦截
			getParent().requestDisallowInterceptTouchEvent(true);// 不要拦截,
																	// 这样是为了保证ACTION_MOVE调用
			startX = (int) ev.getRawX();
			startY = (int) ev.getRawY();
			break;
			//滑动
		case MotionEvent.ACTION_MOVE:

			int endX = (int) ev.getRawX();
			int endY = (int) ev.getRawY();
			//判断是上下滑动还是左右滑动
			if (Math.abs(endX - startX) > Math.abs(endY - startY)) {// 左右滑动
				if (endX > startX) {// 右划
					if (getCurrentItem() == 0) {// 第一个页面, 需要父控件拦截
						getParent().requestDisallowInterceptTouchEvent(false);
					}
				} else {// 左划
					if (getCurrentItem() == getAdapter().getCount() - 1) {// 最后一个页面,
																			// 需要拦截
						getParent().requestDisallowInterceptTouchEvent(false);
					}
				}
			} else {// 上下滑动
				getParent().requestDisallowInterceptTouchEvent(false);
			}

			break;

		default:
			break;
		}

		return super.dispatchTouchEvent(ev);
	}

}

--------

public class NewsMenuDetailPager extends BaseMenuDetailPager implements OnPageChangeListener{

	private ViewPager vp_menu_detail;
	private ArrayList<TabDetailPager> mPagerList;
	private ArrayList<NewsTabData> mNewsTabData;//页签的网络数据
	private TabPageIndicator mIndicator;
	
	public NewsMenuDetailPager(Activity activity, ArrayList<NewsTabData> children) {
		super(activity);
		//接受传过来的children数据,有11个
		mNewsTabData = children;
	}

	@Override
	public View initView() {
		View view = View.inflate(mActivity, R.layout.news_menu_details, null);

		vp_menu_detail = (ViewPager) view.findViewById(R.id.vp_menu_detail);
		mIndicator = (TabPageIndicator) view.findViewById(R.id.indicator);
		
		//xUtils使用注解
		ViewUtils.inject(this, view);
		//不是对vp_menu_detail监听而是对mIndicator监听,viewPager。
		//vp_menu_detail.setOnPageChangeListener(this);
		//ViewPager和Indicator绑定的时候,滑动监听要设置给Indicator
		mIndicator.setOnPageChangeListener(this);
        
		return view;
	}
	
	@Override
	public void initData(){
		//数据是通过从服务器中获取大数据来初始化
		mPagerList = new ArrayList<TabDetailPager>();
		for(int i = 0; i < mNewsTabData.size(); i++){
			TabDetailPager tabDetailPager = new TabDetailPager(mActivity, mNewsTabData.get(i));
			//添加到链表
			mPagerList.add(tabDetailPager);
		}
		vp_menu_detail.setAdapter(new MenuDetailAdapter());
		//在vp_menu_detail设置完成adapter以后才能调用,viewpager和indicator关联
		mIndicator.setViewPager(vp_menu_detail);
		
	}
	
	
	//监听右边的箭头,切换内容,内容+1
	@OnClick(R.id.btn_next)
	public void nextPage(View view){
		int currentItem = vp_menu_detail.getCurrentItem();
		vp_menu_detail.setCurrentItem(++ currentItem);
	}
	
	
	class MenuDetailAdapter extends PagerAdapter{
		//使用开源的框架PageIndicator初始化标题,重写这个方法设置tab
		@Override
        public CharSequence getPageTitle(int position) {
            return mNewsTabData.get(position).title;
        }

		@Override
		public int getCount() {
			// TODO Auto-generated method stub
			return mPagerList.size();
		}

		@Override
		public boolean isViewFromObject(View view, Object object) {
			// TODO Auto-generated method stub
			return view == object;
		}
		
		@Override
		public Object instantiateItem(ViewGroup container, int position) {
			//初始化页面
			TabDetailPager tabDetailPager = new TabDetailPager(mActivity, mNewsTabData.get(position));
			//添加view
			container.addView(tabDetailPager.mRebootView);
			//初始化数据
			tabDetailPager.initData();
			//显示界面
			return tabDetailPager.mRebootView;
		}

		@Override
		public void destroyItem(ViewGroup container, int position, Object object) {
			container.removeView((View) object);
		}
	}


	@Override
	public void onPageScrolled(int position, float positionOffset,
			int positionOffsetPixels) {
		// TODO Auto-generated method stub
		
	}

	//页面被选中,这个是对触摸事件的处理,监听触摸事件,只有在滑倒了最左边才会拉出菜单
	@Override
	public void onPageSelected(int position) {
		//获取到左侧的菜单栏
		MainActivity mainUi = (MainActivity) mActivity;
		SlidingMenu slidingMenu = mainUi.getSlidingMenu();
		if(position == 0){
			//当前位置为0的时候可以全屏触摸,可以拉出来菜单栏
			slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
		}else{
			//不为0的时候不让触摸
			slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_NONE);
		}
		
	}

	@Override
	public void onPageScrollStateChanged(int state) {
		// TODO Auto-generated method stub
		
	}

}

阻止ViewPager的滑动NoScrollViewPager.java,重写父类的事件

package com.ldw.beijing.view;

import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;

/*
 * 不让主页的ViewPager滑动,只让其可以点击
 */
public class NoScrollViewPager extends ViewPager {

	public NoScrollViewPager(Context context, AttributeSet attrs) {
		super(context, attrs);
		// TODO Auto-generated constructor stub
	}

	public NoScrollViewPager(Context context) {
		super(context);
		// TODO Auto-generated constructor stub
	}
	
	// 表示事件是否拦截, 返回false表示不拦截,让子view去执行
	@Override
	public boolean onInterceptTouchEvent(MotionEvent arg0) {
		return false;
	}
	
	
	/*
	 * 重写onTouchEvent事件,什么都不用做
	 */
	@Override
	public boolean onTouchEvent(MotionEvent arg0) {
		return false;
	}

}

 

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值