自定义控件_StickyNavLaout
关注我一、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来完成下划线
文章,这篇也是写关于stickNavLayout,希望大家能得以帮助,都是关于ViewPager中嵌套垂直滚动, CoordinatorLayout配合AppBarLayout,Toolbar和TabLayout的使用 ,自己总结关于CoordinatorLayout这个gitHub上面有recycer侧滑删除分享,也有stickNavLayout,感觉不错
自定义控件_StickyNavLaout的更多相关文章
- android自定义控件一站式入门
自定义控件 Android系统提供了一系列UI相关的类来帮助我们构造app的界面,以及完成交互的处理. 一般的,所有可以在窗口中被展示的UI对象类型,最终都是继承自View的类,这包括展示最终内容的非 ...
- ASP.NET MVC学习之母版页和自定义控件的使用
一.母板页_Layout.cshtml类似于传统WebForm中的.master文件,起到页面整体框架重用的目地1.母板页代码预览 <!DOCTYPE html> <html> ...
- C# 自定义控件VS用户控件
1 自定义控件与用户控件区别 WinForm中, 用户控件(User Control):继承自 UserControl,主要用于开发 Container 控件,Container控件可以添加其他Con ...
- 自定义控件之 圆形 / 圆角 ImageView
一.问题在哪里? 问题来源于app开发中一个很常见的场景——用户头像要展示成圆的: 二.怎么搞? 机智的我,第一想法就是,切一张中间圆形透明.四周与底色相同.尺寸与头像相同的蒙板图片,盖在 ...
- 如何开发FineReport的自定义控件?
FineReport作为插件化开发的报表软件,有些特殊需求的功能需要自己开发,开发的插件包帆软官方有提提供,可以去帆软论坛上找,本文将主要介绍如何开发一个自定义控件,这里讲讲方法论. 第一步:实例化一 ...
- WPF自定义控件第二 - 转盘按钮控件
继之前那个控件,又做了一个原理差不多的控件.这个控件主要模仿百度贴吧WP版帖子浏览界面左下角那个弹出的按钮盘.希望对大家有帮助. 这个控件和之前的也差不多,为了不让大家白看,文章最后发干货. 由于这个 ...
- 【Win 10应用开发】AdaptiveTrigger在自定义控件中是可以触发的
前些天,看到有网友给我留言,说AdaptiveTrigger在自定义控件(模板化控件)中不能触发.因为当时我正在写其他的代码,就没有去做实验来验证,于是我就给这位网友提了使用GotoVisualSta ...
- WPF自定义控件与样式(3)-TextBox & RichTextBox & PasswordBox样式、水印、Label标签、功能扩展
一.前言.预览 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接. 本文主要是对文本 ...
- Android自定义控件之自定义ViewGroup实现标签云
前言: 前面几篇讲了自定义控件绘制原理Android自定义控件之基本原理(一),自定义属性Android自定义控件之自定义属性(二),自定义组合控件Android自定义控件之自定义组合控件(三),常言 ...
随机推荐
- javascript通用函数库
/* -------------- 函数检索 -------------- trim函数: trim() lTrim() rTrim() 校验字符串是否 ...
- Python多线程1:threading
threading模块提供了高级别的线程接口,基于低级别的_thread模块实现. 模块基本方法 该模块定了的方法例如以下: threading.active_count() 返回当前 ...
- C#位操作
一.原码与补码 在计算机系统中,数值一律用补码来存储(表示).主要原因:使用补码,可以将符号位和其他位统一处理:同时减法也可按加法来处理.另外,两个补码表示的数相加时,如果最高位(符号位)有进位,则进 ...
- 安卓编译报错:Dex Loader] Unable to execute dex: java.nio.BufferOverflowException. Check the Eclipse log for stack trace.
今天在编译别人的project时遇到了这个错误,心想应该不是代码的问题.网上搜了一下,应该是sdk版本设置的问题,要设置为最新sdk版本才可以. 解决办法就是修改project.properties里 ...
- Spring Cloud 模块简介
Spring Cloud Netflix对微服务的支持还有: Hystrix: 断路器和资源隔离 Feign: 声明式HTTP REST请求客户端 Ribbon: 与Eureka结合实现软负载均衡 Z ...
- JStorm环境搭建
开始JStorm学习之前需要搭建集群环境,这里演示搭建单机JStorm环境,仅供学习使用,生产环境部署大同小异,但建议参考JStorm社区及相关说明文档. 一.前提 JStorm核心代码均用Java实 ...
- 雅虎天气API调用
雅虎天气API调用: 1.调用方法:http://weather.yahooapis.com/forecastrss?w=2502265&u=c,绿色字体为城市代号,u=c表示取摄氏度. 2. ...
- xUtils工具实现下载功能
private String download_url="http://192.168.2.8:80/DownZip/*****.zip";//下载的路径 public Stri ...
- mysql 索引 大于等于 走不走索引 最左前缀
你可以认为联合索引是闯关游戏的设计 例如你这个联合索引是state/city/zipCode 那么state就是第一关 city是第二关, zipCode就是第三关 你必须匹配了第一关,才能匹配第二关 ...
- LinQ的简单使用
1.LinQ to Sql类(NET Language Integrated Query (LINQ) ) LINQ定义了大约40个查询操作符,如select.from.in.where以及order ...