强制布局刷新/重绘android?

时间:2013-08-27 16:19:03

标签: android layout refresh

我想改变布局的位置,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()

4 个答案:

答案 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()
    }