Android【轮播图工具类】

Android【轮播图工具类】

可以定义轮播图的圆点样式

核心代码

public class FlashView extends RelativeLayout {
   

    private static final int RMP = LayoutParams.MATCH_PARENT;
    private static final int RWP = LayoutParams.WRAP_CONTENT;
    private static final int LWC = LinearLayout.LayoutParams.WRAP_CONTENT;
    private static final int WHAT_AUTO_PLAY = 1000;
    //Point位置
    public static final int CENTER = 0;
    public static final int LEFT = 1;
    public static final int RIGHT = 2;

    private LinearLayout mPointRealContainerLl;

    private ViewPager mViewPager;
    //本地图片资源
    private List<Integer> mImages;
    //网络图片资源
    private List<String> mImageUrls;
    //是否是网络图片
    private boolean mIsImageUrl = false;
    //是否只有一张图片
    private boolean mIsOneImg = false;
    //是否可以自动播放
    private boolean mAutoPlayAble = true;
    //是否正在播放
    private boolean mIsAutoPlaying = false;
    //自动播放时间
    private int mAutoPalyTime = 5003;
    //当前页面位置
    private int mCurrentPositon;
    //指示点位置
    private int mPointPosition = CENTER;
    //指示点资源
    private int mPointDrawableResId = R.drawable.selector_bgabanner_point;
    //指示容器背景
    private Drawable mPointContainerBackgroundDrawable;
    //指示容器布局规则
    private LayoutParams mPointRealContainerLp;
    //提示语
    private TextView mTips;

    private List<String> mTipsDatas;
    //指示点是否可见
    private boolean mPointsIsVisible = true;
    private int placeholder = R.mipmap.ic_loading_325;


    private Handler mAutoPlayHandler = new Handler() {
   
        @Override
        public void handleMessage(Message msg) {
   
            mCurrentPositon++;
            mViewPager.setCurrentItem(mCurrentPositon);
            mAutoPlayHandler.sendEmptyMessageDelayed(WHAT_AUTO_PLAY, mAutoPalyTime);
        }
    };

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

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

    public FlashView(Context context, AttributeSet attrs, int defStyleAttr) {
   
        super(context, attrs, defStyleAttr);

        init(context, attrs);
    }

    private void init(Context context, AttributeSet attrs) {
   

        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.FlyBanner);

        mPointsIsVisible = a.getBoolean(R.styleable.FlyBanner_points_visibility, true);
        mPointPosition = a.getInt(R.styleable.FlyBanner_points_position, CENTER);
        mPointContainerBackgroundDrawable
                = a.getDrawable(R.styleable.FlyBanner_points_container_background);

        a.recycle();

