168.n1-事件处理

来源:互联网 发布:js 文本框数值相加 编辑:程序博客网 时间:2024/06/05 00:28

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;}@Overridepublic 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绑定的时候,滑动监听要设置给IndicatormIndicator.setOnPageChangeListener(this);        return view;}@Overridepublic 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;        }@Overridepublic int getCount() {// TODO Auto-generated method stubreturn mPagerList.size();}@Overridepublic boolean isViewFromObject(View view, Object object) {// TODO Auto-generated method stubreturn view == object;}@Overridepublic Object instantiateItem(ViewGroup container, int position) {//初始化页面TabDetailPager tabDetailPager = new TabDetailPager(mActivity, mNewsTabData.get(position));//添加viewcontainer.addView(tabDetailPager.mRebootView);//初始化数据tabDetailPager.initData();//显示界面return tabDetailPager.mRebootView;}@Overridepublic void destroyItem(ViewGroup container, int position, Object object) {container.removeView((View) object);}}@Overridepublic void onPageScrolled(int position, float positionOffset,int positionOffsetPixels) {// TODO Auto-generated method stub}//页面被选中,这个是对触摸事件的处理,监听触摸事件,只有在滑倒了最左边才会拉出菜单@Overridepublic 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);}}@Overridepublic void onPageScrollStateChanged(int state) {// TODO Auto-generated method stub}}
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只需要处理左右滑动即可 */@Overridepublic 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);}}


原创粉丝点击