Android-event distribution and carousel between ViewPager and internal view

Source: Internet
Author: User

Android-event distribution and carousel between ViewPager and internal view

How does viewpager trigger the event on the view during the sliding process? In other words, does viewpager slide the view in the sliding process, or does it slide the viewpager itself?

I. Sample Code:

1. Customize ViewPager: MyViewPager, redispatchtouchevent method, and add some log information for event processing.

package com.example.viewpagerdemo;import android.content.Context;import android.support.v4.view.ViewPager;import android.util.AttributeSet;import android.util.Log;import android.view.MotionEvent;public class MyViewPager extends ViewPager {    private String TAG = "viewpagertest";    public MyViewPager(Context context, AttributeSet attrs) {        super(context, attrs);    }    @Override    public boolean dispatchTouchEvent(MotionEvent ev) {        switch (ev.getAction()) {        case MotionEvent.ACTION_DOWN:            Log.i(TAG , "===MyViewPager MotionEvent.ACTION_DOWN===");            break;        case MotionEvent.ACTION_MOVE:            Log.i(TAG , "===MyViewPager MotionEvent.ACTION_MOVE===");            break;        case MotionEvent.ACTION_UP:            Log.i(TAG , "===MyViewPager MotionEvent.ACTION_UP===");            break;        case MotionEvent.ACTION_CANCEL:            Log.i(TAG , "===MyViewPager MotionEvent.ACTION_CANCEL===");            break;        }        return super.dispatchTouchEvent(ev);    }}

2. Set the viewpager data adapter in the activity, add the touch event listener to the view, and add the log information for event processing.

package com.example.viewpagerdemo;import android.app.Activity;import android.os.Bundle;import android.support.v4.view.PagerAdapter;import android.util.Log;import android.view.MotionEvent;import android.view.View;import android.view.View.OnTouchListener;import android.view.ViewGroup;import android.view.Window;import android.widget.ImageView;public class MainActivity extends Activity {    private String TAG = "viewpagertest";    private Integer[] imgList = {R.drawable.first,R.drawable.second,R.drawable.third,R.drawable.four};    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        requestWindowFeature(Window.FEATURE_NO_TITLE);        setContentView(R.layout.activity_main);        MyViewPager viewPager = (MyViewPager) findViewById(R.id.myviewpager);        viewPager.setAdapter(new MyAdapter());    }    class MyAdapter extends PagerAdapter {        @Override        public int getCount() {            return 4;        }        @Override        public boolean isViewFromObject(View arg0, Object arg1) {            return arg0 == arg1;        }        @Override        public Object instantiateItem(ViewGroup container, int position) {            View view = View.inflate(getApplicationContext(), R.layout.view_item, null);            ImageView imageView = (ImageView) view.findViewById(R.id.iv);            imageView.setBackgroundResource(imgList[position]);            view.setOnTouchListener(new OnTouchListener() {                @Override                public boolean onTouch(View v, MotionEvent ev) {                    switch (ev.getAction()) {                    case MotionEvent.ACTION_DOWN:                        Log.d(TAG , "===view MotionEvent.ACTION_DOWN===");                        break;                    case MotionEvent.ACTION_MOVE:                        Log.d(TAG , "===view MotionEvent.ACTION_MOVE===");                        break;                    case MotionEvent.ACTION_UP:                        Log.d(TAG , "===view MotionEvent.ACTION_UP===");                        break;                    case MotionEvent.ACTION_CANCEL:                        Log.d(TAG , "===view MotionEvent.ACTION_CANCEL===");                        break;                    }                    return true;                }            });            ((MyViewPager)container).addView(view);            return view;        }        @Override        public void destroyItem(ViewGroup container, int position, Object object) {            ((MyViewPager)container).removeView((View) object);        }    }}

Ii. Event distribution test:

1. CLICK:

Logcat:

Analysis:
The onTouch () method of the setOnTouchListener of the internal view returns true, and the ACTION_DOWN and ACTION_UP events are all consumed by the internal view.

2. Slide (slide a little bit, ViewPager is not changed ):

Logcat:

Analysis:
The onTouch () method of the setOnTouchListener of the internal view returns true, and the ACTION_DOWN, ACTION_MOVE, and ACTION_UP events are all consumed by the internal view.

3. Slide:

Logcat:

Analysis: The ACTION_CANCEL event of the internal view is triggered, and subsequent events are taken over by the external viewpager.

Summary: <喎?http: www.bkjia.com kf ware vc " target="_blank" class="keylink"> Examples/z/u7r7X0wcvL + dPQysK8/qOpPGJyIC8 + examples/examples + samples + DQo8cD7I/aGisLjA/Examples "here write picture description" src = "http://www.bkjia.com/uploads/allimg/150627/0422504525-6.gif" title = "\"/>
Code of viewpager for a custom carousel image:

