在 ScrollView 上滚动的每个像素都不会调用 onScrollChange()

onScrollChange() is not being called for every pixel scrolled on ScrollView

我想在每滚动 50 个像素后添加新的子视图,但是语句 Log.d("scroll",scrollY+":"+oldScrollY); 缺少一些值,即 scrollY = 149scrollY = 151Log 中,但缺少 scrollY = 150。因此代码不会 运行 scrollY = 150 并且不会添加新的子视图。

虽然它对 scrollY 的大多数值都正常工作,但对于 scrollY 的少数值,事件没有被触发。

我该如何解决这个问题?或者有没有其他方法可以实现。

public class MainActivity extends AppCompatActivity implements ScrollViewListener {

    RelativeLayout parent;
    TextView height;
    ObservableScrollView scrollView;
    int position=1;
    View view1,view2;

    @RequiresApi(api = Build.VERSION_CODES.M)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        parent = (RelativeLayout) findViewById(R.id.parent);
        scrollView = (ObservableScrollView) findViewById(R.id.scroll_view);

        LayoutInflater inflater = LayoutInflater.from(this);
        view1 = inflater.inflate(R.layout.education,null, false);
        view1.setId(R.id.parent+position);

        RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
                                                                             ViewGroup.LayoutParams.WRAP_CONTENT);
        params.addRule(RelativeLayout.LEFT_OF,R.id.divider);
        params.topMargin = 100;
        params.rightMargin = 3;
        parent.addView(view1, params);
        position++;

        final Animation leftAnimation = new TranslateAnimation(view1.getX()-50,view1.getX(),view1.getY()+100,view1.getY());
        leftAnimation.setDuration(1000);
        view1.setAnimation(leftAnimation);

        scrollView.setOnScrollChangeListener(new View.OnScrollChangeListener() {
            @Override
            public void onScrollChange(View view, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
                Log.d("scroll",scrollY+":"+oldScrollY);
                if((scrollY-oldScrollY)>0 && scrollY%50 == 0)
                {
                    Log.d("scroll","abcghfg");

                    if(position%2==0)
                    {
                        RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
                                ViewGroup.LayoutParams.WRAP_CONTENT);
                        params.addRule(RelativeLayout.RIGHT_OF,R.id.divider);
                       // params.topMargin = (position-1)*(view1.getLayoutParams().height)+position*100;
                        params.topMargin = 30;
                        params.leftMargin = 3;
                        params.addRule(RelativeLayout.BELOW,parent.getChildAt(position-1).getId());
                        Log.d("scroll","abc");
                        view2 = LayoutInflater.from(MainActivity.this).inflate(R.layout.education,null,false);
                        view2.setId(R.id.parent+position);

                        Animation rightAimation = new TranslateAnimation(view2.getX()+50,view2.getX(),view2.getY()+100,view2.getY());
                        rightAimation.setDuration(1000);
                        view2.startAnimation(rightAimation);

                        parent.addView(view2, params);
                    }
                    else
                    {
                        RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
                                ViewGroup.LayoutParams.WRAP_CONTENT);
                        params.addRule(RelativeLayout.LEFT_OF,R.id.divider);
                        //params.topMargin = (position-1)*(view1.getLayoutParams().height)+position*100;
                        params.topMargin = 30;
                        params.rightMargin = 3;
                        params.addRule(RelativeLayout.BELOW,parent.getChildAt(position-1).getId());
                        Log.d("scroll","def");
                        view2 = LayoutInflater.from(MainActivity.this).inflate(R.layout.education,null,false);
                        view2.setId(R.id.parent+position);

                        Animation animation = new TranslateAnimation(view2.getX()-50,view2.getX(),view2.getY()+100,view2.getY());
                        animation.setDuration(1000);
                        view2.startAnimation(animation);

                        parent.addView(view2, params);
                    }
                    position++;
                }
            }
        });
    }
}

提前致谢。

Android 不会渲染滚动中的每个像素,因为这对性能不利。如果你滚动得非常慢,你会看到你的回调会为每个像素调用,但如果你滚动得很快,它会在渲染触发时调用。

在您的情况下,您需要检查自上次渲染最后一个视图以来它是否渲染了 50 个或更多像素。