简体   繁体   English

以编程方式滚动 ScrollView 以专注于按钮或视图 - Android

[英]Programmatically scroll a ScrollView to focus on a Button or a view - Android

I have an Activity that has a ScrollView of 125 buttons.我有一个包含 125 个按钮的ScrollView的活动。 The 125 buttons are Levels in my game that slowly get unlocked (think of Candy Crush Saga). 125 个按钮是我游戏中慢慢解锁的关卡(想想 Candy Crush Saga)。 Right now if the user is on the level, let's say, 88 of 125 then the user has to manually scroll all the way down to button 88.现在,如果用户在级别上,比如说,125 个中的 88 个,那么用户必须手动一直向下滚动到按钮 88。

My question is, how would I make it so that when the Activity loads, it automatically scrolls down and centers the ScrollView on a certain button?我的问题是,我将如何使它在 Activity 加载时自动向下滚动并将 ScrollView 居中放置在某个按钮上?

Below is my code of how the buttons are created and populated programmatically.下面是我如何以编程方式创建和填充按钮的代码。

ScrollView scrollView;

@Override
public void onCreate(Bundle savedInstanceState) {


    LinearLayout lay = (LinearLayout)findViewById(R.id.linearlayout);

    for(int i = 0; i < 125; i++) {

        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 0);
        params.weight = 1;
        params.gravity = Gravity.CENTER;

        if(i == 0) {
            TextView textview = new TextView(this);
            textview.setLayoutParams(params);
            textview.setTextSize(15);
            textview.setText(c.getResources().getString(R.string.l1to5));

            TextView textview2 = new TextView(this);
            textview2.setLayoutParams(params);
            textview.setTextSize(15);
            textview2.setText(c.getResources().getString(R.string.goal100));

            TextView textview3 = new TextView(this);
            textview3.setLayoutParams(params);
            textview.setTextSize(15);
            textview3.setText(c.getResources().getString(R.string.catRandom));

            if((getResources().getConfiguration().screenLayout & 
                Configuration.SCREENLAYOUT_SIZE_MASK) == 
                Configuration.SCREENLAYOUT_SIZE_LARGE) {
                    textview.setTextSize(22);
                    textview2.setTextSize(22);
                    textview3.setTextSize(22);
            } else if((getResources().getConfiguration().screenLayout & 
                Configuration.SCREENLAYOUT_SIZE_MASK) == 
                Configuration.SCREENLAYOUT_SIZE_XLARGE) {
                    textview.setTextSize(22);
                    textview2.setTextSize(22);
                    textview3.setTextSize(22);
            }

            lay.addView(textview);
            lay.addView(textview2);
            lay.addView(textview3);     

            View ruler = new View(this);
            ruler.setBackgroundColor(0xFFC2BEBF);
            lay.addView(ruler, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 2));
        }

        if(i == 5) {

 //  ....

}



        Button button = new Button(this);
        int _id = getResources().getIdentifier("b" + (i + 1), "id", this.getPackageName());
        button.setTag(_id);
        button.setLayoutParams(params);

        if((getResources().getConfiguration().screenLayout & 
            Configuration.SCREENLAYOUT_SIZE_MASK) == 
            Configuration.SCREENLAYOUT_SIZE_LARGE) {
                button.setTextSize(22);
        } else if((getResources().getConfiguration().screenLayout & 
            Configuration.SCREENLAYOUT_SIZE_MASK) == 
            Configuration.SCREENLAYOUT_SIZE_XLARGE) {
                button.setTextSize(22);
        }

        button.setText("Level " + (i + 1));
        final int x = i + 1;
        button.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                singleton.setLevelJustPlayed(x);
                // ...
                } else {
                 // ...
                    Intent intent = new Intent(Levels.this, Categories.class);
                    startActivity(intent);
                }
            }
        });

        lay.addView(button);

        if(singleton.getLevel() >= (i + 1)) {
            button.setEnabled(true);
        } else {
            button.setEnabled(false);
        }
    }
// end the onCreate() method

尝试

yourScrollView.scrollTo(0, (int) button.getY());

对于 Kotlin 用户


your_scrollview.post( { your_scrollview.scrollTo(0, your_view_inside_SV.getY().toInt()) })

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM