返回

用一种有趣的方式探索自定义IndicatorView和ViewPager2的联动实现

Android

自定义IndicatorView

首先,我们需要自定义IndicatorView,它将负责在屏幕上绘制圆点,代表ViewPager2中不同页面的状态。为此,我们将创建一个自定义的View类,该类继承自View。在该类中,我们需要重写onDraw()方法,以便根据需要绘制圆点。

public class IndicatorView extends View {
    private int count;
    private int selectedPosition;
    private float radius;
    private Paint paint;

    public IndicatorView(Context context) {
        super(context);
        init();
    }

    public IndicatorView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public IndicatorView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        count = 0;
        selectedPosition = 0;
        radius = 10f;
        paint = new Paint();
        paint.setStyle(Paint.Style.FILL);
        paint.setColor(Color.BLACK);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        for (int i = 0; i < count; i++) {
            float x = i * (2 * radius + 10) + radius;
            float y = getHeight() / 2;

            if (i == selectedPosition) {
                paint.setColor(Color.RED);
            } else {
                paint.setColor(Color.BLACK);
            }

            canvas.drawCircle(x, y, radius, paint);
        }
    }

    public void setCount(int count) {
        this.count = count;
        invalidate();
    }

    public void setSelectedPosition(int position) {
        this.selectedPosition = position;
        invalidate();
    }
}

与ViewPager2联动

接下来,我们需要将自定义的IndicatorView与ViewPager2联动起来。为此,我们需要在Activity或Fragment中添加ViewPager2和IndicatorView,并设置它们的适配器。我们还需要在ViewPager2的OnPageChangeListener中更新IndicatorView的selectedPosition属性。

public class MainActivity extends AppCompatActivity {

    private ViewPager2 viewPager2;
    private IndicatorView indicatorView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        viewPager2 = findViewById(R.id.viewPager2);
        indicatorView = findViewById(R.id.indicatorView);

        ViewPager2Adapter adapter = new ViewPager2Adapter(this);
        viewPager2.setAdapter(adapter);

        viewPager2.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
            @Override
            public void onPageSelected(int position) {
                super.onPageSelected(position);
                indicatorView.setSelectedPosition(position);
            }
        });

        indicatorView.setCount(adapter.getItemCount());
    }
}

Indicator小圆点的点击事件

最后,我们需要为IndicatorView添加点击事件,以便用户可以通过点击圆点来切换ViewPager2到相应页面。为此,我们需要在IndicatorView中添加一个onTouchEvent()方法,并根据用户的点击位置来更新ViewPager2的当前页面。

@Override
public boolean onTouchEvent(MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        float x = event.getX();
        float y = event.getY();

        for (int i = 0; i < count; i++) {
            float cx = i * (2 * radius + 10) + radius;
            float cy = getHeight() / 2;

            if (Math.sqrt((x - cx) * (x - cx) + (y - cy) * (y - cy)) <= radius) {
                viewPager2.setCurrentItem(i, true);
                break;
            }
        }
    }

    return super.onTouchEvent(event);
}

结论

通过以上步骤,我们就完成了自定义IndicatorView并将其与ViewPager2和Fragment联动实现。这种方法可以帮助您在Android应用中创建美观且用户友好的界面,让用户可以轻松地切换页面。