ViewPager指示器

ViewPager Indicator 自定义标题和指示器样式 本篇文章主要讲述自定义indicator,实现样式和滑动逻辑完全解耦,样式可以随便自定义。根据不同的UI设计随意修改1.indicator的截图显示title区,可设置color size 和gravity2.指示器下划线的样式指示器区域可设置大小颜色//可自定义 } @Override protected IndicatorParameter provideIndicatorParameter() {//可自定义 } @NonNull//可自定义 } }; 阅读详情

效果:ViewPager跟随Tab动,底端绘制三角形

布局文件中:

 <com.bw.view.ViewPagerIndicator

        android:layout_width="match_parent"
        android:layout_height="45dp"
        android:orientation="horizontal"
        android:id="@+id/viewpager_indicator"
        hyman:visible_tab_coount="4"
        android:background="@android:color/holo_green_light">
    
    </com.bw.view.ViewPagerIndicator>

    <android.support.v4.view.ViewPager
        android:layout_width="match_parent"
        android:layout_height="match_parent"

        android:id="@+id/vp"></android.support.v4.view.ViewPager>

自定义一个类 ,继承LinearLayout

public class ViewPagerIndicator extends LinearLayout{
    //画笔
    private Paint mPaint;
    //构造三角形
    private Path mPath;
    //三角形的宽,高,
    private int mTriangleWidth;
    //三角形的底边的长度,相对于的每一个TextVIew的底边的宽度。我们可以定义为1/6
    private static final float RADIO_TRIANGLE_WIDTH = 1/6f;
    //三角形底边的最大值
    private final int DIMENSION_TRIANGLE_WIDTH_MAX = (int) (getScreenWidth()/3*RADIO_TRIANGLE_WIDTH);
    //初始化的偏移量
    private int mInitTranslationX;
    //移动时的偏移量
    private int mTranslationX;
    //设置可见的TextView的数量
    private int mTabVisibleCount;
    private static final int COUNT_DEFAULT_TAB = 4;
    //设置颜色的常量
    private static final int COLOR_TEXT_MORMAL = 0x77FFFFFF;
    private static final int COLOR_TEXT_HIGHLIGHT = 0xFF0000;
    //存放title
    private List<String> mTites;
    private ViewPager mViewPager;
    public PageOnchangeListener mListener;
    
    
    
    public ViewPagerIndicator(Context context) {
        this(context, null);
    }
    
    public ViewPagerIndicator(Context context, AttributeSet attrs) {
        super(context, attrs);
        
        //获取可见tab的数量
        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ViewPagerIndicator);
        
        mTabVisibleCount = a.getInt(R.styleable.ViewPagerIndicator_visible_tab_coount, COUNT_DEFAULT_TAB);
        //如果用户传入的值<0,就设置为默认值
        if(mTabVisibleCount < 0){
            mTabVisibleCount = COUNT_DEFAULT_TAB;
        }
        //释放
        a.recycle();
        
        //初始化画笔
        mPaint = new Paint();
        mPaint.setAntiAlias(true);
        mPaint.setColor(Color.parseColor("#FFFFFF"));
        mPaint.setStyle(Style.FILL);
        mPaint.setPathEffect(new CornerPathEffect(3));
        
    }
    
    //当attr文件加载完之后,会回调这个方法
    protected void onFinishInflate() {
        super.onFinishInflate();
        //那到子元素的个数
        int cCount = getChildCount();
        if(cCount == 0){
            return;
        }
        
        for(int i=0;i<cCount;i++){
            //那到每一个子View
            View view = getChildAt(i);
            LinearLayout.LayoutParams lp = (LayoutParams) view.getLayoutParams();
            lp.weight = 0;
            //设置子view的宽度
            lp.width = getScreenWidth()/mTabVisibleCount;
            view.setLayoutParams(lp);
        }
        
        setItemClickEvent();
    }
    
    //获得屏幕的宽度
    private int getScreenWidth() {
        WindowManager wm = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
        DisplayMetrics outMetrics = new DisplayMetrics();
        //通过WindowManager获得
        wm.getDefaultDisplay().getMetrics(outMetrics);
        //返回屏幕的宽度
        return outMetrics.widthPixels;
    }

    //设置三角形的大小(只要控件的宽高,发生变化,就会调用的方法)
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        //底边的宽度
        mTriangleWidth = (int) (w/mTabVisibleCount*RADIO_TRIANGLE_WIDTH);
        mTriangleWidth = Math.min(mTriangleWidth, DIMENSION_TRIANGLE_WIDTH_MAX);
        //初始时的偏移量
        mInitTranslationX = w/mTabVisibleCount/2-mTriangleWidth/2;
        //初始化三角形
        initTriangle();
    }

    //初始化三角形
    private void initTriangle() {
        //初始化画板,绘制三角形
        mPath = new Path();
        mPath.moveTo(0, 0);
        mPath.lineTo(mTriangleWidth, 0);
        mPath.lineTo(mTriangleWidth/2, -mTriangleWidth/2);
        mPath.close();
    }

    //绘制三角形
    protected void dispatchDraw(Canvas canvas) {
        //绘制三角形
        canvas.save();
        canvas.translate(mInitTranslationX+mTranslationX, getHeight()+2);
        canvas.drawPath(mPath, mPaint);
        canvas.restore();
        super.dispatchDraw(canvas);
    }

    //指示器跟随手指进行滚动
    public void scroll(int position, float offset) {
       int tabWidth = getWidth()/mTabVisibleCount;
       mTranslationX = (int) (tabWidth*(offset+position));
       //但移动到倒数第二个的时候
       //容器移动,当tab处于移动至最后一个时
       if(position>=(mTabVisibleCount-2)&&offset>0&&getChildCount()>mTabVisibleCount){
           
           //在mTabVisibleCount是1的时候
           if(mTabVisibleCount != 1){
                 this.scrollTo(((position-(mTabVisibleCount-2))*tabWidth+(int)(tabWidth*offset)),0);
           }else{
               this.scrollTo(position*tabWidth+(int)(tabWidth*offset), 0);
           }
           
       }
       
       //调用重汇方法
       invalidate();
    }

    //动态添加TextView
    public void setTabItemTitles(List<String> titles){
        if(titles!=null&&titles.size()>0){
            //全部移除布局中的title
            this.removeAllViews();
            mTites = titles;
            for(String title : mTites){
                addView(genetateTextView(title));
            }
            
            setItemClickEvent();
        }
    }
    
    //设置可见的Tab数量
    public void setVisibleTab(int count){
        mTabVisibleCount = count;
    }
   
    //根据title创建tab
    private View genetateTextView(String title) {
        TextView tv = new TextView(getContext());
        LinearLayout.LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT);
        lp.width = getScreenWidth()/mTabVisibleCount;
        tv.setText(title);
        tv.setGravity(Gravity.CENTER);
        tv.setTextSize(16f);
        tv.setTextColor(COLOR_TEXT_MORMAL);
        tv.setLayoutParams(lp);
        return tv;
    }
    
    //设置关联的ViewPager
    public void setViewPager(ViewPager viewPager,int pos){
        mViewPager = viewPager;
           mViewPager.setOnPageChangeListener(new OnPageChangeListener() {
                
                public void onPageSelected(int arg0) {
                   if(mListener !=null){
                       mListener.onPageSelected(arg0);
                   }
                   //在选择的时候
                   hightLightTextView(arg0);
                }
                
                public void onPageScrolled(int arg0, float arg1, int arg2) {
                    scroll(arg0, arg1);
                    if(mListener !=null){
                        mListener.onPageScrolled(arg0, arg1, arg2);
                    }
                }
                
                public void onPageScrollStateChanged(int arg0) {
                    if(mListener!=null){
                        mListener.onPageScrollStateChanged(arg0);
                    }
                }
            });
           //设置默认值
           mViewPager.setCurrentItem(pos);
           //设置默认值为高亮状态
           hightLightTextView(pos);
    }

    //创建一个接口,方便ManiActivity中的VIewPager调用,以免冲突
    public interface PageOnchangeListener{

        public void onPageSelected(int position);
        
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels);
        
        public void onPageScrollStateChanged(int state);
    }
    
    //供外界调用的方法
    public void setOnPagechangeListener(PageOnchangeListener listener){
        this.mListener = listener;
    }
    
    //高亮某个Tab文本
    private void hightLightTextView(int pos){
        //调用重置Tab文本颜色
        resetTextViewColor();
        //设置高亮某个Tab文本
        View view = getChildAt(pos);
        if(view instanceof TextView){
            ((TextView) view).setTextColor(Color.RED);
        }
    }
    
    //重置Tab文本颜色
    public void resetTextViewColor(){
        for(int i=0;i<getChildCount();i++){
            View view = getChildAt(i);
            if(view instanceof TextView){
                ((TextView) view).setTextColor(COLOR_TEXT_MORMAL);
            }
        }
    }

    //设置Tab点击的事件
    public void setItemClickEvent(){
        int cCount = getChildCount();
        for(int i = 0;i<cCount;i++){
            final int j = i;
            View view = getChildAt(i);
            view.setOnClickListener(new OnClickListener() {
                
                public void onClick(View v) {
                    mViewPager.setCurrentItem(j);
                }
            });
        }
    }

}

//在MainActivity里边

public class MainActivity extends FragmentActivity {

    private ViewPager mViewPager;
    private ViewPagerIndicator mIndicator;
    private FragmentPagerAdapter mAdapter;
    private List<String> mList = Arrays.asList("查询1","添加2","展示3","查询4","添加5","展示6","查询7","添加8","展示9");
    private List<VpSimpleFragment> mContents = new ArrayList<VpSimpleFragment>();

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);
        //初始化控件
        initView();
        //初始化数据
        initDatas();
        
        //调用ViewPager指示器里边的方法
        mIndicator.setVisibleTab(4);
        mIndicator.setTabItemTitles(mList);
        mIndicator.setViewPager(mViewPager, 0);
        
        mViewPager.setAdapter(mAdapter);
        
        mIndicator.setOnPagechangeListener(new PageOnchangeListener() {
            
            @Override
            public void onPageSelected(int position) {
                // TODO Auto-generated method stub
                
            }
            
            @Override
            public void onPageScrolled(int position, float positionOffset,
                    int positionOffsetPixels) {
                // TODO Auto-generated method stub
                
            }
            
            @Override
            public void onPageScrollStateChanged(int state) {
                // TODO Auto-generated method stub
                
            }
        });
    }

     //初始化控件
    private void initView() {
          mViewPager = (ViewPager) findViewById(R.id.vp);
          mIndicator = (ViewPagerIndicator) findViewById(R.id.viewpager_indicator);
    }

    //初始化数据
    private void initDatas() {
        //往Fragment集合中,添加数据信息
        for(int i = 0;i<mList.size() ;i++){
            VpSimpleFragment fragment = VpSimpleFragment.newInstance(mList.get(i));
            mContents.add(fragment);
        }
        
        //初始化适配器
        mAdapter = new FragmentPagerAdapter(getSupportFragmentManager()) {
            
            public int getCount() {
                return mList.size();
            }
            
            public Fragment getItem(int arg0) {
                return mContents.get(arg0);
            }
        };
    }
    
}


//fragment中

public class VpSimpleFragment extends Fragment{
    private String mTitle;
    public static final String BUNDLE_KEY = "title";
    
    //创建一个方法,在实例化的时候,将值放在Arguments
    public static VpSimpleFragment newInstance(String title){
        //将获得到的值,放置bundler
        Bundle bundle = new Bundle();
        bundle.putString(BUNDLE_KEY, title);
        VpSimpleFragment fragment = new VpSimpleFragment();
        fragment.setArguments(bundle);
        return fragment;
    }
    
    
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        //取出放在Arguments中的值
        Bundle bundle = getArguments();
        if(bundle != null){
            mTitle = bundle.getString(BUNDLE_KEY);
        }
        //自定义一个TextView
        TextView tv = new TextView(getActivity());
        tv.setText(mTitle);
        tv.setTextSize(20f);
        tv.setGravity(Gravity.CENTER);
        return tv;
    }

    
}
打造Android 最实用的ViewPager 指示器控件 为什么我说它是最实用的 ViewPager 指示器控件呢? 它有以下几个特点: 1、通过自定义 View 来实现,代码简单易懂; 2、使用起来非常方便; 3、通用性高,大部分涉及到 ViewPager 指示器的地方都能使用此控件; 4、实现了两种指示器效果,传统版指示器和流行版指示器(具体请看效果图) 阅读详情

