Android自定义控件(实现视图树绘制指示器)
作者:一杯清泉 发布时间:2023-11-14 17:11:59
标签:android,指示器,实现
之前写轮播条或者指示器的时候都是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) {
}
});
}
来源:http://blog.csdn.net/yoonerloop/article/details/51940612


猜你喜欢
- 背景介绍在开发应用过程中经常会遇到显示一些不同的字体风格的信息犹如默认的LockScreen上面的时间和充电信息。对于类似的情况,可能第一反
- 本文实例讲述了C#控件闪烁的解决方法。分享给大家供大家参考。具体分析如下:如果你在Form中绘图的话,不论是不是采用的双缓存,都会看到图片在
- GradientTextViewGithub点我一个非常好用的库,使用kotlin实现,用于设置TexView的字体 渐变颜色、渐变方向 和
- 在Android开发过程中,有时需要获取触摸位置的坐标,以便作进一步处理,比如做炫酷的动画效果,或者响应其他操作。本文简单介绍Android
- 字段策略 0:”忽略判断”,1:”非 NULL 判断”),2:”非空判断”问题描述:当字段策略为 0 “忽略判断” 的时候,如果实体和数据库
- 本文实例讲述了C#自定义繁体和简体字库实现中文繁体和简体之间转换的方法。分享给大家供大家参考。具体分析如下:这里使用C#自定义繁体和简体字库
- SpringBoot的自动装配是拆箱即用的基础,也是微服务化的前提。这次主要的议题是,来看看它是怎么样实现的,我们透过源代码来把握自动装配的
- 方案实施1、 spring和ehcache集成主要获取ehcache作为操作ehcache的对象。spring.xml中注入ehcacheM
- 介绍:%是求余运算符,也叫模除运算符,用于求余数。%要求两个操作数均为整数(或可以隐式转换成整数的类型)。标准规定:如果%左边的操作数为负数
- Activity是Android组件中最基本也是最为常见用的四大组件之一,在 android开发中 ,运用极为广泛,作为初学者需要熟练掌握,
- 本文实例为大家分享了自定义渐变式炫酷动画的ListView下拉刷新,供大家参考,具体内容如下主要要点listview刷新过程中主要有三个步骤
- 一、事务的基本原理Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的。对于纯JDBC操
- datagridview手动添加行数据我在做软件模型界面时,通过功能按钮触发显示的datagridview中,为了方便,需要一些数据,仅写死
- 这篇文章主要介绍了Spring boot整合log4j2过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值
- 本文实例为大家分享了flutter Container容器实现圆角边框的具体代码,供大家参考,具体内容如下在这里使用 Container 容
- 1、什么是const? 常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的。(当然,我们可以偷梁
- 本文主要介绍了Android 获取屏幕的多种宽高信息的示例代码,分享给大家,具体如下:包含的宽高信息如下图所示:在模拟器上获取到的数据:08
- 1、继承Threadpublic class T4 {public static void main(String[] args) {Sys
- rabbitMQ是一个在AMQP协议标准基础上完整的,可服用的企业消息系统。它遵循Mozilla Public License开源协议,采用
- 更新了AS 3.1.2之后,发现新建Kotlin类,类注释依然木有,没办法只有自己动手了。方法很简单,编辑File Header就可以啦。只