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 这个只是一样图片,诸位需要自行替换。

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

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

(1)
上一篇 2021年3月12日 下午10:52
下一篇 2021年3月12日 下午10:52


相关推荐

  • 十大滤波算法总结[通俗易懂]

    十大滤波算法总结[通俗易懂]由于MPU6050的深入,我也学会了一些滤波算法,自己写了一些算法,收集了一些算法,供大家一起学习分享,我的代码都是经过反复试验,复制到Arduino中就能开跑的成品代码,移植到自己的程序中非常方便。而且都仔细研究了各个算法,把错误都修正了的,所以也算个小原创吧,在别人基础上的原创。1、限幅滤波法(又称程序判断滤波法)2、中位值滤波法3、算术平均滤波法4、递推平均滤波法(又称滑动平

    2022年6月13日
    46
  • gmapping matlab实现_gmapping学习

    gmapping matlab实现_gmapping学习一、机器人地图机器人地图一般分为三种类型:栅格地图,拓扑地图,特征地图1、栅格地图栅格地图栅格地图,在物流信息技术中有所涉猎,其就是构建一个个“小方块”,利用颜色信息来区分的地图的位置信息。在机器人建图中,栅格地图容易构建,表示且保存位置的唯一,对于短路径的规划方便;但栅格地图的路径规划效率不高,空间浪费(栅格的分辨率不依赖于环境的复杂度)并且也需要精确的机器人位置估计,其对于物体识别的人机交互问…

    2022年6月16日
    36
  • springmvc的执行流程详解[通俗易懂]

    1.什么是MVCMVC是ModelViewController的缩写,它是一个设计模式 2.springmvc执行流程详细介绍 第一步:发起请求到前端控制器(DispatcherServlet)第二步:前端控制器请求HandlerMapping查找Handler        可以根据xml配置、注解进行查找第三步:处理器映射器Handle

    2022年4月4日
    52
  • 奇异值分解及几何意义「建议收藏」

    奇异值分解及几何意义「建议收藏」PS:一直以来对SVD分解似懂非懂,此文为译文,原文以细致的分析+大量的可视化图形演示了SVD的几何意义。能在有限的篇幅把这个问题讲解的如此清晰,实属不易。原文举了一个简单的图像处理问题,简单形象,真心希望路过的各路朋友能从不同的角度阐述下自己对SVD实际意义的理解,比如个性化推荐中应用了SVD,文本以及Web挖掘的时候也经常会用到SVD。原文:Werecommendasingular

    2025年7月5日
    4
  • docker离线安装部署_docker官方中文文档

    docker离线安装部署_docker官方中文文档离线安装docker

    2026年4月13日
    6
  • Radmin远程管理全解析

    Radmin远程管理全解析

    2021年8月6日
    96

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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