ScrollView简单自动滚动问题总结

今天参考网上的资料写了一个简单的动画,刚开始的时候,确实困难重重:

1、当我们在Activity里面获得View对象的时候,无论是getMeasuredHeight()还是getHehgit()方法(放在Activity里的onCreate,onStart,onResum),返回值一律为零。

2、无法使ScrollView的内容从最底部开始向上滑动(一开始ScrollView为空白,但是内容由下向上慢慢上移)

3、对ScrollView的scrollBy与scrollTo方法区别不是太熟悉;

在网上查询资料:

1. 在一个类初始化时,即在构造函数当中是得不到View的实际大小的(这个我测试过,的确)。大家可以试试,getWidth()和getMeasuredWidth()得到的结果都是0,但是可以从onDraw()方法或者dispatchDraw()方法里面获得。可以通过调用invalidate()来执行onDraw()和dispatchDraw()方法。

2. 这两个方法所得到的结果的单位是像素即pixel

getWidth(): View在设定好布局后,整个View的宽度

getMeasuredWidth():对View上的内容进行测量后得到的View内容占据的宽度。前提是你必须在父布局的onLayout()方法或者此View的onDraw()方法里调用measure(0,0);(measure参数的值可以知己定义),否则得到的结果和getWidth()得到的结果是一样的。

这两个方法最主要的区别在于,是否使用了measure()方法,同时measure()使用的位置也很重要。

getHeight() 和 get MeasuredHeight() 区别同理。




经过我的测试(不知道有没有别的方法),ScrollView是不能开始就显示在最底层的,只能在最上面添加一个控件,这里我添加了一个TextView空的空间,这样在开始显示的ScrollView的时候,是空的,感觉是内容慢慢开始向上移动




 scrollTo() 是直接指定滚动条的位置, 但是由于这个动作不是单纯关于 ScrollView 而已, 还要根据 ScrollView 里面包含的View 的实际信息. 所以这动作必须在页面加载完成以后才能执行.    在Activity 初始化过程中, 要指定滚动条位置, 必须用下面的代码

sView.post(new Runnable() {
    @Override
    public void run() {
        sView.scrollTo(sViewX, sViewY);
    } 
});


滚动代码如下:

public class MainActivity extends Activity {
	private final Handler mHandler = new Handler();

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		iniHolder();
	}

	private void iniHolder() {
		Holder.scroll = (ScrollView) findViewById(R.id.sv_scroll);
		Holder.mlayout = (LinearLayout) findViewById(R.id.l_test);
		Holder.tv_null = (TextView) findViewById(R.id.tv_null);
		Holder.tv_null.setHeight(getWindowManager().getDefaultDisplay()
				.getHeight() - 50);
	}

	@Override
	protected void onResume() {
		super.onResume();
		System.out.println(Holder.mlayout.getMeasuredHeight() + ":"
				+ Holder.scroll.getHeight());
		Holder.scroll.post(ScrollRunnable);
	}

	private Runnable ScrollRunnable = new Runnable() {
		@Override
		public void run() {
			int off = Holder.mlayout.getMeasuredHeight()
					- Holder.scroll.getHeight();// 判断高度,ScrollView的最大高度,就是屏幕的高度
			if (off > 0) {
				Holder.scroll.scrollBy(0, 2);
				if (Holder.scroll.getScrollY() == off) {
					Thread.currentThread().interrupt();
				} else {
					mHandler.postDelayed(this, 10);
				}
			}
		}
	};

	static class Holder {
		static ScrollView scroll;
		static LinearLayout mlayout;
		static TextView tv_null;
	}
}