        setLayout(context);
    }

    private void setLayout(Context context) {
   
        //关闭view的OverScroll
        setOverScrollMode(OVER_SCROLL_NEVER);
        //设置指示器背景
        if (mPointContainerBackgroundDrawable == null) {
   
            mPointContainerBackgroundDrawable = new ColorDrawable(Color.parseColor("#00aaaaaa"));
        }
        //添加ViewPager
        mViewPager = new ViewPager(context);
        addView(mViewPager, new LayoutParams(RMP, RMP));
        //设置指示器背景容器
        RelativeLayout pointContainerRl = new RelativeLayout(context);
        if (Build.VERSION.SDK_INT >= 16) {
   
            pointContainerRl.setBackground(mPointContainerBackgroundDrawable);
        } else {
   
            pointContainerRl.setBackgroundDrawable(mPointContainerBackgroundDrawable);
        }
        //设置内边距
        pointContainerRl.setPadding(0, 10, 0, 10);
        //设定指示器容器布局及位置
        LayoutParams pointContainerLp = new LayoutParams(RMP, RWP);
        pointContainerLp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
        addView(pointContainerRl, pointContainerLp);
        //设置指示器容器
        mPointRealContainerLl = new LinearLayout(context);
        mPointRealContainerLl.setOrientation(LinearLayout.HORIZONTAL);
        mPointRealContainerLp = new LayoutParams(RWP, RWP);
        pointContainerRl.addView(mPointRealContainerLl, mPointRealContainerLp);
        //设置指示器容器是否可见
        if (mPointRealContainerLl != null) {
   
            if (mPointsIsVisible) {
   
                mPointRealContainerLl.setVisibility(View.VISIBLE);
            } else {
   
                mPointRealContainerLl.setVisibility(View.GONE);
            }
        }
        //设置指示器布局位置
        if (mPointPosition == CENTER) {
   
            mPointRealContainerLp.addRule(RelativeLayout.CENTER_HORIZONTAL);
        } else if (mPointPosition == LEFT) {
   
            mPointRealContainerLp.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
        } else if (mPointPosition == RIGHT) {
   
            mPointRealContainerLp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
        }
    }

    /** * 设置本地图片 * * @param images */
    public void setImages(List<Integer> images) {
   
        //加载本地图片
        mIsImageUrl = false;
        this.mImages = images;
        if (images.size() <= 1)
            mIsOneImg = true;
        //初始化ViewPager
        initViewPager();
    }

    public void setPlaceholder(int placeholder){
   
        this.placeholder = placeholder;
    }

    /** * 设置网络图片 * * @param urls */
    public void setImagesUrl(List<String> urls) {
   
        //加载网络图片
        mIsImageUrl = true;
        this.mImageUrls = urls;
        if (urls.size() <= 1)
            mIsOneImg = true;
        //初始化ViewPager
        initViewPager();
    }

    /** * 设置指示点是否可见 * * @param isVisible */
    public void setPointsIsVisible(boolean isVisible) {
   
        if (mPointRealContainerLl != null) {
   
            if (isVisible) {
   
                mPointRealContainerLl.setVisibility(View.VISIBLE);
            } else {
   
                mPointRealContainerLl.setVisibility(View.GONE);
            }
        }
    }

    /** * 对应三个位置 CENTER,RIGHT,LEFT * * @param position */
    public void setPoinstPosition(int position) {
   
        //设置指示器布局位置
        if (position == CENTER) {
   
            mPointRealContainerLp.addRule(RelativeLayout.CENTER_HORIZONTAL);
        } else if (position == LEFT) {
   
            mPointRealContainerLp.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
        } else if (position == RIGHT) {
   
            mPointRealContainerLp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
        }
    }

    private void initViewPager() {
   
        //当图片多于1张时添加指示点
        if (!mIsOneImg) {
   
            addPoints();
        }
        //设置ViewPager
        FlyPageAdapter adapter = new FlyPageAdapter();
        mViewPager.setAdapter(adapter);
        mViewPager.addOnPageChangeListener(mOnPageChangeListener);
        //跳转到首页
        mViewPager.setCurrentItem(1, false);
        //当图片多于1张时开始轮播
        if (!mIsOneImg) {
   
            startAutoPlay();
        }
    }


    /** * 返回真实的位置 * * @param position * @return */
    private int toRealPosition(int position) {
   
        int realPosition;
        if (mIsImageUrl) {
   
            realPosition = (position - 1) % mImageUrls.size();
            if (realPosition < 0)
                realPosition += mImageUrls.size();
        } else {
   
            realPosition = (position - 1) % mImages.size();
            if (realPosition < 0)
                realPosition += mImages.size();
        }

        return realPosition;
    }

    private ViewPager.OnPageChangeListener mOnPageChangeListener = new ViewPager.OnPageChangeListener() {
   
        @Override
        public void onPageScrolled(int position, float positionOffset,
                                   int positionOffsetPixels) {
   
        }

        @Override
        public void onPageSelected(int position) {
   
            if (mIsImageUrl) {
   
                mCurrentPositon = position % (mImageUrls.size() + 2);
            } else {
   
                mCurrentPositon = position % (mImages.size() + 2);
            }
            switchToPoint(toRealPosition(mCurrentPositon));
        }

        @Override
        public void onPageScrollStateChanged(int state) {
   
            if (state == ViewPager.SCROLL_STATE_IDLE) {
   
                int current = mViewPager.getCurrentItem();
                int lastReal = mViewPager.getAdapter().getCount() - 2;
                if (current == 0) {
   
                    mViewPager.setCurrentItem(lastReal, false);
                } else if (current == lastReal + 1) {
   
                    mViewPager.setCurrentItem(1, false);
                }
            }
        }
    };

    private class FlyPageAdapter extends PagerAdapter {
   

        @Override
        public int getCount() {
   
            //当只有一张图片时返回1
            if (mIsOneImg) {
   
                return 1;
            }
            //当为网络图片,返回网页图片长度
            if (mIsImageUrl)
                return mImageUrls.size() + 2;
            //当为本地图片,返回本地图片长度
            return mImages.size() + 2;
        }

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

        @Override
        public Object instantiateItem(ViewGroup container, final int position) {
   
            ImageView imageView = new ImageView(getContext());
            imageView.setOnClickListener(new OnClickListener() {
   
                @Override
                public void onClick(View view) {
   
                    if (mOnItemClickListener != null) {
   
                        mOnItemClickListener.onItemClick(toRealPosition(position));
                    }
                }
            });
            imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
// imageView.setAdjustViewBounds(true);
            if (mIsImageUrl) {
   
                Glide.with(getContext())
                        .load(mImageUrls.get(toRealPosition(position)))
                        .placeholder(placeholder)
                        .error(placeholder)
                        .into(imageView);
            } else {
   
                imageView.setImageResource(mImages.get(toRealPosition(position)));
            }
            container.addView(imageView);

            return imageView;
        }

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


    /** * 添加指示点 */
    private void addPoints() {
   
        mPointRealContainerLl.removeAllViews();
        LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LWC, LWC);
        lp.setMargins(10, 10, 10, 10);
        ImageView imageView;
        int length = mIsImageUrl ? mImageUrls.size() : mImages.size();
        for (int i = 0; i < length; i++) {
   
            imageView = new ImageView(getContext());
            imageView.setLayoutParams(lp);
            imageView.setImageResource(mPointDrawableResId);
            mPointRealContainerLl.addView(imageView);
        }

        switchToPoint(0);
    }

    /** * 切换指示器 * * @param currentPoint */
    private void switchToPoint(final int currentPoint) {
   
        for (int i = 0; i < mPointRealContainerLl.getChildCount(); i++) {
   
            mPointRealContainerLl.getChildAt(i).setEnabled(false);
        }
        mPointRealContainerLl.getChildAt(currentPoint).setEnabled(true);

    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
   
        if (mAutoPlayAble && !mIsOneImg) {
   
            switch (ev.getAction()) {
   
                case MotionEvent.ACTION_DOWN:
                    stopAutoPlay();
                    break;
                case MotionEvent.ACTION_UP:
                case MotionEvent.ACTION_CANCEL:
                case MotionEvent.ACTION_OUTSIDE:
                    startAutoPlay();
                    break;
            }
        }
        return super.dispatchTouchEvent(ev);
    }

    /** * 开始播放 */
    public void startAutoPlay() {
   
        if (mAutoPlayAble && !mIsAutoPlaying) {
   
            mIsAutoPlaying = true;
            mAutoPlayHandler.sendEmptyMessageDelayed(WHAT_AUTO_PLAY, mAutoPalyTime);
        }
    }

    /** * 停止播放 */
    public void stopAutoPlay() {
   
        if (mAutoPlayAble && mIsAutoPlaying) {
   
            mIsAutoPlaying = false;
            mAutoPlayHandler.removeMessages(WHAT_AUTO_PLAY);
        }
    }

    private OnItemClickListener mOnItemClickListener;

    public void setOnItemClickListener(OnItemClickListener listener) {
   
        this.mOnItemClickListener = listener;
    }

    public interface OnItemClickListener {
   
        void onItemClick(int position);
    }
}

