当Scrollview内嵌Viewpager或者Listview是我们如何避免事件分发带来的影响?

package com.itheima.news.view;

import java.util.List;

import android.content.Context;
import android.os.Handler;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import com.itheima.news.R;
import com.lidroid.xutils.BitmapUtils;


public class RollViewPager extends ViewPager {

    private Context mContext;
    private List<View> mDosts;

    public RollViewPager(Context context, List<View> mDosts) {
        super(context);
        this.mContext = context;
        this.mDosts = mDosts;
        bitmapUtils = new BitmapUtils(context);

        task = new Task();

        touchListener = new MyOnTouchListener();
    }

    private class MyOnTouchListener implements OnTouchListener {

        @Override
        public boolean onTouch(View v, MotionEvent event) {

            switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                 handler.removeCallbacksAndMessages(null);
                
                break;

            case MotionEvent.ACTION_UP:

                start();
                
                break;
                
            case MotionEvent.ACTION_MOVE:
                handler.removeCallbacks(task);
//                start();
                break;
            }

            return true;
        }

    }

    private class Task implements Runnable {

        @Override
        public void run() {
            mCurrentItem = (mCurrentItem + 1) % mImageLists.size();
            handler.obtainMessage().sendToTarget();

        }
    }

    private List<String> mImageLists;
    private List<String> mTitles;
    private TextView top_news_title;
    private BitmapUtils bitmapUtils;

    public void setViewPageImage(List<String> imageLists) {
        this.mImageLists = imageLists;
    }

    public void setViewPageTitle(List<String> titleLists,
            TextView top_news_title) {
        this.top_news_title = top_news_title;
        this.mTitles = titleLists;
        if (null != top_news_title && null != titleLists
                && titleLists.size() > 0) {

            top_news_title.setText(titleLists.get(0));

        }
    }

    private class RollViewPagerAdapter extends PagerAdapter {

        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            // TODO Auto-generated method stub
            container.removeView((View) object);
        }

        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            View view = View.inflate(mContext, R.layout.viewpager_item, null);

            ImageView image = (ImageView) view.findViewById(R.id.image);

            bitmapUtils.display(image, mImageLists.get(position));

            container.addView(image);
            
            view.setOnTouchListener(touchListener);

            return view;
        }

        @Override
        public int getCount() {
            return mImageLists.size();
        }
        
        @Override
        public boolean isViewFromObject(View arg0, Object arg1) {
            return arg0 == arg1;
        }

    }

    private Handler handler = new Handler() {
        public void handleMessage(android.os.Message msg) {

            RollViewPager.this.setCurrentItem(mCurrentItem);

            start();
        };
    };
    private Task task;

    private int mCurrentItem;

    private int oldPosition = 0;

    private class RollViewPageOnPageChangeListener implements
            OnPageChangeListener {

        @Override
        public void onPageScrollStateChanged(int arg0) {

        }

        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onPageSelected(int position) {
            mCurrentItem = position;

            if (null != mTitles && mTitles.size() > 0 && top_news_title != null) {
                top_news_title.setText(mTitles.get(position));
            }

            if (null != mDosts && mDosts.size() > 0) {

                mDosts.get(position)
                        .setBackgroundResource(R.drawable.dot_focus);

                mDosts.get(oldPosition).setBackgroundResource(
                        R.drawable.dot_normal);

            }

            oldPosition = position;

        }

    }

    private boolean isMove = false;

    /**
     * 事件分发
     */
    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {

        switch (ev.getAction()) {
        case MotionEvent.ACTION_DOWN:

            downX = (int) ev.getX();
            downY = (int) ev.getY();

            isMove = false;

            break;

        case MotionEvent.ACTION_UP:
            
            break;

        case MotionEvent.ACTION_MOVE:
            int currentX = (int) ev.getX();
            int currentY = (int) ev.getY();
            if (Math.abs(currentX - downX) > Math.abs(currentY - downY)) {
                // 响应viewepager的事件
                // getParent().requestDisallowInterceptTouchEvent(true);
                isMove = false;
            } else {
                // 响应listview的事件
                // getParent().requestDisallowInterceptTouchEvent(false);
                isMove = true;
            }

            getParent().requestDisallowInterceptTouchEvent(!isMove);
            break;
        }

        return super.dispatchTouchEvent(ev);
    }

    private boolean has_adapter = false;
    private int downX;
    private int downY;
    private MyOnTouchListener touchListener;

    /**
     * 跳动
     */
    public void start() {
        if (!has_adapter) {
            has_adapter = true;
            RollViewPagerAdapter adapter = new RollViewPagerAdapter();
            RollViewPager.this.setAdapter(adapter);
            RollViewPager.this
                    .setOnPageChangeListener(new RollViewPageOnPageChangeListener());
        }
        handler.postDelayed(task, 3000);
    }

}


你可能感兴趣的:(当Scrollview内嵌Viewpager或者Listview是我们如何避免事件分发带来的影响?)