android 无限轮播图

来源:互联网 发布:p2p是什么软件 编辑:程序博客网 时间:2024/06/06 19:07

PicSlideView 自定义控件

package com.example.demo.view;

import android.content.Context;
import android.os.AsyncTask;
import android.os.Handler;
import android.support.annotation.AttrRes;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;


import com.example.demo.R;
import com.example.demo.utils.DensityUtils;
import com.squareup.picasso.Picasso;


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


/**
 * Created by Administrator on 2017/10/31.
 */


public class PicSlideView extends FrameLayout implements ViewPager.OnPageChangeListener {
    //图片的路径
    private List<String> imgPath;
    //设置动画的时间
    private int time_interval = 3000;
    private ViewPager mViewPager;


    private Context mContext;


    // 存放点的容器
    private LinearLayout ll_point_container;


    private MyPagerAdapter adapter;


    public PicSlideView(@NonNull Context context) {
        this(context, null);
    }


    public PicSlideView(@NonNull Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, 0);
    }


    public PicSlideView(@NonNull Context context, @Nullable AttributeSet attrs, @AttrRes int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        this.mContext = context;
        imgPath = new ArrayList<>();
        new GetListTask().execute("");
    }


    public void setPath(List<String> imgPath) {
        this.imgPath = imgPath;
    }


    private SwitchTask task;


    public void startPlay() {  //开始轮播
        if (task == null) {
            task = new SwitchTask();
        }
        task.start();
    }


    public void stopPlay() {  //停止轮播
        if (task == null) {
            return;
        }
        task.stop();
    }


    public void init(Context mContext) {
        if (imgPath == null || imgPath.size() == 0)
            return;
        LayoutInflater.from(mContext).inflate(R.layout.layout_pic_slide, this, true);
        mViewPager = (ViewPager) findViewById(R.id.mViewPager);
        ll_point_container = (LinearLayout) findViewById(R.id.ll_point_container);
        adapter = new MyPagerAdapter();


        mViewPager.setAdapter(adapter);
        //设置初始位置  如果没有设置 刚开始时不能向左边滑动
        mViewPager.setCurrentItem(imgPath.size() * 100);
        for (int i = 0; i < imgPath.size(); i++) {
            View point = new View(mContext);
            point.setBackgroundResource(R.drawable.point_normal);
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
                    DensityUtils.dp2px(mContext, 6),
                    DensityUtils.dp2px(mContext, 6));
            if (i != 0) {
                params.leftMargin = DensityUtils.dp2px(mContext, 6);
            } else {
                point.setBackgroundResource(R.drawable.point_selected);
            }
            //添加点
            ll_point_container.addView(point, params);
        }
        mViewPager.addOnPageChangeListener(this);
        mViewPager.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        if (task != null) {
                            task.stop();
                        }
                        break;


                    case MotionEvent.ACTION_UP:
                        if (task != null) {
                            task.start();
                        }
                        break;
                }
                return false;
            }
        });
    }


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


    }


    @Override
    public void onPageSelected(int position) {
        position = position % imgPath.size();
        int childCount = ll_point_container.getChildCount();
        for (int i = 0; i < childCount; i++) {
            View child = ll_point_container.getChildAt(i);
            child.setBackgroundResource(i == position  
                    ? R.drawable.point_selected   //选择选中和没有选中的图标
                    : R.drawable.point_normal);
        }
    }


    @Override
    public void onPageScrollStateChanged(int state) {


    }


    private class MyPagerAdapter extends PagerAdapter {
        @Override
        public int getCount() {
            if (imgPath != null) {
                //设置个数,实现无限轮播
                return Integer.MAX_VALUE;
            }
            return 0;
        }


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


        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            position = position % imgPath.size();
            ImageView iv = new ImageView(mContext);
            iv.setScaleType(ImageView.ScaleType.CENTER_CROP);

//使用Picasso加载图片  可以替换成自己的加载图片控件
            Picasso.with(mContext).load(imgPath.get(position)).placeholder(R.mipmap.ic_launcher).error(R.mipmap.ic_launcher).into(iv);
            container.addView(iv);
            return iv;
        }


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




    private class SwitchTask extends Handler implements Runnable {
        @Override
        public void run() {
            // 设置viewpager选中下一个,如果已经是最后一个了,选中第0个
            int item = mViewPager.getCurrentItem();
            if (item == mViewPager.getAdapter().getCount() - 1) {
                // 是最后一个
                item = 0;
            } else {
                item++;
            }
            mViewPager.setCurrentItem(item);
            // 再次执行
            postDelayed(this, time_interval);
        }


        public void start() {  //开始轮播
            removeCallbacks(this);
            postDelayed(this, time_interval);
        }


        public void stop() {  //停止轮播
            removeCallbacks(this);
        }
    }


    /**
     * 异步任务,获取数据
     */
    class GetListTask extends AsyncTask<String, Integer, Boolean> {


        @Override
        protected Boolean doInBackground(String... params) {
            try {
                return true;
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            }
        }


        @Override
        protected void onPostExecute(Boolean result) {
            super.onPostExecute(result);
            if (result) {
                init(mContext);
            }
        }
    }
}


ll_point_container.xml 布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">




    <android.support.v4.view.ViewPager
        android:id="@+id/mViewPager"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />


    <LinearLayout
        android:id="@+id/ll_point_container"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_marginBottom="10dp"
        android:gravity="center"
        android:orientation="horizontal">

    </LinearLayout>

</RelativeLayout>

方法的在MainActivity调用

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        picSlideView = (PicSlideView) mRootView.findViewById(R.id.picSlideView);
        imgPaths = new ArrayList<String>();
        imgPaths.add("");//图片的地址
        imgPaths.add("");
        imgPaths.add("");
        imgPaths.add("");
        picSlideView.setPath(imgPaths);
        picSlideView.startPlay();
    }


原创粉丝点击