关注我一、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. iOS开发:icon和启动图尺寸(转)

    转至:http://www.cnblogs.com/shaoting/p/4941634.html 歪果仁的总结: Asset iPhone 6s Plus and iPhone 6 Plus (@3 ...

  2. 计算机必知必会:进程process与线程thread 进程定义为一个正在运行的程序的实例

    http://www.nowamagic.net/librarys/veda/detail/1741进程和线程这对概念的理解也是很难的,至今网络上可查的资料对其的理解出入都挺大,在不同的操作系统中,如 ...

  3. IIS发布.net core mvc web站点

    这里只有操作步骤! 第一.查看IIS是否安装了 AspNetCoreModule,查看路径:IIS->模块 查看 安装步骤 下载网址:https://www.microsoft.com/net/ ...

  4. 扩展GeoServer数据源

    今天我们来讲讲怎么扩展GeoServer(简称GS)的数据源.大家都知道,GS支持多种数据源,而且都提供了友好的界面供操作.下面我们就来简单介绍一下,如何把自定义的数据源增加到GS中,让我们可以在统一 ...

  5. 峰值因子,峰均比,Reference Level

    峰值因子(CREST Factor,CF)与 峰均比( Peak-to-Average Ratio,PAR) 对于一个波形信号,在一段时间内信号幅度峰值比上信号幅度的有效值即为信号的峰值因子,它表征了 ...

  6. 批量修改图像的大小 Python PIL

    #-*-coding:utf-8-*- import os import os.path from PIL import Image import time def ResizeImage(filei ...

  7. Mysql中的算术运算符详解

    MySQL 支持的算术运算符包括加.减.乘.除和模运算.它们是最常使用.最简单的一类运算符.表4-1 列出了这些运算符及其作用. 下例中简单地描述了这几种运算符的使用方法: mysql> sel ...

  8. unity, access material

    MeshRenderer meshRenderer=gameObject.GetComponent<MeshRenderer>();                if(meshRende ...

  9. centos vsftp 500 OOPS: cannot change directory

    CentO中把vsftpd安裝配置好了,以為大功告成,但用FTP 登入出現下錯誤:500 OOPS: cannot change directoryCentOS系統安裝了SELinux,因為預設下是沒 ...

  10. Redis集群搭建问题汇总

    环境 centos7+redis3.2.12 redis requires Ruby version >= 2.2.2. redis官方提供了redis-trib.rb工具,但是在使用之前 需要 ...