关注我一、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. 复制Map对象:Map.putAll方法

    复制Map对象:Map.putAll方法 Map.putAll方法可以追加另一个Map对象到当前Map集合 package xmu.sxl; import java.util.HashMap; imp ...

  2. 怎样给ExecutorService异步计算设置超时

    ExecutorService接口使用submit方法会返回一个Future<V>对象.Future表示异步计算的结果.它提供了检查计算是否完毕的方法,以等待计算的完毕,并获取计算的结果. ...

  3. REST开放接口生成文档工具之apidoc

    一.安装node.js环境 感谢阿里云,下载的链接http://npm.taobao.org/mirrors/node/latest-v6.x/ 二.安装apidoc npm install apid ...

  4. HDU 5186 zhx&#39;s submissions (进制转换)

    Problem Description As one of the most powerful brushes, zhx submits a lot of code on many oj and mo ...

  5. C++ 资源管理之 RAII

    RAII,它是“Resource Acquisition Is Initialization”的首字母缩写.也称为“资源获取就是初始化”,是c++等编程语言常用的管理资源.避免内存泄露的方法.它保证在 ...

  6. Ubuntu快捷键截图

    gnome-screenshot #全屏截图 gnome-screenshot -a #区域截图 在设置-键盘-快捷键-自定义快捷键中添加这个指令,创建快捷键. 注:我本人是在VBox里装的Ubunt ...

  7. js操作cookie的一些注意项

     这两天做购物车逻辑.依照通常的做法,把预购信息存放在cookie里,结果发生了非常多不可理喻的事情,完整的证明了我对cookie的无知. . . 这么多年.非常少用cookie,由于认为它不安全 ...

  8. Away3D引擎学习笔记(三)模型拾取(翻译)

    原文详见http://away3d.com/tutorials/Introduction_to_Mouse_Picking.本文若有翻译不对的地方,敬请指出. 本教程详细介绍了Away3D 4.x中鼠 ...

  9. CLoadScene类

    #ifndef __LOADSCENE_H__ #define __LOADSCENE_H__ #include "GameFrameHead.h" class CGameScen ...

  10. 基于js白色简洁样式计算器

    今天给大家分享一款白色简洁样式计算器JS代码是一款精美简洁计算器JS代码插件网页特效,软件应用,后台应用JS计算器插件代码免费下载.适用浏览器:360.FireFox.Chrome.Safari.Op ...