### 回答1: Unity ScrollView可以通过编写代码实现自动滚动。可以使用以下代码: ```csharp public class AutoScrollView : MonoBehaviour { public float scrollSpeed = 1.f; public RectTransform content; private bool isScrolling = false; void Start() { StartCoroutine(ScrollContent()); } IEnumerator ScrollContent() { while (true) { if (isScrolling) { content.anchoredPosition += Vector2.up * scrollSpeed * Time.deltaTime; } yield return null; } } public void StartScrolling() { isScrolling = true; } public void StopScrolling() { isScrolling = false; } } ``` 这个脚本可以将ScrollView的内容向上滚动。可以通过调整scrollSpeed的值来控制滚动速度。在StartScrolling()方法中设置isScrolling为true,就可以开始自动滚动。在StopScrolling()方法中设置isScrolling为false,就可以停止自动滚动。 ### 回答2: 在Unity中,ScrollView组件允许用户滑动一个容器内的子对象。ScrollView可以手动滑动,也可以通过代码实现自动滚动。 要实现ScrollView自动滚动,需要在代码中使用协程和Lerp。协程是一种特殊的函数,可以在一段间内等待执行另一个任务。Lerp函数是一种插值函数,可以使用线性插值来获得两个值之间的中间值。 实现自动滚动的步骤如下: 1.获取ScrollView组件和容器RectTransform ScrollView scrollView = GetComponent<ScrollView>(); RectTransform container = scrollView.content; 2.计算目标滚动位置 float targetPosition = container.anchoredPosition.y - scrollSpeed; //scrollSpeed是滚动速度,在代码中定义 3.使用协程实现滚动 //定义协程函数 IEnumerator ScrollCoroutine(float targetPosition) { Vector2 startPosition = container.anchoredPosition; float elapsedTime = 0f; while (elapsedTime < scrollDuration) { elapsedTime += Time.deltaTime; float t = Mathf.Clamp01(elapsedTime / scrollDuration); container.anchoredPosition = Vector2.Lerp(startPosition, new Vector2(startPosition.x, targetPosition), t); yield return null; } } //调用协程函数 StartCoroutine(ScrollCoroutine(targetPosition)); 4.将以上步骤封装成函数 void AutoScroll(float scrollSpeed, float scrollDuration) { float targetPosition = container.anchoredPosition.y - scrollSpeed; StartCoroutine(ScrollCoroutine(targetPosition, scrollDuration)); } 通过这种方式,就可以在代码中实现自动滚动ScrollView。可以通过调整滚动速度和滚动间来控制自动滚动的速度和持续间。 ### 回答3: Unity中的ScrollView是非常常用的UI控件之一。它可以让玩家在屏幕上滑动内容,从而使得内容看起来更加丰富多样。然而,在一些情况下,我们希望ScrollView能够自动滚动,比如,当玩家打开一个页面后,ScrollView自动向下滚动几秒钟,然后停止在某个位置。这,我们可以使用Unity中的协程来实现这一功能。具体实现流程如下: 1. 首先,在Unity中创建一个ScrollView,给它添加一个RectTransform组件。在Rect Transform组件中,设置它的锚点和位置,使其适应屏幕。 2. 在ScrollView的Content中添加需要显示的UI元素。 3. 创建一个C#脚本,将其添加到ScrollView的GameObject中。 4. 在脚本中添加如下代码: ``` IEnumerator Scroll() { yield return new WaitForSeconds(3f); // 等待3秒钟 while (true) { yield return new WaitForSeconds(0.05f); // 每0.05秒钟滚动一次 scrollView.verticalNormalizedPosition = Mathf.MoveTowards(scrollView.verticalNormalizedPosition, 0.5f, Time.deltaTime); // 滚动ScrollView } } ``` 5. 在Start()函数中启动这个协程。 ``` void Start() { StartCoroutine(Scroll()); } ``` 这ScrollView自动滚动并且停止在位置0.5处。如果需要滚动到其他位置,只需要将0.5f替换成相应的位置即可。如果需要停止滚动,只需要在相应位置添加代码break即可。 需要注意的是,在使用自动滚动候,尽量不要让玩家手动触碰屏幕,因为这会打断自动滚动效果。当玩家再次手动触碰屏幕,我们可以通过代码中的break语句来停止自动滚动
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT人.阿标

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值