Android 自制ViewPager的指示器PagerIndicator

1.实际效果

由于之前用到了一个比较老的类似的指示器框架,发现它功能并不完善(发现显示层是用图片来做的,感觉好呆板的控件),而且UI很丑(使用蓝色png图片填充的,为了搭配我的app色调,特意用ps把原图片素材全改为白色了[]~( ̄▽ ̄)~*),就如下面我之前做的App上展示的那样。后来发现Bilibili客户端的效果不错,稍微思考一下发现原理不难,就尝试着自己写一个,终于成品出来了!

这里写图片描述这里写图片描述
从左到右依次是纯粹菜谱,Bilibili客户端,本案例demo


2.原理机制

完成这个自定义ViewGroup时遇到了不少bug,不过主要是逻辑方面的bug,认真检查后一一排除问题了。

制作类似的控件要解决的主要是滑动ViewPager时指示器的显示问题,这个需要很细致清晰的逻辑,然后是对自定义View各个内部方法调用顺序和机制的熟练程度。

整个PagerIndicator运行原理:根据传入的ViewPager,调用其监听方法,根据其状态动态绘制标题下方的小横条(矩形)。当用户滑动页面时,小横条会按比例移动相应的距离;当滑动结束时,小横条固定在指定的位置

下面贴出PagerIndicator源码:

package chen.capton.custom;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.widget.HorizontalScrollView;
import android.widget.LinearLayout;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;

import static android.content.ContentValues.TAG;

/**
 * Created by CAPTON on 2017/1/13.
 */

public class PagerIndicator extends HorizontalScrollView implements View.OnClickListener{
   
    private Context context;
    private int textColor;   //标题字体的颜色
    private int textCheckedColor; //选中时标题字体的颜色
    private int textSize;    //标题字体大小
    private int lineColor;  //横条颜色
    private int lineHeight; //横条厚度(高度)
    private float lineProportion; //横条占比(宽度)0.0~1.0
    private ViewPager viewPager;  //保存传进来的ViewPager
    private List<TextView> textViewList=new ArrayList<>();//显示各个标题的TextView集合
    private List<String> titleList;//标题字符串ArrayList
    private LinearLayout wrapper; //由于控件继承自HorizontalView,其直系子View必须是唯一的LinearLayout。

    public ViewPager getViewPager() {
  return viewPager;}
    //返回值为控件本体对象,方便用户链式调用,下同
    public PagerIndicator setViewPager(ViewPager viewPager) {
        this.viewPager = viewPager;
        return this;
    }
    public List<String> getTitleList() {
  return titleList;}
    public PagerIndicator setTitleList(List<
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值