Package com. example. zwdzjs. view; import java. util. list; import android. content. context; import android. OS. handler; import android. OS. message; 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. example. logutil. logUtil; import com. example. zwdzjs. r; import com. lidroid. xutils. bitmapUtils; public class RollViewPager extends ViewPager {private String TAG = "RollViewPager"; private Context context; private List  TitleList; private List  UrlImgList; private TextView top_news_title; private MyRollViewPagerAdapter adapter; private BitmapUtils bitmapUtils; private int currentItem = 0; private OnViewPagerItemClickListener onItemClickListener; private Handler handler = new Handler () {@ Override public void handleMessage (Message msg) {RollViewPager. this. setCurrentItem (currentItem); startRoll () ;}}; public RollViewPager (Context context, final List  DotviewList, OnViewPagerItemClickListener onViewPagerItemClickListener) {super (context); this. context = context; this. onItemClickListener = onViewPagerItemClickListener; bitmapUtils = new BitmapUtils (context); this. setOnPageChangeListener (new OnPageChangeListener () {@ Override public void onPageSelected (int arg0) {top_news_title.setText (titleList. get (arg0); for (int I = 0; I <dotviewList. size (); I ++) {if (arg0 = I) {dotviewList. get (I ). setBackgroundResource (R. drawable. dot_focus);} else {dotviewList. get (I ). setBackgroundResource (R. drawable. dot_normal) ;}}@ Override public void onPageScrolled (int arg0, float arg1, int arg2) {}@ Override public void onPageScrollStateChanged (int arg0) {}}); this. setCurrentItem (currentItem);} @ Override protected void onDetachedFromWindow () {super. onDetachedFromWindow (); handler. removeCallbacksAndMessages (null);} private int downX; private int downY; @ Override public boolean dispatchTouchEvent (MotionEvent ev) {switch (ev. getAction () {case MotionEvent. ACTION_DOWN: // The parent control of the current viewpager does not intercept the touch event getParent (). requestDisallowInterceptTouchEvent (true); downX = (int) ev. getX (); downY = (int) ev. getY (); break; case MotionEvent. ACTION_MOVE: int moveX = (int) ev. getX (); int moveY = (int) ev. getY (); if (Math. abs (moveX-downX)> = Math. abs (moveY-downY) {// getParent (). requestDisallowInterceptTouchEvent (true);} else {// refresh listview getParent (). requestDisallowInterceptTouchEvent (false);} break;} return super. dispatchTouchEvent (ev);} public void initTitleLists (TextView top_news_title, List  TitleList) {if (null! = Top_news_title & null! = TitleList & titleList. size ()> 0) {top_news_title.setText (titleList. get (0);} this. titleList = titleList; this. top_news_title = top_news_title;} public void initUrlImgList (List  UrlImgList) {this. urlImgList = urlImgList; LogUtil. d (TAG, "==== urlImgList size:" + urlImgList. size ();}/*** scroll viewpager */public void startRoll () {if (adapter = null) {adapter = new MyRollViewPagerAdapter (); this. setAdapter (adapter);} else {adapter. notifyDataSetChanged ();} handler. postDelayed (new Runnable () {@ Override public void run () {currentItem = (currentItem + 1) % urlImgList. size (); Handler. obtainMessage (). sendToTarget () ;}}, 3000) ;}class MyRollViewPagerAdapter extends PagerAdapter {@ Override public int getCount () {return urlImgList. size () ;}@ Override public boolean isViewFromObject (View arg0, Object arg1) {return arg0 = arg1 ;}@ Override public Object instantiateItem (ViewGroup container, final int position) {View view = View. inflate (context, R. layout. viewpager_item, Null); ImageView imageView = (ImageView) view. findViewById (R. id. image); bitmapUtils. display (imageView, urlImgList. get (position); view. setOnTouchListener (new OnTouchListener () {private int downX; private int downY; private long downTime; @ Override public boolean onTouch (View v, MotionEvent event) {switch (event. getAction () {case MotionEvent. ACTION_DOWN: handler. removeCallbacksAndMessages (nul L); downX = (int) event. getX (); downY = (int) event. getY (); downTime = System. currentTimeMillis (); break; case MotionEvent. ACTION_MOVE: break; case MotionEvent. ACTION_UP: if (System. currentTimeMillis ()-downTime <500 & Math. abs (downX-event. getX () <5 & Math. abs (downY-event. getY () <5) {LogUtil. d (TAG, "===== imageView clicked, jump to the corresponding news content page"); // interface callback if (onItemClickListener! = Null) {onItemClickListener. onClick (position) ;}} startRoll (); break; case MotionEvent. ACTION_CANCEL: startRoll (); break;} return true ;}}); (RollViewPager) container ). addView (imageView); return imageView;} @ Override public void destroyItem (ViewGroup container, int position, Object object) {(RollViewPager) container ). removeView (View) object );}} /*** the interface called back when the viewpager item is clicked * @ author lenovo **/public interface OnViewPagerItemClickListener {public void onClick (int I );}}     

Problem:
When you touch your finger on the slideshow, pause the slideshow. After you manually slide to the next carousel image, the program cannot be automatically carousel.

Solution:

Related Article

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.