关注我一、View结构原理
1.extends linearLayout
  继承想要用的布局,首先完成布局的填充在 onFinishInflate 方法中 findViewById();
@Override
protected void onFinishInflate() {
super.onFinishInflate();
mTop = findViewById(R.id.id_stickynavlayout_topview);
mNav = findViewById(R.id.id_stickynavlayout_indicator);
View view = findViewById(R.id.id_stickynavlayout_viewpager);
if (!(view instanceof ViewPager)) {
throw new RuntimeException(
"id_stickynavlayout_viewpager show used by ViewPager !");
}
mViewPager = (ViewPager) view;
} 2.测量布局 在onMeasuer 方法中实现,根据不同的要求进行不同的测量,基本绘制用到的四个方法
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { //onMeasure
//不限制顶部的高度
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
getChildAt(0).measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
ViewGroup.LayoutParams params = mViewPager.getLayoutParams();
params.height = getMeasuredHeight() - mNav.getMeasuredHeight();
setMeasuredDimension(getMeasuredWidth(), mTop.getMeasuredHeight() + mNav.getMeasuredHeight() + mViewPager.getMeasuredHeight());
}
    1.在onMeasure中要注意通过setMeasuredDimension(width, height)保存计算结果
    2.//UNSPECIFIED
      //Measure specification mode: The parent has not imposed any constraint
      //on the child. It can be whatever size it wants.
      //测量规范模式:父没有对孩子施加任何约束。它可以是它想要的大小       //EXACTLY
      //Measure specification mode: The parent has determined an exact size
      //for the child. The child is going to be given those bounds regardless
      //of how big it wants to be
      //测量规范模式:父已确定一个确切的大小*为孩子。不管孩子有多大,他们都将被赋予这些       //Measure specification mode: The child can be as large as it wants up
      //to the specified size
      //测量规格模式:孩子可以大,因为它想*到指定的大小
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) { //onLayout
super.onLayout(changed, l, t, r, b);
}
     (1)setFrame(l,t,r,b),l,t,r,b即子视图在父视图中的具体位置,该函数用于将这些参数保存起来;
     (2)onLayout(),在View中这个函数什么都不会做,提供该函数主要是为viewGroup类型布局子视图用的;       public void layout(int l, int t, int r, int b)
      protected boolean setFrame(int left, int top, int right, int bottom)
      protected void onLayout(boolean changed, int left, int top, int right, int bottom)
      layout通过调用setFrame(l,t,r,b),l,t,r,b即子视图在父视图中的具体位置,onLayout一般只会在自定义ViewGroup中才会使用 View中几种重要的方法 @Override
