7

我想更改布局的位置,并在 75 毫秒后将其返回到第一个位置以进行移动,这就是我的代码:

for(int i = 0; i < l1.getChildCount(); i++) {  
    linear = (LinearLayout) findViewById(l1.getChildAt(i).getId());  
    LayoutParams params = new LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,RelativeLayout.LayoutParams.WRAP_CONTENT);  
    params.bottomMargin = 10;  
    linear.setLayoutParams(params);  
    SystemClock.sleep(75);
}   

问题是应用程序停止了 750 毫秒并且不执行任何操作。我尝试 了invalidate(), refreshDrawableState(), requestLayout(), postInvalidate(), 并尝试调用onResume(), onRestart(), onPause().

4

4 回答 4

22

也许你需要:

linear.invalidate();
linear.requestLayout();

进行布局更改后。

编辑:

在不同的线程上运行代码:

new Thread() {
    @Override
    public void run() {
        <your code here>
    }
}.start();

每当您需要从该线程更新 UI 时,请使用:

activity.runOnUiThread(new Runnable() {
    @Override
    public void run() {
        <code to change UI>
    }
});
于 2013-08-27T16:47:13.367 回答
2

经过几个小时的测试,我找到了更新视图的解决方案,如果您对这些视图进行操作,例如添加子视图、可见性、旋转等。

我们需要使用以下方法强制更新视图。

linearSliderDots.post {
        // here linearSliderDots is a linear layout &
        // I made add & remove view option on runtime
        linearSliderDots.invalidate()
        linearSliderDots.requestLayout()
    }
于 2020-09-17T05:01:06.660 回答
0

您应该尝试使用 ValueAnimator(或对象动画师),以下代码在 kotlin 中,但相同的逻辑将应用于 java:

val childCount = someView.childCount
    val animators = mutableListOf<ValueAnimator>()
    for (i in 0..childCount) {
        val child = (someView.getChildAt(i))
        val animator = ValueAnimator.ofInt(0, 75)
        animator.addUpdateListener {
            val curValue = it.animatedValue as Int
            (child.layoutParams as ViewGroup.MarginLayoutParams).bottomMargin = curValue
            child.requestLayout()
        }
        animator.duration = 75
        animator.startDelay = 75L * i
        animators.add(animator)
    }
    animators.forEach { animator ->
        animator.start()
    }

基本上你创建了一堆动画,它们的启动延迟与孩子的数量成正比,所以一旦一个动画结束,新的动画就会开始

于 2019-05-13T23:46:17.913 回答
-1
ActivityName.this.runOnUiThread(new Runnable() {
    @Override
    public void run() {
        <code to change UI>
    }
});
于 2018-08-31T07:20:45.343 回答