我想改变布局的位置,75ms后将其返回到第一个位置进行移动,这就是我的代码:
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()
。
答案 0 :(得分:17)
也许你需要:
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>
}
});
答案 1 :(得分:0)
ActivityName.this.runOnUiThread(new Runnable() {
@Override
public void run() {
<code to change UI>
}
});
答案 2 :(得分: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()
}
基本上,您创建了一堆动画制作器,这些动画制作器的开始延迟与子代数成正比,因此,一旦一个动画结束,新的动画就会开始
答案 3 :(得分:0)
经过几个小时的测试,如果您使用这些视图进行操作(例如添加子项,可见性,旋转等),我发现了一种更新视图的解决方案。
我们需要使用以下方法强制更新视图。
linearSliderDots.post {
// here linearSliderDots is a linear layout &
// I made add & remove view option on runtime
linearSliderDots.invalidate()
linearSliderDots.requestLayout()
}