protected void onDraw(Canvas canvas) {                     //onDraw
super.onDraw(canvas);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {   //onSizeChange
super.onSizeChanged(w, h, oldw, oldh);
mTopViewHeight = mTop.getMeasuredHeight();
}
 
ScrollView sc = new ScrollView(getContext());
sc.fling(100);
OverScroller os = new OverScroller(getContext());        //fling();滑动多少调用的方法
os.fling(0,0,0,0,0,0,0,0);
@Override
public void scrollTo(int x, int y) {               //scrollTo 滑动到具体的位置
if (y < 0) {
y = 0;
}
if (y > mTopViewHeight) {
y = mTopViewHeight;
}
if (y != getScrollY()) {
super.scrollTo(x, y);
}
}
重点来了,首先要实现滑动的方法 自定义View方法
 1.onFinishInflate()在我看来就好像Activity中的Activity();完成一些初使的工作,findViewById();
 2.onMeasure();进行测量,注意MeasureSpec的用法,LayoutParmas的宽高,最后记得setMeasuredDimension()把宽高设置上去
 3.onSizeChange(); 一变化的操作都放在这里
 4.computeScroll();这个方法会用scrollTo(w,h)到指定的位置  5.onStartNestedScroll();开始滑动 要return true才能滑动部布局
 6.onNestedScrollAccepted();就像Activty中的resume,pausee,暂停再次执行会启动该方法
 7.onNestedPreScroll();滑动执行的操作每次都会执行
 8.scrollTo(); 滑动到哪儿
 9.onStopNestedScroll();停止滑动的操作
getScaleY()和getgetScrollY()的区别,在这里踩坑了

indicator的实现逻辑
 1.首页得到标题的数据,长度,用代码布局的方式完成布局逻辑
 2.用onSizeChange()方法完成数据变化时的上操作
 3.用dispathDraw的canvas来完成下划线
三、自定义View增加属性的两种方法:
 
四、控件绘制 onDraw()
 
 
文章,这篇也是写关于stickNavLayout,希望大家能得以帮助,都是关于ViewPager中嵌套垂直滚动, CoordinatorLayout配合AppBarLayout,Toolbar和TabLayout的使用 ,自己总结关于CoordinatorLayout这个gitHub上面有recycer侧滑删除分享,也有stickNavLayout,感觉不错

自定义控件_StickyNavLaout的更多相关文章

  1. android自定义控件一站式入门

    自定义控件 Android系统提供了一系列UI相关的类来帮助我们构造app的界面,以及完成交互的处理. 一般的,所有可以在窗口中被展示的UI对象类型,最终都是继承自View的类,这包括展示最终内容的非 ...

  2. ASP.NET MVC学习之母版页和自定义控件的使用

    一.母板页_Layout.cshtml类似于传统WebForm中的.master文件,起到页面整体框架重用的目地1.母板页代码预览 <!DOCTYPE html> <html> ...

  3. C# 自定义控件VS用户控件

    1 自定义控件与用户控件区别 WinForm中, 用户控件(User Control):继承自 UserControl,主要用于开发 Container 控件,Container控件可以添加其他Con ...

  4. 自定义控件之 圆形 / 圆角 ImageView

    一.问题在哪里? 问题来源于app开发中一个很常见的场景——用户头像要展示成圆的:       二.怎么搞? 机智的我,第一想法就是,切一张中间圆形透明.四周与底色相同.尺寸与头像相同的蒙板图片,盖在 ...

  5. 如何开发FineReport的自定义控件?

    FineReport作为插件化开发的报表软件,有些特殊需求的功能需要自己开发,开发的插件包帆软官方有提提供,可以去帆软论坛上找,本文将主要介绍如何开发一个自定义控件,这里讲讲方法论. 第一步:实例化一 ...

  6. WPF自定义控件第二 - 转盘按钮控件

    继之前那个控件,又做了一个原理差不多的控件.这个控件主要模仿百度贴吧WP版帖子浏览界面左下角那个弹出的按钮盘.希望对大家有帮助. 这个控件和之前的也差不多,为了不让大家白看,文章最后发干货. 由于这个 ...

  7. 【Win 10应用开发】AdaptiveTrigger在自定义控件中是可以触发的

    前些天,看到有网友给我留言,说AdaptiveTrigger在自定义控件(模板化控件)中不能触发.因为当时我正在写其他的代码,就没有去做实验来验证,于是我就给这位网友提了使用GotoVisualSta ...

  8. WPF自定义控件与样式(3)-TextBox & RichTextBox & PasswordBox样式、水印、Label标签、功能扩展

    一.前言.预览 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接. 本文主要是对文本 ...

  9. Android自定义控件之自定义ViewGroup实现标签云

    前言: 前面几篇讲了自定义控件绘制原理Android自定义控件之基本原理(一),自定义属性Android自定义控件之自定义属性(二),自定义组合控件Android自定义控件之自定义组合控件(三),常言 ...

随机推荐

  1. Linux命令-目录处理命令:pwd

    pwd 显示当前目录的绝对路径

  2. Oracle 客户端注册表字符集修改-----解决乱码 .

    本地ORACLE连接创建好后,默认是GBK的字符集,如果连接服务器不是同样的GBK字符集就会出现中文乱码的问题,这种情况我们需要修改本地的字符集来和服务器匹配. 通过注册表修改   HKEY_LOCA ...

  3. IOS性能调优系列:使用Allocation动态分析内存使用情况

    硬广:<IOS性能调优系列>第三篇,持续更新,欢迎关注. <IOS性能调优系列:Analyze静态分析>介绍了使用静态分析方法查找IOS内存泄漏的方法,<IOS性能调优系 ...

  4. [转]winform程序textbox滚动条保持在最下面 内容不闪烁

    在开发winform程序时,会用到textbox控件来显示信息,当把textbox的Multiline属性改为Ture时(即多行显示状态),ScrollBars属性改为Vertical(内容过多时,显 ...

  5. 解决:ubuntu 里文件夹带锁

    sudo chown -R <user-name> <folder-name> /* 其中-R的意思是recursive,你懂的,chown --help可以查看帮助信息 */ ...

  6. 利用eclipse的search功能搜索当前项目的源文件

    当你项目的源文件太多,文件组织结构太复杂的的时候,有时候希望google来帮你一把?给个关键字就把相关的搜索结果给出来? eclipse的search功能基本上就可以完成这个任务,文件搜索,甚至JAV ...

  7. mysql 使用 temp

    whereis 软件 检查数据库mysqlcheck -uroot -p --all-databases 修复$ mysql -uroot -p databasename REPAIR TABLE t ...

  8. java中高并发和高响应解决方法

    并发不高.任务执行时间长的业务要区分开看: 假如是业务时间长集中在I/O操作上,也就是I/O密集型的任务,因为I/O操作并不占用CPU,所以不要让所有的CPU闲下来,可以加大线程池中的线程数目,让CP ...

  9. Js常用插件介绍

    *各种JS功能介绍 1.zDialog.js 各种弹窗插件详细案例:http://www.2ky.cn/Pri_upfile/txdemo/0811/zDialog/zDialogDemo.html ...

  10. 一个性能较好的JVM参数配置(转)

    一个性能较好的web服务器jvm参数配置: -server//服务器模式-Xmx2g //JVM最大允许分配的堆内存,按需分配-Xms2g //JVM初始分配的堆内存,一般和Xmx配置成一样以避免每次 ...