Android自定义控件(实现视图树绘制指示器)
程序员文章站
2024-02-22 21:00:28
之前写轮播条或者指示器的时候都是ui图里面直接有,这样的效果并不好,给用户的体验比较差,所以闲暇之余自己写了个指示器,可以展现出一个优雅的效果,当手指 当手指滑动的时候小圆...
之前写轮播条或者指示器的时候都是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) { } }); }
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!