ViewPager(轮播图)

 咳咳,效果图比这个图要好,(这个图只是一个简陋的gif图)

首先添加两个标点图(轮播图的每张图对应点)

dot_focused.png

dot_normal.png

添加一个封装类ViewPagerClass(直接复制拿来用)


import android.content.Context;
import android.os.Handler;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.text.Layout;
import android.util.AttributeSet;
import android.util.Log;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;

import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;

import com.ep.eventparticipant.R;

import java.util.ArrayList;
import java.util.List;


public class ViewPagerClass extends RelativeLayout implements Runnable {
    /*定义初始变量*/
    /*定义关于ViewPager初始变量*/
    private ViewPager viewPager;
    private List<View> views;
    /*定义关于小圆点的初始变量*/
    private LinearLayout viewDots;
    private List<ImageView> dots;
    private int dotsSpacing = 2;
    private int dotsRedio = 6;
    /*定于关于轮播的初始变量*/
    private int position = 0;
    private boolean isContinue = true;
    private boolean isAlive = true;
    private  int gravity = Gravity.CENTER;
    private  int changeTime = 1500;



    public ViewPagerClass(Context context) {
        this(context, null);
    }

    public ViewPagerClass(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public ViewPagerClass(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        initViewPager();
        initLinearLayout();
    }
    /*初始化viewPager*/
    public void initViewPager() {
        viewPager = new ViewPager(getContext());
        LayoutParams viewPagerLp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
        addView(viewPager,viewPagerLp);
    }
   /* 初始化LinearLayout*/
    public void initLinearLayout(){
        viewDots = new LinearLayout(getContext());
        LayoutParams viewDotsLp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
        viewDotsLp.addRule(ALIGN_PARENT_BOTTOM);
        viewDotsLp.bottomMargin = dpTopx(20);
        viewDots.setGravity(gravity);
        addView(viewDots,viewDotsLp);
    }
    /*为viewPager构造适配器*/
    class ViewPagerAdapter extends PagerAdapter{
    /*以下四个方法是必须被重载的*/
        @Override
        public int getCount() {
           if (views==null){
               return 0;
           }
            return views.size();
        }
         /*
        该函数用来判断instantiateItem(ViewGroup, int)函数所返回来的Key
        与一个页面视图是否是代表的同一个视图(即它俩是否是对应的,对应的表示同一个View)
         */
        @Override
        public boolean isViewFromObject(View view, Object object) {
            return view==object;
        }
        /*为即将展示页做操作*/
        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            if (views.get(position).getParent()!=null){
                ((ViewGroup)views.get(position).getParent()).removeView(views.get(position));
            }
            container.addView(views.get(position));
            return views.get(position);
        }

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


    Handler pagerHandler = new Handler() {
        public void handleMessage(android.os.Message msg) {
            viewPager.setCurrentItem(msg.what);
           /* setCurrentItem(int index)方法主要用来制定初始化的页面。
            例如加入3个页面通过setCurrentItem(0)制定第一个页面为当前页面*/
            super.handleMessage(msg);
        }
    };
    /*根据图片数量生成圆点*/
    private void addDots(int size){
        dots = new ArrayList<ImageView>();
        for (int i = 0; i < size; i++) {
            ImageView dot = new ImageView(getContext());
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
                    dpTopx(dotsRedio), dpTopx(dotsRedio));
            params.setMargins(dpTopx(dotsSpacing), 0, dpTopx(dotsSpacing), 0);
            dot.setLayoutParams(params);
            if (i == 0) {
                dot.setBackgroundResource(R.drawable.dot_focused);
            } else {
                dot.setBackgroundResource(R.drawable.dot_normal);
            }
            dots.add(dot);
            viewDots.addView(dot);
        }
    }
    public void setViewPagerViews(List<View> views){
        this.views = views;
        addDots(views.size());
        viewPager.setAdapter(new ViewPagerAdapter());
        /*滑动的时候要改变圆点的颜色*/
        viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int positio, float positionOffset, int positionOffsetPixels) {
 /*               if (positio == 0) {
                    if(positionOffsetPixels == 0){
                        Log.e("Test", "onPageScrolled: -------------------------------" );
                        position = 5;
                    }
                }
                if (positio == 5) {
                    if(positionOffsetPixels == 0){
                        Log.e("Test", "onPageScrolled: -------------------------------" );
                        position = 0;
                    }
                }*/
            }

            @Override
            public void onPageSelected(int positiona) {
             position = positiona;
                for (int i = 0; i < dots.size(); i++) {
                    if (position == i) {
                        dots.get(i).setBackgroundResource(
                                R.drawable.dot_focused);
                    } else {
                        dots.get(i)
                                .setBackgroundResource(R.drawable.dot_normal);
                    }
                }
                

            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });
        viewPager.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                    case MotionEvent.ACTION_MOVE:
                        isContinue = false;
                        break;
                    case MotionEvent.ACTION_UP:
                        isContinue = true;
                        break;
                    default:
                        isContinue = true;
                        break;
                }
                return false;
            }
        });
        new Thread(this).start();

    }


    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        getParent().requestDisallowInterceptTouchEvent(true);
        return super.dispatchTouchEvent(ev);
    }

    @Override
    public void run() {
        while (isAlive) {
            if (isContinue) {
                pagerHandler.sendEmptyMessage(position);
                position = (position + 1) % views.size();
                try {
                    Thread.sleep(changeTime);
                } catch (InterruptedException e) {
                }
            }
        }
    }
    private int dpTopx(int dp) {
        float scale = getResources().getDisplayMetrics().density;
        return (int) (dp * scale + 0.5f);
    }
    /*当调到其他页面时 调用stop停止线程*/
    public void stop() {
        isAlive = false;
    }
}

activity_main.xml:(这里的路径是读者自己的的ViewPagerClass的所放的地方,如我的是在com.example.dell.recyclerview目录下

 <com.example.dell.recyclerview.ViewPagerClass
        android:id="@+id/viewpager_home"
        android:layout_width="match_parent"
        android:layout_height="180dp" >
    </com.example.dell.recyclerview.ViewPagerClass>
MainActivity:

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;

import java.util.ArrayList;
import java.util.List;

import static java.security.AccessController.getContext;

public class MainActivity extends AppCompatActivity {
    ViewPagerClass viewPagerClass;
    public static List<View> viewList = new ArrayList<>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //条件要加
        if (viewList.isEmpty()) {
            init();
        }
        viewPagerClass = findViewById(R.id.viewpager_home);
        viewPagerClass.setViewPagerViews(viewList);

    }
    private void init() {
        //如果是在Fragment中getApplicationContext()改为getContext
        ImageView img_1 = new ImageView(getApplicationContext());
        img_1.setBackgroundResource(R.drawable.bg_home_1);

        ImageView img_2 = new ImageView(getApplicationContext());
        img_2.setBackgroundResource(R.drawable.bg_home_2);

        ImageView img_3 = new ImageView(getApplicationContext());
        img_3.setBackgroundResource(R.drawable.bg_home_3);

        ImageView img_4 = new ImageView(getApplicationContext());
        img_4.setBackgroundResource(R.drawable.bg_home_4);

        ImageView img_5 = new ImageView(getApplicationContext());
        img_5.setBackgroundResource(R.drawable.bg_home_5);

        viewList.add(img_1);
        viewList.add(img_2);
        viewList.add(img_3);
        viewList.add(img_4);
        viewList.add(img_5);
    }


}

猜你喜欢

转载自blog.csdn.net/qq873044564/article/details/81262512