居中滚动的scrollview

本文介绍了一种使用ScrollView和ListView结合实现焦点固定在中间滚动的实现方式,通过监听按键操作,动态调整焦点位置并触发滚动,避免了传统ListView滚动到边界的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们平时用的listview,scrollview都是在边界的时候滚动,可是我们某些时候可能需要把焦点固定在中间一行来进行滚动。

网上有很多这种实现,大多利用android的picker来实现,今天我们可以尝试另外一种实现思路,利用scrollview+listview来完成这种需求。

这里的demo只是监听了按键进行滚动,并没有监听手势。微笑

布局如下,在一个scrollview里面放一个linearlayout

 

<ScrollView
        android:id="@+id/scrollview"
        android:layout_width="400dp"
        android:layout_height="400dp"
        android:layout_marginBottom="10dp" 
        android:layout_marginTop="100dp"
        android:scrollbars="none">
        
        <LinearLayout
            android:id="@+id/list"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical" 
            android:gravity="center"/>
</ScrollView>

 

 

效果图如下,这时候listitem可以根据需要,在代码里面动态添加。

listitem布局如下

 

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/tv_w_item"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:ellipsize="marquee"    //跑马灯效果
    android:focusable="true"
    android:clickable="true"
    android:gravity="center"
    android:singleLine="true"
    android:textColor="#7b7b7b"
    android:textSize="20sp" />

 

 

 

下面这几行代码就可以把listitem动态的添加。

 

ListView = (LinearLayout) findViewById(R.id.list);
mScrollView = (ScrollView) findViewById (R.id.scrollview);
TextView view = (TextView)layoutInflater.inflate(R.layout.listitem, null);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 120);
mListView.addView(view, lp);
mViewItems.add(view);

 

上面的代码就可以简单的实现一个到边界滚动的scrollview。

 

为了让scrollview在焦点在中间的listitem就开始滚动,我们需要监听事件,并且判断当前焦点的位置。

这里的demo只是监听上下按键,

 

private View.OnKeyListener mOnKeyListener=new View.OnKeyListener() {
		
		@Override
		public boolean onKey(View arg0, int arg1, KeyEvent arg2) {
			switch(arg2.getAction()){
				case KeyEvent.ACTION_DOWN:
					 moveFocus(arg1,arg0);
					 break;
					 
			}
			return false;
		}
		
		private void moveFocus(int direction,View focus) {
			int index=findIndexInlist(((TextView)focus).getText().toString(), items);
			if(index<items.size()-1&&direction==KeyEvent.KEYCODE_DPAD_DOWN)//根据按键寻找下一个焦点
				mFocus=mViewItems.get(index+1);
			else if(index>0&&direction==KeyEvent.KEYCODE_DPAD_UP)
				mFocus=mViewItems.get(index-1);
			else
				mFocus=focus;
			focus.setSelected(false);
			mFocus.setSelected(true);
			int[] loc = new int[2];
			mScrollView.getLocationOnScreen(loc);   //获取scrollview的屏幕坐标

			int[] screenLocation = new int[2];
			mFocus.getLocationOnScreen(screenLocation);   //获取当前焦点的屏幕坐标
			
			int height = ((TextView)mFocus).getHeight();//获取listitem的高度
			
			if (screenLocation[1] < loc[1] + 2*height) {     //这里就可以自定义什么时候滚动,我这里是有5行,这样设置刚好到中间就滚动。
				mScrollView.scrollTo(0, mScrollView.getScrollY() - height);
			}
			if (screenLocation[1] > loc[1] + 2*height) {
				mScrollView.scrollTo(0, mScrollView.getScrollY() + height);
			}
		}
	};

 

 

 

 

 

这里也并没有实现循环滚动,假如有人需要的话,下一次再更新。大笑

 

 

 

### 配置垂直滚动ScrollView 组件 在移动应用开发中,ScrollView 是一种常用于实现垂直滚动内容的 UI 组件。它适用于内容高度超出屏幕可视区域的场景,例如长文本、表单或动态加载的内容。在使用 ScrollView 时,开发者可以通过配置组件属性来启用或限制垂直方向的滚动行为。 #### ScrollView 的垂直滚动配置 在 React Native 中,ScrollView 默认支持垂直滚动,但也可以通过设置 `scrollEnabled` 属性来控制是否启用滚动功能。若仅需要垂直滚动而禁用水平滚动,可以将 `horizontal` 属性设为 `false`,并保持默认的 `contentContainerStyle` 配置[^4]。例如: ```jsx <ScrollView scrollEnabled={true} horizontal={false} contentContainerStyle={{ paddingVertical: 20 }} > {this.renderContent()} </ScrollView> ``` 该配置确保 ScrollView 只在垂直方向上响应滚动事件,而不会在水平方向上产生滑动行为。 #### 嵌套滚动组件的处理 在某些情况下,ScrollView 内部可能包含其他可滚动组件(如 ListView 或 FlatList),此时需要处理滚动事件的优先级。如果 ListView 已经足够长并能填满整个 ScrollView 的视口,或者它是唯一需要滚动的内容,可以禁用 ScrollView 的垂直滚动,让 ListView 完全接管滚动事件。这种做法可以避免滚动冲突并提升用户体验[^1]: ```jsx <ScrollView scrollEnabled={false}> <ListView scrollEnabled={true} data={this.state.items} renderItem={this.renderItem} /> </ScrollView> ``` #### ScrollView 的内容控制与滚动行为优化 ScrollView 的内容显示由 `contentContainerStyle` 控制,开发者可以通过设置该属性来调整内容的内边距、对齐方式等。此外,可以通过 `bounces` 属性控制滚动到底部或顶部时是否具有弹性反弹效果,默认为 `true`。若希望禁用弹性滚动效果,可以将其设为 `false`[^4]: ```jsx <ScrollView bounces={false} contentContainerStyle={{ flexGrow: 1, justifyContent: 'center' }} > <Text>垂直滚动内容</Text> </ScrollView> ``` #### 滚动视图的嵌套结构与性能优化 在 ScrollView 中嵌套多个可滚动子组件时,需要注意性能优化。频繁的滚动事件处理可能导致界面卡顿,因此建议合理控制子组件的渲染逻辑,避免不必要的重绘。例如,在 React Native 中应优先使用 `FlatList` 替代 `ScrollView` 来展示长列表,以提升性能[^4]。 ### 相关问题 1. 如何在 ScrollView 中实现内容的垂直居中? 2. 在 Android 中如何实现 ScrollView 与 ViewPager 的联动滚动? 3. 如何在 Flutter 中实现类似 ScrollView 的垂直滚动功能? 4. ScrollView 滚动过程中如何优化图像加载性能? 5. 如何在 iOS 中实现 ScrollView 的弹性滚动效果?
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值