android实现ViewPager的Indicator的实例代码
发布时间 - 2026-01-10 22:52:35 点击率:次虽然在android5.0中design中有了TabLayout来实现ViewPager的Indicator,简单好用。但这个是我自己实现的,学习了很多,记录在这里。效果图:
第一步
新建一个类继承LinearLayout,用来绘制指示器,及提供Viewpager滑动时重绘指示器的方法:
public class ViewPagerIndicator extends LinearLayout{
//画笔
private Paint mPaint;
//用来画一条线
private Path mPath;
//绘制线的宽度
private int mLineWidth;
//线的初始位置
private int mInitTranslationX;
//移动位置
private int mTranslationX;
//子控件
private View mChildView;
public ViewPagerIndicator(Context context) {
super(context,null);
}
public ViewPagerIndicator(Context context, AttributeSet attrs) {
super(context, attrs);
mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setColor(Color.parseColor("#ffba00"));
mPaint.setStrokeWidth(3);
mPaint.setStyle(Paint.Style.STROKE);
}
//完成布局后获取子控件
@Override
protected void onFinishInflate() {
super.onFinishInflate();
mChildView = getChildAt(0);
}
//在onSizeChanged中获取宽和初始位置,并根据位置初始化线
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
mTranslationX = 0;
mLineWidth = mChildView.getMeasuredWidth();
mInitTranslationX = (w/getChildCount()-mLineWidth)/2;
initLine();
}
//初始化线
private void initLine(){
mPath = new Path();
mPath.moveTo(0,0);
mPath.lineTo(mLineWidth,0);
}
//绘制线
@Override
protected void dispatchDraw(Canvas canvas) {
canvas.save();
//移动到该坐标后开始绘制
canvas.translate(mInitTranslationX + mTranslationX,getHeight());
canvas.drawPath(mPath,mPaint);
canvas.restore();
super.dispatchDraw(canvas);
}
////在viewpager的onPageScrolled监听方法中调用此方法。viewPager滑动时mTranslationX的距离跟着变化,实现线的滑动,position,offset由onPageScrolled传值
public void scroll(int position ,float offset){
int tabWidth = getWidth()/getChildCount();
mTranslationX =(int) (tabWidth * offset +tabWidth * position);
//请求重绘,调用dispatchDraw方法
invalidate();
}
}
第二步
在布局中使用该类:
layout\orderpicking
<com.hlw.stock.customlayout.ViewPagerIndicator
android:id="@+id/indicator"
android:layout_width="match_parent"
android:layout_height="@dimen/xhdpi_40"
android:gravity="center"
android:background="@color/white"
android:orientation="horizontal">
<TextView
android:id="@+id/for_picking"
android:layout_width="@dimen/xhdpi_60"
android:layout_height="match_parent"
android:layout_marginRight="@dimen/xhdpi_60"
android:clickable="true"
android:gravity="center"
android:onClick="onClick"
android:text="待拣货"
android:textColor="@color/light_black"
android:textSize="@dimen/xhdpi_14" />
<TextView
android:id="@+id/has_been_picking"
android:layout_width="@dimen/xhdpi_60"
android:layout_height="match_parent"
android:layout_marginRight="@dimen/xhdpi_60"
android:clickable="true"
android:gravity="center"
android:onClick="onClick"
android:text="已拣货"
android:textColor="@color/light_black"
android:textSize="@dimen/xhdpi_14"
/>
<TextView
android:id="@+id/all"
android:layout_width="@dimen/xhdpi_60"
android:layout_height="match_parent"
android:clickable="true"
android:gravity="center"
android:onClick="onClick"
android:text="全部"
android:textColor="@color/light_black"
android:textSize="@dimen/xhdpi_14" />
</com.hlw.stock.customlayout.ViewPagerIndicator>
<android.support.v4.view.ViewPager
android:id="@+id/orderpicking_date"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:background="@color/white"></android.support.v4.view.ViewPager>
第三步
在activity中完成ViewPagerIndicator与Viewpager的关联
public class OrderPickingActivity extends FragmentActivity implements View.OnClickListener {
TextView forPicking;
TextView hasBeenPicking;
TextView hasBeenPicking;
ViewPagerIndicator mIndicator;
ViewPager orderPickingDate;
private List<Fragment> mFragmentList;
private FragmentPagerAdapter orderPickingAdapter;
private ViewPager.OnPageChangeListener onPageChangeListener;
//当前选中的indicator
private TextView currentItem;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.orderpicking);
init();
orderPickingDate.setAdapter(orderPickingAdapter);
orderPickingDate.addOnPageChangeListener();
orderPickingDate.setCurrentItem(0);
currentItem = forPicking;
currentItem.setTextColor(Color.parseColor("#ffba00"));
}
private void init(){
forPicking = (TextView) findViewById(R.id.for_picking);
hasBeenPicking = (TextView) findViewById(R.id.has_been_picking);
all = (TextView) findViewById(R.id.all);
mIndicator=(ViewPagerIndicator)findViewById(R.id.indicator);
orderPickingDate = (ViewPager)findViewById(R.id.orderpicking_date);
//初始化viewpager的item,并添加到list中
mFragmentList = new ArrayList<>();
OrderPickingFragmentForPicking orderPickingFragmentForPicking =
new OrderPickingFragmentForPicking();
OrderPickingFragmentHasBeenPicking orderPickingFragmentHasBeenPicking =
new OrderPickingFragmentHasBeenPicking();
OrderPickingFragmentAll orderPickingFragmentAll =
new OrderPickingFragmentAll();
mFragmentList.add(orderPickingFragmentForPicking);
mFragmentList.add(orderPickingFragmentHasBeenPicking);
mFragmentList.add(orderPickingFragmentAll);
//设置viewpager的适配器;
orderPickingAdapter = new FragmentPagerAdapter(getSupportFragmentManager()) {
@Override
public int getCount() {
return mFragmentList.size();
}
@Override
public Fragment getItem(int i) {
return mFragmentList.get(i);
}
};
//设置ViewPager监听事件
onPageChangeListener = new ViewPager.OnPageChangeListener(){
//滑动时,indicator下面的横线跟着滑动
@Override
public void onPageScrolled(int i, float v, int i1) {
mIndicator.scroll(i, v);
}
//选中监听,改变indicator文字颜色
@Override
public void onPageSelected(int i) {
switch (i) {
case 0:
if (currentItem == forPicking)
return;
forPicking.setTextColor(Color.parseColor("#ffba00"));
currentItem.setTextColor(Color.parseColor("#646464"));
currentItem = forPicking;
break;
case 1:
if (currentItem == hasBeenPicking)
return;
hasBeenPicking.setTextColor(Color.parseColor("#ffba00"));
currentItem.setTextColor(Color.parseColor("#646464"));
currentItem = hasBeenPicking;
break;
case 2:
if (currentItem == all)
return;
all.setTextColor(Color.parseColor("#ffba00"));
currentItem.setTextColor(Color.parseColor("#646464"));
currentItem = all;
}
}
@Override
public void onPageScrollStateChanged(int i) {}
});
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.for_picking:
orderPickingDate.setCurrentItem(0);
break;
case R.id.has_been_picking:
orderPickingDate.setCurrentItem(1);
break;
case R.id.all:
orderPickingDate.setCurrentItem(2);
break;
default:
break;
}
}
这就完成了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# viewpager
# indicator
# viewpagerindicator
# viewpager和indicator
# Android实现Tab布局的4种方式(Fragment+TabPageIndicator+View
# 教你制作Android中炫酷的ViewPagerIndicator(不仅仿MIUI)
# Android 利用ViewPager+GridView实现首页导航栏布局分页效果
# Android 中 TabHost与ViewPager结合实现首页导航效果
# Android 开发之BottomBar+ViewPager+Fragment实现炫酷的底部导航效果
# Android ViewPager制作新手导航页(动态加载)
# iOS中UIActivityIndicatorView的用法及齿轮等待动画实例
# Android改变ExpandableListView的indicator图标实现方法
# 基于jQuery Bar Indicator 插件实现进度条展示效果
# Android动态给ViewPager添加Indicator导航
# 在这里
# 这就
# 好用
# 来实现
# 第二步
# 第三步
# 大家多多
# 到该
# 新建一个
# 画一
# 完成了
# getChildCount
# oldh
# getMeasuredWidth
# initLine
# Canvas
# dispatchDraw
# moveTo
# lineTo
# oldw
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
美食网站链接制作教程视频,哪个教做美食的网站比较专业点?
JS去除重复并统计数量的实现方法
佐糖AI抠图怎样调整抠图精度_佐糖AI精度调整与放大细化操作【攻略】
EditPlus中的正则表达式实战(6)
如何在腾讯云服务器快速搭建个人网站?
Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案
javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】
在centOS 7安装mysql 5.7的详细教程
Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤
如何在沈阳梯子盘古建站优化SEO排名与功能模块?
如何正确下载安装西数主机建站助手?
如何在云主机快速搭建网站站点?
Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】
Laravel如何实现本地化和多语言支持_Laravel多语言配置与翻译文件管理
Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程
Laravel如何使用Livewire构建动态组件?(入门代码)
Laravel API路由如何设计_Laravel构建RESTful API的路由最佳实践
ai格式如何转html_将AI设计稿转换为HTML页面流程【页面】
如何快速搭建自助建站会员专属系统?
Laravel项目如何进行性能优化_Laravel应用性能分析与优化技巧大全
INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
魔毅自助建站系统:模板定制与SEO优化一键生成指南
Laravel怎么上传文件_Laravel图片上传及存储配置
linux写shell需要注意的问题(必看)
Android okhttputils现在进度显示实例代码
Python数据仓库与ETL构建实战_Airflow调度流程详解
如何用好域名打造高点击率的自主建站?
Win11怎么设置默认图片查看器_Windows11照片应用关联设置
如何制作一个表白网站视频,关于勇敢表白的小标题?
Laravel如何使用查询构建器?(Query Builder高级用法)
Laravel策略(Policy)如何控制权限_Laravel Gates与Policies实现用户授权
Laravel如何使用Spatie Media Library_Laravel图片上传管理与缩略图生成【步骤】
Laravel如何发送系统通知_Laravel Notifications实现多渠道消息通知
Laravel如何编写单元测试和功能测试?(PHPUnit示例)
html如何与html链接_实现多个HTML页面互相链接【互相】
HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】
如何在万网自助建站平台快速创建网站?
如何在VPS电脑上快速搭建网站?
百度浏览器ai对话怎么关 百度浏览器ai聊天窗口隐藏
Python自然语言搜索引擎项目教程_倒排索引查询优化案例
Chrome浏览器标签页分组怎么用_谷歌浏览器整理标签页技巧【效率】
如何在阿里云域名上完成建站全流程?
*服务器网站为何频现安全漏洞?
javascript中闭包概念与用法深入理解
Laravel Facade的原理是什么_深入理解Laravel门面及其工作机制
Laravel中的withCount方法怎么高效统计关联模型数量
js实现点击每个li节点,都弹出其文本值及修改
如何用虚拟主机快速搭建网站?详细步骤解析
Laravel如何处理文件上传_Laravel Storage门面实现文件存储与管理
上一篇: 图文音乐制作网站有哪些,图文如何配乐?
下一篇:laravel 判断是否cli
上一篇: 图文音乐制作网站有哪些,图文如何配乐?
下一篇:laravel 判断是否cli