相关推荐

一起Talk Android吧(第三百七十八回:给ViewPager添加indicator)

本章回中主要介绍如何在ViewPager中添加指示器,并且通过具体的代码来讲解,最后通过动画演示了具体的效果。

talk_8的专栏 849

Android开源框架ViewPagerIndicator的基本使用

很多新闻资讯类的app都有一些共性,那就是有一行页签,然后点击页签的内容后,会跳转到对应的页面。有很多此类app都是用到了ViewPagerIndicator这个开源框架。此篇博客就对这个框架的使用做一个笔记。后续随着在开发中不同的额使用场景,也会增加此博客的内容。 今天就先对他的使用方式,做一个介绍,完成一个小demo 首先,写一个布局。这个布局很简单,如果使用到,直接复制再根据实际需求稍作...

hdhhd的博客 1万+

打造高效自定义ViewPagerIndicator

本文还有配套的精品资源,点击获取 简介:ViewPagerIndicator在Android应用中为ViewPager组件提供视觉指示,指示当前页面位置。该话题详细介绍了如何通过自定义画笔(Paint)来绘制矩形指示器,并通过性能优化实现流畅的滑动效果。开发者需要理解ViewPagerIndicator与ViewPager的协同工作原理,利用自定义View类进行绘制,并通过...

weixin_35756373的博客 746

ViewPagerIndicator

一个简单好用的ViewPagerIndicator,提供了五种类型,采用在XML布局中定制颜色大小等参数,在JAVA代码中只需二行代码就能为viewpager添加酷炫效果,并且支持轮播图。 地址:https://github.com/LinweiJ/ViewPagerIndicator 如何使用它? 先在 project的build.gradle 添加: allproj...

LinWeiJ的博客 4098

最新版电子发票样式html+css--普通发票+增值发票

【代码】最新版电子发票样式html+css--普通发票+增值发票。

weixin_44110923的博客 3675

igh ethercat 实时性测试

组备注std(us)max(us)a无锁核,无rt补丁8.38108b锁核+FIFO调度+内存锁定,无rt补丁0.9216c锁核+FIFO调度+内存锁定,+rt补丁0.9922可以看到 a组 使用ethercat不做其他优化,周期抖动非常大,且max能达到 100 多 us;通过 锁核+FIFO调度+内存锁定 进行优化,可以看到 抖动明显降低,且max 为 20 us 左右;

qq_43353632的博客 2309

ViewPager指示器有这一篇就够了

多功能指示器,适用于ViewPager 多场景 传统的文字+指示器组合 单纯的指示器 圆点轮播指示器 GitHub传送门 1.传统的文字+指示器组合 xml: <com.example.indicatorlib.views.TabLayout android:id="@+id/nts_top" an...

雨落文染的博客 1963

【笔记软件obsidian】从入门到精通

目录 一、前言 二、下载及安装 三、【选修】ios用户如何通过iCloud进行三平台同步 四、基本Markdown语法 五、【选修】插件的下载及安装方式 六、

patrick的博客 9万+

Android ViewPager指示器

邮箱:1085220040@qq.com日期:2020/1/6 10:41*///指示器样式一 选中未选中都是圆点//指示器样式二 选中未选中都是方形//指示器样式三 选中方形,未选中圆点//横向排列//纵向排列//指示器之间的间距//指示器排列方向//选中与为选中的颜色//指示器样式,默认都是圆点//样式一 圆点半径大小//样式二 方形大小及圆角//样式三 选中的方形大小及圆角//样式三 未选中的圆点半径//画笔//指示器item的区域。

2301_82242326的博客 1039

C++ 图像线特征提取(CannyLine算法+opencv3.4.6)

C++ 图像线特征提取(CannyLine算法+opencv3.4.6)

weixin_43896283的博客 1084

Xilinx FPGA平台GTX简易使用教程(四)GTX IP核配置教程

干货来了,GTX IP核配置,搬砖全靠它~~

数字IC/FPGA杂货铺,找一找,或许有你想要的~ 1万+

ViewPager底部圆点指示器

