0

我想在每滚动 50 像素后添加新的子视图,但该语句Log.d("scroll",scrollY+":"+oldScrollY);缺少一些值scrollY = 149,即scrollY = 151存在LogscrollY = 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++;
                }
            }
        });
    }
}

提前致谢。

4

1 回答 1

0

Android 不会渲染滚动中的每个像素,因为这会影响性能。如果滚动速度非常慢,您会看到每个像素都会调用回调,但如果滚动速度很快,则会在渲染触发时调用它。

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

于 2017-11-06T12:45:10.617 回答