Android自定义控件(实现视图树绘制指示器)
发布时间 - 2026-01-10 22:25:28 点击率:次之前写轮播条或者指示器的时候都是UI图里面直接有,这样的效果并不好,给用户的体验比较差,所以闲暇之余自己写了个指示器,可以展现出一个优雅的效果,当手指 当手指滑动的时候小圆点会跟着一点一点的滑动,当手指停下时,小红点也跟着停下来。首先我说说我实现的这个原理吧

首先在布局文件里面写上线性布局,表示底部的小圆点,方向和位置,然后再在shape里面自绘小圆点。再在代码里面里用布局写出,具体步骤如下:
1、使用LayParams给布局里面添加未选中的小圆点,例如灰色;
2、设置小红点,表示滑动后的状态。
3、获取小圆点之间的距离,这里要获取小圆点的距离不能简单地getWidth,getHeiget,这样是获取不到的 ,这里要用到视图树来观察两个点距离左侧屏幕之间的距离,然后求差获取距离。
4、在监听viewpager的时候获取两者的距离。
代码如下:
一、布局文件
<!--小红点,小圆点的滑动,具体布局在代码里面写的--> <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v4.view.ViewPager android:id="@+id/vp_pager" android:layout_width="match_parent" android:layout_height="match_parent"/> <Button android:id="@+id/btn_start" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:layout_marginBottom="60dp" android:background="#FFF107" android:paddingLeft="10dp" android:paddingRight="10dp" android:textSize="20sp" android:text="开始体验" android:visibility="gone"/> <!--小红点,小圆点的滑动,具体布局在代码里面写的--> <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:layout_marginBottom="20dp"> <LinearLayout android:id="@+id/ll_point_group" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal"> </LinearLayout> <View android:id="@+id/view_red_point" android:layout_width="10dp" android:layout_height="10dp" android:background="@drawable/shape_guide_point_selected"/> </RelativeLayout> </RelativeLayout> <!--普通的圆点--> <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval" > <solid android:color="@android:color/darker_gray" /> </shape> <!--小红点的圆点--> <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval" > <solid android:color="#f00" /> </shape>
二、代码
/**
* 初始化viewpager的数据
*/
private void initView() {
int[] icons = {R.mipmap.guide1,R.mipmap.guide2,R.mipmap.guide3,R.mipmap.guide4};
mList = new ArrayList<>();
for (int i = 0; i < icons.length; i++) {
ImageView view = new ImageView(this);
view.setBackgroundResource(icons[i]); //只有设置了背景才能填充满屏幕
mList.add(view);
//设置,灰色的小圆点,表示滑动时候的状态
View point = new View(this);
point.setBackgroundResource(R.drawable.shape_guide_point_default); //设置背景
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(DensityUtils.dp2px(this,10), DensityUtils.dp2px(this,10));
point.setLayoutParams(params);
if (i != 0) {
params.leftMargin = DensityUtils.dp2px(this, 10);
}
llpointGroup.addView(point);
}
}
三、获取小红点之间的距离
/**
* 初始化小红点之间的距离
*/
private void initPoint() {
// measure -> layout -> draw
viewRedPoint.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
//完成布局后回调该方法,该方法有可能被多次回调
@Override
public void onGlobalLayout() {
viewRedPoint.getViewTreeObserver().removeGlobalOnLayoutListener(this);
mPointWidth = llpointGroup.getChildAt(1).getLeft() - llpointGroup.getChildAt(0).getLeft();
}
});
}
四、让小红点联动
/**
* viewpager的页面滑动的监听
*/
private void initScrollListen() {
viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
//当页面被滑动的时候
//参数一:当前页面的位置 参数二:偏移的百分比 参数三:偏移的距离
@Override
public void onPageScrolled(int position,float positionOffset,int positionOffsetPixels) {
int leftMargin = (int) (mPointWidth * (position + positionOffset));
RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) viewRedPoint.getLayoutParams();
lp.leftMargin = leftMargin;
viewRedPoint.setLayoutParams(lp);
}
//当页面被选择
@Override
public void onPageSelected(int position) {
}
//当页面状态改变的时候
@Override
public void onPageScrollStateChanged(int state) {
}
});
}
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!
# android
# 指示器
# 实现
# Android自定义ViewPager指示器
# Android实现仿网易新闻的顶部导航指示器
# Android应用中仿今日头条App制作ViewPager指示器
# Android应用中使用ViewPager和ViewPager指示器来制作Tab标签
# Android中自定义控件之液位指示器
# Android之IphoneTreeView带组指示器的ExpandableListView效果
# Android之带group指示器的ExpandableListView(自写)
# Android自定义View Flyme6的Viewpager指示器
# 小圆点
# 小红点
# 回调
# 都是
# 圆点
# 我说
# 有可能
# 说我
# 要用
# 然后再
# 写了
# 之余
# 停下来
# 写上
# 里用
# 展现出
# id
# ViewPager
# view
# Button
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
制作旅游网站html,怎样注册旅游网站?
laravel怎么使用数据库工厂(Factory)生成带有关联模型的数据_laravel Factory生成关联数据方法
简单实现Android验证码
厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?
如何在宝塔面板创建新站点?
如何选择可靠的免备案建站服务器?
Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】
用yum安装MySQLdb模块的步骤方法
Laravel如何配置任务调度?(Cron Job示例)
javascript中的数组方法有哪些_如何利用数组方法简化数据处理
Laravel如何使用Blade组件和插槽?(Component代码示例)
EditPlus中的正则表达式 实战(2)
Laravel如何实现本地化和多语言支持?(i18n教程)
Laravel Fortify是什么,和Jetstream有什么关系
如何快速搭建高效服务器建站系统?
javascript基于原型链的继承及call和apply函数用法分析
潮流网站制作头像软件下载,适合母子的网名有哪些?
如何快速搭建FTP站点实现文件共享?
购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?
香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南
php增删改查怎么学_零基础入门php数据库操作必知基础【教程】
网站制作免费,什么网站能看正片电影?
Python并发异常传播_错误处理解析【教程】
Laravel控制器是什么_Laravel MVC架构中Controller的作用与实践
,南京靠谱的征婚网站?
什么是JavaScript解构赋值_解构赋值有哪些实用技巧
济南网站建设制作公司,室内设计网站一般都有哪些功能?
Laravel中Service Container是做什么的_Laravel服务容器与依赖注入核心概念解析
制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?
极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?
mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?
移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?
如何快速选择适合个人网站的云服务器配置?
php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】
iOS验证手机号的正则表达式
Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置
INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】
阿里云网站搭建费用解析:服务器价格与建站成本优化指南
消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工
详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)
Laravel怎么判断请求类型_Laravel Request isMethod用法
Laravel定时任务怎么设置_Laravel Crontab调度器配置
Laravel路由怎么定义_Laravel核心路由系统完全入门指南
EditPlus中的正则表达式实战(5)
如何快速搭建高效香港服务器网站?
Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】
JavaScript中如何操作剪贴板_ClipboardAPI怎么用
如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?
Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境
制作企业网站建设方案,怎样建设一个公司网站?