在APP的ViewPager引导页面中, 我们通常可以看到底部有小圆点显示当前是第几页, 我们来试一下这个效果是怎么实现的, 效果图如下: {% cq %} 代码是最为耐心、最能忍耐和最令人愉快的伙伴,在任何艰难困苦的时刻,它都不会抛弃你。 {% endcq %} 基础配置 首先要创建出一个滑动页面,可以阅读我以前的文章, 也可以直接读以下文档. 创建适配器控件 ...

风雨踏梦行 1万+

NL2SQL进阶系列(3):Data-Copilot、Chat2DB、Vanna Text2SQL优化框架开源应用实践详解[Text2SQL]

NL2SQL进阶系列(3):Data-Copilot、Chat2DB、Vanna Text2SQL优化框架开源应用实践详解[Text2SQL]

丨汀、的博客 5419

android 自定义viewpager指示器,Android自定义ViewPager指示器

本文实例为大家分享了Android ViewPager指示器的制作方法,供大家参考,具体内容如下1.概述ViewPageIndicator这个开源框架大家都接触过,个人感觉还不错就是用起来比较麻烦,需要这里配置那里配置效果定制起来也不方便。我第一次使用的时候就一直出不来效果,后来找了很久发现是activity的主题没有配置好。今天我们自己来造个轮子实现一把,其中用到了Adapter模式,如果不清楚...

weixin_33235712的博客 422

IEC 61400-1:2019 附录 C 湍流模型全面解读

IEC 61400-1:2019 附录 C 全面解读

weixin_46713695的博客 471

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

ViewPager页面指示器简单实现

ViewPager的页面指示器可以通过设置imageview的visibility属性来实现指示器和页面的联动,java代码如下: viewPager.setOnPageChangeListener(new OnPageChangeListener() { @Override public void onPageSelected(int arg0) { // 改变三个小圆点 Im

xiaoxiaoji的专栏 398

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Android 实现带指示器的自动轮播式ViewPager

前言最近在做项目的时候,有个需求就是实现自动轮播式的ViewPager,最直观的例子就是知乎日报顶部的ViewPager,它内部有着好几个子view,每个一段时间便自动滑动到下一个item view,而底部的指示器也随之跟着改变。抱着学习和分享的目的,笔者把轮播式ViewPager写成了一个独立的控件,以方便以后的使用。

蓝天白云梦的csdn博客 9102

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

安卓ViewPager 指示器

介绍2款比较热的ViewPager 指示器框架 MagicIndicator 和 FlycoTabLayout MagicIndicator https://github.com/hackware1993/MagicIndicator add MagicIndicator to your layout xml: <?xml version="1.0" encoding="utf-8"?&gt...

wusejiege6的博客 420

android 中 viewpager 滑动的指示器

先看下效果图: 这个需要用到1个开源的 库,这个后面也会说下的。 工程目录: 1. MainActivity.java publicclassMainActivityextendsFragmentActivity{ privateViewPagerFrameAdapteradapter;//适配...

anyoujian8851的博客 333

ViewPager 指示器

项目需要一个ViewPager的指示器,发现Android联系人中有该控件,于是抽取出来分享给大家:ViewPagerTabs .java:public class ViewPagerTabs extends HorizontalScrollView implements ViewPager.OnPageChangeListener { ViewPager mPager; privat

lxfeng1098751554的专栏 1211

ViewPager添加指示器

ViewPager添加指示器 接着基本使用的例子 基本使用https://ln0491.github.io/2016/09/29/ViewPager%E7%9A%84%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A8/ 布局中添加存放揭示器的容器 <!-- 存放指示器的容器 --> LinearLayout andro

小城我家 1379

Android自定义ViewPager图片指示器,兼容实现底部横线指示器

前言  记得以前自己使用过的ViewPager Indicator有JakeWharton大神的开源库ViewPagerIndicator,v4包自带的PagerTitleStrip以及Android Support Design库的TabLayout。它们基本上可以实现项目中常见的ViewPager指示器的需求,除非你的项目有特色的指示器需求,如指示器不再是tab底部横线,而是一个三角形或是其...

宿罪的博客 4471
上一篇: 图片画圆
下一篇: Pull解析
有志青年L
博客等级 码龄10年 30粉丝 59原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值