悬浮指示器布局-自定义控件

简介: 这是一个悬浮 【指示器 - 菜单】的控件容器,支持 上滑|下滑 的百分比进度跟踪,去掉了对 layout布局文件的依赖,去掉了对values 属性文件的依赖,由于这是第二次维护这个小demo了,以后会的多了,在改进。

这是一个悬浮 【指示器 - 菜单】的控件容器,支持 上滑|下滑 的百分比进度跟踪,去掉了对 layout布局文件的依赖,去掉了对values 属性文件的依赖,由于这是第二次维护这个小demo了,以后会的多了,在改进。。。

FloatTitleLayout.gif

核心代码如下

<pre>
/*处理滑动事件:开始*/
if (Math.abs(distanceX) > Math.abs(distanceY * 0.8)) {
/*上下滑动的 距离 表现不明显*/
return super.dispatchTouchEvent(event);
}
//KLog.e("isFloated = "+isFloated+" isChildOnTop = "+isChildOnTop);
/*非悬浮状态,向上滑动↓*/
if ((!isFloated) && (distanceY > 0)) {
/*非悬浮状态,向上滑动,速度过大↓*/
if (yVelocity < -yVelocityMax) {
int indicatorScrollDistanceCurr = 0;
/*非悬浮状态,向上滑动,速度过大,导航条在初始状态,直接将导航条,全部拖上去↓*/
if (paramsIvTopBackground.topMargin == 0) {
distanceY = titleHeight - ivTopBackground.getHeight();
indicatorScrollDistanceCurr = indicatorScrollDistanceMax;
} else {
/*非悬浮状态,向上滑动,速度过大,导航条不在初始状态,直接将导航条,全部拖上去↑*/
distanceY = -locationIndicatorYInScreen + titleHeight + statusHeight;
indicatorScrollDistanceCurr = indicatorScrollDistanceMax;
}
paramsIvTopBackground.topMargin = paramsIvTopBackground.topMargin + (int) distanceY;
ivTopBackground.setLayoutParams(paramsIvTopBackground);
updateScrollProgress(indicatorScrollDistanceCurr);
isFloated = true;
return true;
} else if (yVelocity >= -yVelocityMax) {
/*非悬浮状态,向上滑动,速度正常↓*/
if (titleHeight + statusHeight + distanceY > locationIndicatorYInScreen) {
distanceY = locationIndicatorYInScreen - titleHeight - statusHeight;
}
paramsIvTopBackground.topMargin = paramsIvTopBackground.topMargin - (int) distanceY;
ivTopBackground.setLayoutParams(paramsIvTopBackground);
/*计算后得到当前真实的 locationIndicatorYInScreen*/
int locationIndicatorYInScreenTrue = (locationIndicatorYInScreen - (int) distanceY);
int indicatorScrollDistanceCurr = ivTopBackground.getHeight() + statusHeight - locationIndicatorYInScreenTrue;
//KLog.e("计算后的 locationIndicatorYInScreen "+locationIndicatorYInScreenTrue+" indicatorScrollDistanceCurr = "+indicatorScrollDistanceCurr);
//KLog.e("背景图高度 = "+ivTopBackground.getHeight()+" locationIvTopBackgroundYInScreen = "+locationIvTopBackgroundYInScreen+" locationIndicatorYInScreen = " + locationIndicatorYInScreen + " statusHeight = " + statusHeight + " titleHeight = " + titleHeight+" distanceY = "+distanceY+" indicatorScrollDistanceMax = "+indicatorScrollDistanceMax);
updateScrollProgress(indicatorScrollDistanceCurr);
return true;
}
} else if ((!isFloated) && (distanceY < 0)) {
/*非悬浮状态,向下滑动 ↑*/
//&& isChildOnTop
int indicatorScrollDistanceCurr = 0;
if (locationIndicatorYInScreen == (ivTopBackground.getHeight() + statusHeight)) {
/*非悬浮状态,向下滑动 ,当前导航条在初始状态↑*/
return super.dispatchTouchEvent(event);
}
if (yVelocity > yVelocityMax) {
/*非悬浮状态,向下滑动,速度过大*/
indicatorScrollDistanceCurr = 0;
paramsIvTopBackground.topMargin = 0;
} else if (yVelocity < yVelocityMax) {
/*非悬浮状态,向下滑动 ,速度正常*/
//KLog.e("topMargin = "+paramsIvTopBackground.topMargin+" locationIndicatorYInScreen = "+locationIndicatorYInScreen+" distanceY = "+distanceY);
if ((locationIndicatorYInScreen - (int) distanceY) <= (ivTopBackground.getHeight() + statusHeight)) {
paramsIvTopBackground.topMargin = paramsIvTopBackground.topMargin - (int) distanceY;
indicatorScrollDistanceCurr = ivTopBackground.getHeight() + statusHeight - (locationIndicatorYInScreen - (int) distanceY);
} else {
paramsIvTopBackground.topMargin = 0;
indicatorScrollDistanceCurr = 0;
}
}
ivTopBackground.setLayoutParams(paramsIvTopBackground);
updateScrollProgress(indicatorScrollDistanceCurr);
return true;
} else if (isFloated && (distanceY < 0) && isChildOnTop) {
isFloated = false;
int indicatorScrollDistanceCurr = 0;
/*悬浮状态,向下滑动,ScrollView 展示第一条数据 ↑*/
if (yVelocity > yVelocityMax) {
/*悬浮状态,向下滑动,ScrollView 展示第一条数据 ,速度过大,直接将背景图,全部拖出来*/
indicatorScrollDistanceCurr = 0;
paramsIvTopBackground.topMargin = 0;
} else if (yVelocity <= yVelocityMax) {
/*悬浮状态,向下滑动,ScrollView 展示第一条数据 ,速度正常,将背景图,慢慢拖出来*/
//KLog.e("distanceY = "+distanceY+" locationIndicatorYInScreen = "+locationIndicatorYInScreen);
if ((locationIndicatorYInScreen - (int) distanceY) <= (ivTopBackground.getHeight() + statusHeight)) {
paramsIvTopBackground.topMargin = paramsIvTopBackground.topMargin - (int) distanceY;
indicatorScrollDistanceCurr = ivTopBackground.getHeight() + statusHeight - (locationIndicatorYInScreen - (int) distanceY);
} else {
paramsIvTopBackground.topMargin = ivTopBackground.getHeight() + statusHeight;
indicatorScrollDistanceCurr = indicatorScrollDistanceMax;
}
}
ivTopBackground.setLayoutParams(paramsIvTopBackground);
updateScrollProgress(indicatorScrollDistanceCurr);
}
/*处理滑动事件:结束*/
</pre>

