安卓轮播图的实现(自定义view)

来源:互联网 发布:国外购物网站 知乎 编辑:程序博客网 时间:2024/06/06 02:29
/******************************************************* * @author: wukai             *         * * * * * @date: 2017/10/12         *         *     * * @description:                *         * * * * * @version 1.0 * 主界面设置* * * *   * *******************************************************/public class MainActivity extends AppCompatActivity {    VerticalText mVerticalText;    ArrayList<String> mList;    @Override    protected void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.dai_main);         }}
=============================xml设置===========================================
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical">    <LinearLayout        android:layout_width="match_parent"        android:layout_height="160dp">        <com.slideshow.com.comslideshowcom.SlidSowView            android:layout_width="match_parent"            android:layout_height="match_parent" />    </LinearLayout>
</LinearLayout>
==========================================自定义view============================
package com.slideshow.com.comslideshowcom;import android.content.Context;import android.os.Handler;import android.os.Message;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.View;import android.view.ViewGroup;import android.widget.FrameLayout;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.Toast;import java.util.ArrayList;import java.util.concurrent.Executors;import java.util.concurrent.ScheduledExecutorService;import java.util.concurrent.TimeUnit;/******************************************************* * @author: wukai             *         * * * * * @date: 2017/10/12         *         *     * * @description:                *         * * * * * @version 1.0 * 自定义轮播图* * * *   * *******************************************************/public class SlidSowView extends FrameLayout {    //自动轮播启用开关    public static final boolean isAutoPlay = true;    private Context mContext;    ArrayList<String> mList;    ArrayList<ImageView> mImageViews;    ArrayList<View> mViews;    //当前轮播页    private int currentItem = 0;    //定时任务    private ScheduledExecutorService mScheduledExecutorService;    ViewPager mViewPager;    private Handler mHandler = new Handler() {        @Override        public void handleMessage(Message msg) {            mViewPager.setCurrentItem(currentItem);        }    };    public SlidSowView(@NonNull Context context) {        this(context, null);    }    public SlidSowView(@NonNull Context context, @Nullable AttributeSet attrs) {        this(context, attrs, 0);    }    public SlidSowView(@NonNull Context context, @Nullable AttributeSet attrs, @AttrRes int defStyleAttr) {        super(context, attrs, defStyleAttr);        this.mContext = context;        //初始化数据        initData();    }    private void initData() {        mImageViews = new ArrayList<>();        mViews = new ArrayList<>();        //初始化布局        initUI(mContext);        //初始化定时任务的方法        initTimer();    }    private void initTimer() {        mScheduledExecutorService = Executors.newSingleThreadScheduledExecutor();        mScheduledExecutorService.scheduleAtFixedRate(new SlideShowTask(), 1, 5, TimeUnit.SECONDS);        /*new SlideShowTask()是一个实现Runnable接口的类,会自动运行里面的run()方法,1的意思就是启动等待时间,这里就是直接运行,        5是5秒,要是想小时,就把TimeUnit.SECONDS TimeUnit.HOURS,分钟是TimeUnit.MINUTES*/    }    //执行轮播图切换任务    private class SlideShowTask implements Runnable {        @Override        public void run() {            currentItem = (currentItem + 1) % mImageViews.size();            mHandler.obtainMessage().sendToTarget();        }    }    private void initUI(Context context) {        LayoutInflater.from(context).inflate(R.layout.slidsow, this, true);        LinearLayout douLayout = (LinearLayout) findViewById(R.id.linearlatouy_slidsow);        douLayout.removeAllViews();        //显示图片        ImageView view1 = new ImageView(mContext);        view1.setBackgroundResource(R.drawable.a);        ImageView view2 = new ImageView(mContext);        view2.setBackgroundResource(R.drawable.b);        ImageView view3 = new ImageView(mContext);        view3.setBackgroundResource(R.drawable.c);        ImageView view4 = new ImageView(mContext);        view4.setBackgroundResource(R.drawable.d);        mImageViews.add(view1);        mImageViews.add(view2);        mImageViews.add(view3);        mImageViews.add(view4);        //小点        for (int i = 0; i < mImageViews.size(); i++) {            //初始化轮播图的点击监听事件            mImageViews.get(i).setId(i);            mImageViews.get(i).setOnClickListener(new MyListener());            View pointView = new View(mContext);            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(10, 10);            //初始化圆点以及颜色            if (i == 0) {                pointView.setBackgroundResource(R.color.colorAccent);            } else {                pointView.setBackgroundResource(R.color.colorPrimary);            }            params.leftMargin = 10;            pointView.setLayoutParams(params);            mViews.add(pointView);            //将小点添加到布局中去            douLayout.addView(pointView, params);        }        mViewPager = (ViewPager) findViewById(R.id.viewpager_slidsow);        //启动适配器        MyPagerAdaapter adaapter = new MyPagerAdaapter();        mViewPager.setFocusable(true);        mViewPager.setAdapter(adaapter);        //初始化轮播图的滑动监听事件        mViewPager.setOnPageChangeListener(new MyPageChangeListener());        //设置初始化需要显示的条目数        mViewPager.setCurrentItem(0);    }    //自定义轮播图点击事件    class MyListener implements OnClickListener {        @Override        public void onClick(View view) {            switch (view.getId()) {                case 0:                    Toast.makeText(mContext, "点击的是第一张轮播图!", Toast.LENGTH_SHORT).show();                    break;                case 1:                    Toast.makeText(mContext, "点击的是第二张轮播图!", Toast.LENGTH_SHORT).show();                    break;                case 2:                    Toast.makeText(mContext, "点击的是第三张轮播图!", Toast.LENGTH_SHORT).show();                    break;                case 3:                    Toast.makeText(mContext, "点击的是第四张轮播图!", Toast.LENGTH_SHORT).show();                    break;            }        }    }    //自定义PageChangeListener    class MyPageChangeListener implements ViewPager.OnPageChangeListener {        //滑动被调用        @Override        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {        }        //滑动状态被选定        @Override        public void onPageSelected(int position) {            currentItem = position;            for (int i = 0; i < mViews.size(); i++) {                if (i == position) {                    mViews.get(i).setBackgroundResource(R.color.colorAccent);                } else {                    mViews.get(i).setBackgroundResource(R.color.colorPrimary);                }            }        }        //滑动状态改变时        @Override        public void onPageScrollStateChanged(int state) {        }    }    //自定义PagerAdapter    class MyPagerAdaapter extends PagerAdapter {        //返回轮播图的最大显示条目数        @Override        public int getCount() {            return mImageViews.size();        }        //判断View是否可复用        @Override        public boolean isViewFromObject(View view, Object object) {            return view == object;        }        //返回要显示的条目,并创建条目        @Override        public Object instantiateItem(ViewGroup container, int position) {            int newPosition = position % mImageViews.size();            ImageView imageView = mImageViews.get(newPosition);            container.addView(imageView);            return imageView;        }        //销毁看不到的条目        @Override        public void destroyItem(ViewGroup container, int position, Object object) {            container.removeView(mImageViews.get(position));        }    }}
=======================================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:orientation="vertical">    <android.support.v4.view.ViewPager        android:id="@+id/viewpager_slidsow"        android:layout_width="match_parent"        android:layout_height="match_parent"/>    <LinearLayout        android:id="@+id/linearlatouy_slidsow"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_alignParentBottom="true"        android:gravity="center"        android:orientation="horizontal"        android:padding="8dp">    </LinearLayout></RelativeLayout>

原创粉丝点击