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<