selector_bgabanner_point

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_enabled="true">
        <shape android:shape="oval">
            <size android:width="6dp" android:height="6dp" />
            <solid android:color="@android:color/white" />
        </shape>
    </item>
    <item>
        <shape android:shape="oval">
            <size android:width="6dp" android:height="6dp" />
            <solid android:color="#ddd" />
        </shape>
    </item>
</selector>

** style**

  <!--轮播图-->
    <declare-styleable name="FlyBanner">
        <attr name="points_visibility" format="boolean" />
        <attr name="points_position" format="enum">
            <enum name="CENTER" value="0" />
            <enum name="LEFT" value="1" />
            <enum name="RIGHT" value="2" />
        </attr>
        <attr name="points_container_background" format="reference|color" />
    </declare-styleable>

使用方法
banner.setImagesUrl();

R.mipmap.ic_loading_325 这个只是一样图片,诸位需要自行替换。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/2830.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(1)


相关推荐

  • 方法的改造

    方法的改造

  • Android 短信验证码登录注册

    Android 短信验证码登录注册我这里主要讲解的是使用xutils进行开发的,所以在开发之前一定要先导入xutils项目包。下载链接:https://download.csdn.net/download/weixin_42497748/10754925  1.在AndroidManifest.xml里面开通权限&lt;!–网络权限–&gt;&lt;uses-permissionand…

  • AssetBundle加载

    AssetBundle加载https://blog.csdn.net/lodypig/article/details/51872595

  • android listview添加headview

    android listview添加headviewlistview添加headview后的点击事件1、头部view:设置view的点击时间,用于屏蔽listview的item的点击事件 ViewheaderView=getLayoutInflater().inflate(R.layout.listhead,null); Buttonbtn=(Button)headerView.findViewById(R.id.bu

  • 小白入门——“贪吃蛇”的C语言实现(详细)

    小白入门——“贪吃蛇”的C语言实现(详细)C语言实现,编译环境VS2017附:easyx图形化(文章末尾)效果图如下(有一些函数kbhit,getch,在这表示为_kbhit与_getch)//不同编译器原因注意在Dev等集成开发软件下可能会CEo(* ̄▽ ̄*)o一、引言作为一个小白,相信大家的心情都是一样的,渴望写一个人生的第一个“贪吃蛇”。…

  • 华为AAA认证详解

    华为AAA认证详解 AAA的基本构架 AAA通常采用“客户端—服务器”结构。这种结构既具有良好的可扩展性,又便于集中管理用户信息。如图1所示。 图1AAA的基本构架示意图  认证    不认证:对用户非常信任,不对其进行合法检查,一般情况下不采用这种方式。    本地认证:将用户信息配置在网络接入服务器上。本地认证的优点是速度快,可以为运营降低成本,缺点是存储信息量受设备硬件条…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号