android ViewPager滑动时onPageScrollStateChanged函数中的状态变化——轮播制作(四)

android ViewPager滑动时onPageScrollStateChanged函数中的状态变化——轮播制作(四)

使用ViewFlipper进行轮播处理的时候,基本已经完成了。现在正考虑使用ViewPager实现轮播。在实现的时候遇到了一些问题。
如果让ViewPager自己播放的话,当点住当前图片的时候,依然能够进行自动播放。
这就需要对ViewPager的滑动事件进行监听了。需要实现OnPageChangeListener()接口,然后在onPageScrollStateChanged()方法中监听state的状态即可。下面是正在制作过程中的例子,可能不是很完善,但是重点看onPageScrollStateChanged()函数即可。
首先是布局文件:



    

    

MainActivity.java
package com.example.administrator.viewpager;

import android.os.Handler;
import android.os.Message;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity implements ViewPager.OnPageChangeListener {
    private final String TAG = MainActivity.class.getSimpleName();
    private final int TIME_INTERVAL = 3000;
    private final int MAX_COUNT = 9999999;
    private ViewPager viewPager;
    private TextView currentPageNumberText;
    private Button buttonNext;
    private Button buttonPrevious;
    private int currentNumber;
    private int[] imgs = new int[]{
            R.drawable.img1,
            R.drawable.img2,
            R.drawable.img3,
            R.drawable.img4
    };
    private ImageView[] imageViews;

    Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            currentNumber++;
            viewPager.setCurrentItem(currentNumber);
            handler.sendMessageDelayed(new Message(),TIME_INTERVAL);
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        viewPager = (ViewPager) this.findViewById(R.id.viewpage);
        currentPageNumberText = (TextView)this.findViewById(R.id.currentPageNumber);
        buttonNext = (Button) this.findViewById(R.id.buttonNext);
        buttonPrevious = (Button)this.findViewById(R.id.buttonPrevious);
        imageViews = new ImageView[imgs.length];
        for (int i = 0; i < imgs.length; i++) {
            imageViews[i] = new ImageView(this);
            imageViews[i].setImageResource(imgs[i]);
            imageViews[i].setScaleType(ImageView.ScaleType.FIT_XY);
        }
        //设置Adapter
        viewPager.setAdapter(new MyAdapter());
        //设置监听
        viewPager.setOnPageChangeListener(this);
        //设置ViewPager的默认项, 设置为长度的100倍,这样子开始就能往左滑动
        currentNumber = (imageViews.length) * 9999;
        viewPager.setCurrentItem(currentNumber);
        //下一个按钮
        buttonNext.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                currentNumber++;
                viewPager.setCurrentItem(currentNumber);
            }
        });
        buttonPrevious.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                currentNumber--;
                viewPager.setCurrentItem(currentNumber);
            }
        });

        handler.sendMessageDelayed(new Message(),TIME_INTERVAL);

    }

    public class MyAdapter extends PagerAdapter {
        @Override
        public int getCount() {
            return MAX_COUNT;
        }

        @Override
        public boolean isViewFromObject(View view, Object object) {
            return view == object;
        }

        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            Log.i(TAG,"---->destroyItem");
            container.removeView(imageViews[position % imageViews.length]);
        }

        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            Log.i(TAG,"---->instantiateItem");
            container.addView(imageViews[position % imageViews.length], 0);
            return imageViews[position % imageViews.length];
        }
    }

    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
    }

    @Override
    public void onPageSelected(int position) {
        Log.i(TAG,"---->onPageSelected");
        currentNumber = position;
        currentPageNumberText.setText(String.valueOf(position%imageViews.length));
    }

    @Override
    public void onPageScrollStateChanged(int state) {
        switch (state){
            case ViewPager.SCROLL_STATE_IDLE:
                //无动作、初始状态
                Log.i(TAG,"---->onPageScrollStateChanged无动作");
                break;
            case ViewPager.SCROLL_STATE_DRAGGING:
                //点击、滑屏
                Log.i(TAG,"---->onPageScrollStateChanged点击、滑屏");
                break;
            case ViewPager.SCROLL_STATE_SETTLING:
                //释放
                Log.i(TAG,"---->onPageScrollStateChanged释放");
                break;
        }
    }
}

注意看最后的 onPageScrollStateChanged()函数。
下面是运行效果:
android ViewPager滑动时onPageScrollStateChanged函数中的状态变化——轮播制作(四)_第1张图片
这时候,点击发现控制台输出很乱,即使不进行点击滑动,也会输出信息。
我们先注释OnCreate中这句:
handler.sendMessageDelayed(new Message(),TIME_INTERVAL);

然后再次运行后,来回滑动,查看日志中会有如下记录:
09-21 13:54:44.969 3830-3830/com.example.administrator.viewpager I/MainActivity: ---->onPageScrollStateChanged点击、滑屏
09-21 13:54:47.321 3830-3830/com.example.administrator.viewpager I/MainActivity: ---->onPageScrollStateChanged释放
09-21 13:54:48.326 3830-3830/com.example.administrator.viewpager I/MainActivity: ---->onPageScrollStateChanged无动作
09-21 13:54:51.440 3830-3830/com.example.administrator.viewpager I/MainActivity: ---->onPageScrollStateChanged点击、滑屏
09-21 13:54:51.600 3830-3830/com.example.administrator.viewpager I/MainActivity: ---->onPageScrollStateChanged释放
09-21 13:54:51.600 3830-3830/com.example.administrator.viewpager I/MainActivity: ---->onPageSelected
09-21 13:54:51.855 3830-3830/com.example.administrator.viewpager I/MainActivity: ---->onPageScrollStateChanged无动作
09-21 13:54:51.855 3830-3830/com.example.administrator.viewpager I/MainActivity: ---->instantiateItem
09-21 13:54:51.856 3830-3830/com.example.administrator.viewpager I/MainActivity: ---->destroyItem

现在问题就很好解决的,加入标志位就ok了。好用的代码==> android ViewPager轮播制作成品——轮播制作(六)。

你可能感兴趣的:(Android)