此时此刻,很开心功能可以实现了,不用被鄙视了。

国际惯例 附上源码

<a href="https://github.com/Alex-Cin/FloatIndicatorLayout">https://github.com/Alex-Cin/FloatIndicatorLayout</a>

apk 地址

目录
相关文章
|
6月前
|
开发框架 数据可视化 C#
|
前端开发 Linux 程序员
「HTML+CSS」--自定义按钮样式【001】
「HTML+CSS」--自定义按钮样式【001】
334 0
|
前端开发 Linux 程序员
「HTML+CSS」--自定义按钮样式【004】
「HTML+CSS」--自定义按钮样式【004】
514 0
|
前端开发 Linux 程序员
「HTML+CSS」--自定义按钮样式【003】
「HTML+CSS」--自定义按钮样式【003】
128 0
|
前端开发 Linux 程序员
「HTML+CSS」--自定义按钮样式【002】
「HTML+CSS」--自定义按钮样式【002】
123 0
|
C#
【WPF】使用Popup控件做浮窗/提示框
原文:【WPF】使用Popup控件做浮窗/提示框 需求:当鼠标移入某个区域时,弹出一个浮窗,以便用户进行下一步操作。 效果如下图: 当鼠标移入左上角的【多选显示】框内,出现下面的浮窗(悬浮在原UI之上)。
4497 0
Qt无边框窗口拖拽和阴影
无边框窗口的实现
453 0
Qt无边框窗口拖拽和阴影
淡入淡出垂直选项卡
在线演示       本地下载
785 0
|
Android开发
Android 自定义控件之SlidingMenuVertical顶部悬浮(垂直折叠抽屉,有滑动渐变回调,可自行添加渐变动画)
顶部悬浮(垂直折叠抽屉,有滑动渐变回调,可自行添加渐变动画)
2087 0
|
C#
WPF 圆角输入框
原文:WPF 圆角输入框 今天打算来做一个圆角的输入框 默认输入框:   这个输入框不好看,并且在XP 跟 WIN 7  WIN10 效果 都不太一样   我们今天不用模板的方式,而是 最简单的方式 来实现 圆角 输入框;     ------------------------...
1388 0