如何通过所需的像素值检测 ScrollView 滚动
How to detect ScrollView scroll by desired pixel value
我正在扩展 ScrollView 以检测它是向上滚动还是向下滚动。我想添加选项以仅在滚动 50 像素时检测滚动。怎么做?我当前的滚动视图代码覆盖 onScrollChanged:
public interface OnDetectScrollListener {
void onUpScroll();
void onDownScroll();
}
public class MyScrollView extends ScrollView {
private OnDetectScrollListener onDetectScrollListener = null;
private boolean scrollDown = false;
private boolean scrollUp = false;
.... constructors ....
public void setOnDetectScrollListener(OnDetectScrollListener scrollViewListener) {
this.onDetectScrollListener = scrollViewListener;
}
@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
super.onScrollChanged(l, t, oldl, oldt);
if (onDetectScrollListener != null) {
View view = (View) getChildAt(getChildCount() - 1);
int diff = (view.getBottom() - (getHeight() + getScrollY()));
//scroll down
if(t > oldt){
if(!scrollDown & oldt >= 0 & t >= 0){
scrollDown = true;
scrollUp = false;
onDetectScrollListener.onDownScroll();
}
}
//scroll up
else if(t < oldt & diff > 0){
if(!scrollUp){
scrollUp = true;
scrollDown = false;
onDetectScrollListener.onUpScroll();
}
}
}
}
}
我在ScrollView
方面经验不多,但你可以这样做:
如果您想要的是仅在 50 像素后开始滚动,您可以遵循以下逻辑:
bool scrolling = false;
int scrollX = -1;
int scrollY = -1;
protected void scroll(int x, int y)
{
//View was not scrolling
if (scrollX == -1)
{
//Save starting point
scrollX = x;
}
//View keeps scrolling
else
{
//User is touching 50 pixels left from starting point
if (x -scrollX > 50)
{
scrolling = true;
} else
//User is touching 50 pixels right from starting point
if (scrollX -x > 50)
{
scrolling = true;
}
}
if (scrolling)
{
/* Your code */
}
}
我不确定你的 onScrollView
上的 l 或 t 是 x 还是 y(我从未接触过它),但你可以按自己的方式实现它。
随意为向左滚动和向右滚动创建单独的变量(或 up/down)。
请避免使用像素,尤其是输入。更喜欢使用与密度无关的像素 (dp)。更多信息 here (Supporting Multiple Screens.
我正在扩展 ScrollView 以检测它是向上滚动还是向下滚动。我想添加选项以仅在滚动 50 像素时检测滚动。怎么做?我当前的滚动视图代码覆盖 onScrollChanged:
public interface OnDetectScrollListener {
void onUpScroll();
void onDownScroll();
}
public class MyScrollView extends ScrollView {
private OnDetectScrollListener onDetectScrollListener = null;
private boolean scrollDown = false;
private boolean scrollUp = false;
.... constructors ....
public void setOnDetectScrollListener(OnDetectScrollListener scrollViewListener) {
this.onDetectScrollListener = scrollViewListener;
}
@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
super.onScrollChanged(l, t, oldl, oldt);
if (onDetectScrollListener != null) {
View view = (View) getChildAt(getChildCount() - 1);
int diff = (view.getBottom() - (getHeight() + getScrollY()));
//scroll down
if(t > oldt){
if(!scrollDown & oldt >= 0 & t >= 0){
scrollDown = true;
scrollUp = false;
onDetectScrollListener.onDownScroll();
}
}
//scroll up
else if(t < oldt & diff > 0){
if(!scrollUp){
scrollUp = true;
scrollDown = false;
onDetectScrollListener.onUpScroll();
}
}
}
}
}
我在ScrollView
方面经验不多,但你可以这样做:
如果您想要的是仅在 50 像素后开始滚动,您可以遵循以下逻辑:
bool scrolling = false;
int scrollX = -1;
int scrollY = -1;
protected void scroll(int x, int y)
{
//View was not scrolling
if (scrollX == -1)
{
//Save starting point
scrollX = x;
}
//View keeps scrolling
else
{
//User is touching 50 pixels left from starting point
if (x -scrollX > 50)
{
scrolling = true;
} else
//User is touching 50 pixels right from starting point
if (scrollX -x > 50)
{
scrolling = true;
}
}
if (scrolling)
{
/* Your code */
}
}
我不确定你的 onScrollView
上的 l 或 t 是 x 还是 y(我从未接触过它),但你可以按自己的方式实现它。
随意为向左滚动和向右滚动创建单独的变量(或 up/down)。
请避免使用像素,尤其是输入。更喜欢使用与密度无关的像素 (dp)。更多信息 here (Supporting Multiple Screens.