带有引导小点的ViewPager的实现

本文介绍了一种自定义实现带有指示点的ViewPager的方法,通过创建ViewPagerWithPoints组件并提供图片展示功能,支持自定义指示点样式及点击事件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

工作中遇到了需要写一个带有引导的小点的viewpager展示界面,由于网络上的第三方库都不太满意,东西太多,自己试着写了个。

附上demo:带小点的ViewPager图片展示界面demo

界面图预览:

演示图片

ViewPagerWithPoint.java

package violetjack.viewpagerwithpoints;

import android.content.Context;
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.ImageView;
import android.widget.LinearLayout;

import java.util.ArrayList;

/**
 * 自定义下方带小点引导的ViewPager
 *
 * @author violetjack
 */
public class ViewPagerWithPoints extends FrameLayout {

    private Context context;
    private ViewPager imageViewPager;
    private LinearLayout llPoints;
    private ArrayList<ImageView> pointList;
    private OnPagerClickListener pagerClickListener;

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

    public ViewPagerWithPoints(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.context = context;
        init();
    }

    /**
     * 初始化
     */
    private void init() {
        LayoutInflater.from(context).inflate(R.layout.viewpager_with_points, this, true);
        imageViewPager = (ViewPager) findViewById(R.id.viewpager_image_viewpager_with_points);
        llPoints = (LinearLayout) findViewById(R.id.linearlayout_points_viewpager_with_points);
        pointList = new ArrayList<>();
        llPoints.setVisibility(View.INVISIBLE);
    }

    /**
     * 设置页
     *
     * @param imageViewList:ImageView集合
     * @param dotId:未被选择图片的ID
     * @param dotSelectedId:被选择图片的ID
     */
    public void setPager(ArrayList<ImageView> imageViewList, final int dotId, final int dotSelectedId) {
        llPoints.removeAllViews();
        if (imageViewList.size() == 0) {
            llPoints.setVisibility(View.INVISIBLE);
        } else {
            llPoints.setVisibility(View.VISIBLE);
        }
        for (int i = 0; i < imageViewList.size(); i++) {
            ImageView ivPoint = new ImageView(context);
            ivPoint.setLayoutParams(new LayoutParams(30, 30));
            ivPoint.setPadding(5, 0, 5, 0);
            llPoints.addView(ivPoint);
            pointList.add(ivPoint);
        }
        for (int i = 0; i < pointList.size(); i++) {
            pointList.get(i).setImageResource(dotId);
        }
        pointList.get(0).setImageResource(dotSelectedId);
        ImagePagerAdapter imagePagerAdapter = new ImagePagerAdapter(imageViewList);
        imageViewPager.setAdapter(imagePagerAdapter);
        imageViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                for (int i = 0; i < pointList.size(); i++) {
                    pointList.get(i).setImageResource(dotId);
                }
                pointList.get(position).setImageResource(dotSelectedId);
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });
    }

    /**
     * 图片适配器
     */
    private class ImagePagerAdapter extends PagerAdapter {

        private ArrayList<ImageView> imageViewList;

        public ImagePagerAdapter(ArrayList<ImageView> imageViewList) {
            this.imageViewList = imageViewList;
        }

        @Override
        public int getCount() {
            return imageViewList.size();
        }

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

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

        @Override
        public Object instantiateItem(ViewGroup container, final int position) {
            ImageView imageView = imageViewList.get(position);
            imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
            imageView.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (pagerClickListener != null) {
                        pagerClickListener.onPageClick(context, position);
                    }
                }
            });
            container.addView(imageView);
            return imageView;
        }

    }

    /**
     * 图片单击事件接口回调
     *
     * @param onPagerClickListener:图片单击事件接口
     */
    public void setPagerClickListener(OnPagerClickListener onPagerClickListener) {
        this.pagerClickListener = onPagerClickListener;
    }

    /**
     * 图片单击事件接口
     */
    public interface OnPagerClickListener {
        void onPageClick(Context context, int position);
    }

}

view_pager_with_point.xml

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

    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager_image_viewpager_with_points"
        android:layout_marginBottom="40dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <LinearLayout
        android:id="@+id/linearlayout_points_viewpager_with_points"
        android:orientation="horizontal"
        android:layout_gravity="bottom"
        android:gravity="center"
        android:layout_width="match_parent"
        android:layout_height="35dp"/>

</FrameLayout>

该自定义view的使用:

viewPagerWithPoints.setPager(imageViewList, R.drawable.ic_dot_normal, R.drawable.ic_dot_selected);
viewPagerWithPoints.setPagerClickListener(new ViewPagerWithPoints.OnPagerClickListener() {
    @Override
    public void onPageClick(Context context, int position) {
        Toast.makeText(MainActivity.this, "点击了第" + (position + 1) + "个图片", Toast.LENGTH_LONG).show();
    }
});



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值