Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/210.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何强制视图组脱离屏幕?_Android - Fatal编程技术网

Android 如何强制视图组脱离屏幕?

Android 如何强制视图组脱离屏幕?,android,Android,我有几个线性布局,在滚动视图中填充下载的图像或文本。线性布局具有应用于它们的LayoutImation,因此在绘制时每个布局都“滑动”到位。有没有办法强制屏幕外的线性布局进行绘制,以便在用户滚动到它们时,动画已经完成?我尝试过这样测量每个视图:(容器是视图组) 但是它们在滚动时出现在屏幕上之前仍然不会绘制(通常情况下这很好,但动画会使它……呃,不好)如果您不想运行动画,为什么不干脆删除动画?框架将应用动画,因为您告诉它 还要注意的是,没有任何代码会导致重画。要绘制,需要调用invalidate(

我有几个线性布局,在滚动视图中填充下载的图像或文本。线性布局具有应用于它们的LayoutImation,因此在绘制时每个布局都“滑动”到位。有没有办法强制屏幕外的线性布局进行绘制,以便在用户滚动到它们时,动画已经完成?我尝试过这样测量每个视图:(容器是视图组)


但是它们在滚动时出现在屏幕上之前仍然不会绘制(通常情况下这很好,但动画会使它……呃,不好)

如果您不想运行动画,为什么不干脆删除动画?框架将应用动画,因为您告诉它


还要注意的是,没有任何代码会导致重画。要绘制,需要调用invalidate()或draw()。

如果不想运行动画,为什么不干脆删除动画?框架将应用动画,因为您告诉它


还要注意的是,没有任何代码会导致重画。要绘制,您需要调用invalidate()或draw()。

对于任何未来的读者,我最后做的是:我将LinearLayout子类化,并覆盖onLayout,以仅在布局填充时当前在屏幕上时应用动画:

@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom)
{
    super.onLayout(changed, left, top, right, bottom);

    // only animate if viewgroup is currently on screen
    int[] xy = new int[2];
    this.getLocationOnScreen(xy);
    int yPos = xy[1];

    if (yPos < availableScreenHeight && bottom > 200)
    {
        Animation slide_down = AnimationUtils.loadAnimation(getContext(), R.anim.container_slide_down);
        LayoutAnimationController controller = new LayoutAnimationController(slide_down, 0.25f);
        this.setLayoutAnimation(controller);
    }
}
@覆盖
仅限受保护的空心布局(布尔值已更改、整数左侧、整数顶部、整数右侧、整数底部)
{
超级。仅限布局(已更改、左、上、右、下);
//仅当视图组当前在屏幕上时才设置动画
int[]xy=新的int[2];
此.getLocationOn屏幕(xy);
int yPos=xy[1];
如果(yPos200)
{
Animation slide\u down=AnimationUtils.loadAnimation(getContext(),R.anim.container\u slide\u down);
LayoutImationController=新的LayoutImationController(向下滑动,0.25f);
此.setLayoutImation(控制器);
}
}

这实际上节省了一些周期,因为我没有全面应用动画,然后将其从不需要的视图中删除。(顺便说一句,“availableScreenHeight”就是这个,而“200”只是一个我知道填充视图永远不会小于的阈值。您的情况可能会有所不同。)

对于任何未来的读者,下面是我最后要做的:我将LinearLayout子类化,并将OnlyLayout重写为仅在布局填充时当前在屏幕上时应用动画:

@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom)
{
    super.onLayout(changed, left, top, right, bottom);

    // only animate if viewgroup is currently on screen
    int[] xy = new int[2];
    this.getLocationOnScreen(xy);
    int yPos = xy[1];

    if (yPos < availableScreenHeight && bottom > 200)
    {
        Animation slide_down = AnimationUtils.loadAnimation(getContext(), R.anim.container_slide_down);
        LayoutAnimationController controller = new LayoutAnimationController(slide_down, 0.25f);
        this.setLayoutAnimation(controller);
    }
}
@覆盖
仅限受保护的空心布局(布尔值已更改、整数左侧、整数顶部、整数右侧、整数底部)
{
超级。仅限布局(已更改、左、上、右、下);
//仅当视图组当前在屏幕上时才设置动画
int[]xy=新的int[2];
此.getLocationOn屏幕(xy);
int yPos=xy[1];
如果(yPos200)
{
Animation slide\u down=AnimationUtils.loadAnimation(getContext(),R.anim.container\u slide\u down);
LayoutImationController=新的LayoutImationController(向下滑动,0.25f);
此.setLayoutImation(控制器);
}
}

这实际上节省了一些周期,因为我没有全面应用动画,然后将其从不需要的视图中删除。(顺便说一句,“availableScreenHeight”就是这样,而“200”只是一个阈值,我知道填充的视图永远不会小于这个阈值。您的情况可能会有所不同。)

我希望在使用下载的数据填充视图组时,动画会显示在视图组上。这意味着,如果它当时在屏幕上,您将看到动画。如果当时它不在屏幕上,你就不会。此外,视图组可以按任何顺序排列,因此我不能假设某个视图组在任何给定时间都处于屏幕上或屏幕下。我想最简单的方法就是在下载完成后强迫他们画画,不管他们在哪里。至于第二部分,我尝试了container.invalidate(),但运气不好。我不能使用draw(),因为我没有画布可供参考,只有视图组。动画结束后只需删除动画。但Android在屏幕上显示动画(在我的例子中是滚动到视图中)之前不会启动动画,因此等待动画结束为时已晚,因为用户已经看到了动画。动画不会发生在屏幕外。我希望动画在填充下载数据时显示在视图组上。这意味着,如果它当时在屏幕上,您将看到动画。如果当时它不在屏幕上,你就不会。此外,视图组可以按任何顺序排列,因此我不能假设某个视图组在任何给定时间都处于屏幕上或屏幕下。我想最简单的方法就是在下载完成后强迫他们画画,不管他们在哪里。至于第二部分,我尝试了container.invalidate(),但运气不好。我不能使用draw(),因为我没有画布可供参考,只有视图组。动画结束后只需删除动画。但Android在屏幕上显示动画(在我的例子中是滚动到视图中)之前不会启动动画,因此等待动画结束为时已晚,因为用户已经看到了动画。动画不会发生在屏幕外。