Android 当视图显示在ui上时,会通知视图中的哪个方法

Android 当视图显示在ui上时,会通知视图中的哪个方法,android,view,android-viewpager,surfaceview,android-custom-view,Android,View,Android Viewpager,Surfaceview,Android Custom View,我正在尝试创建一个自定义的surfaceview,每次视图出现在屏幕上时,视图都会自己开始播放视频。我想知道当视图显示在UI上并被用户看到时,视图中的哪个方法会被通知。我使用的是viewpager,因此创建的表面不起作用,因为视图是在显示在屏幕上之前创建的。如何在屏幕上显示视频时在视图页面中自动启动视频 这是根本问题。从某种意义上说,OP明智地希望尝试并隔离它“出现在屏幕上”的点。问题是,这可能意味着很多事情: 当我第一次听到这个问题时,我认为一个很好的例子应该是onAttachedToWind

我正在尝试创建一个自定义的surfaceview,每次视图出现在屏幕上时,视图都会自己开始播放视频。我想知道当视图显示在UI上并被用户看到时,视图中的哪个方法会被通知。我使用的是viewpager,因此创建的表面不起作用,因为视图是在显示在屏幕上之前创建的。

如何在屏幕上显示视频时在视图页面中自动启动视频

这是根本问题。从某种意义上说,OP明智地希望尝试并隔离它“出现在屏幕上”的点。问题是,这可能意味着很多事情:

当我第一次听到这个问题时,我认为一个很好的例子应该是
onAttachedToWindow
-请参阅。对于根据原始标题阅读此问题的人来说,这是您想要的

在大多数情况下(例如,如果使用了setContentView),视图是在活动的onCreate中膨胀和创建的

OP也没有遇到表面处理的回调。因此,我们在上述评论中考虑了OP是否会对三个绘制阶段感兴趣
布局
测量
绘制
。在android中,实际“在屏幕上放置视图”分为两个阶段——测量阶段和布局阶段

问题是,OP原来是在给屏幕上的视图设置动画,所以问题变成了如何判断动画后视图何时“到达”屏幕

重要的一点是:您实际上希望在绘图过程中更晚的时间检测阶段,这是可以理解的!动画通过多次调用
invalidate
工作,这反过来又需要为该视图的
画布绘制许多
绘图
——因此,当视图第一次显示在UI中时,您想要播放视频的阶段决不是

此特定场景的解决方案

ViewAnimator
实例上使用动画侦听器(例如
ViewPager
)。为了在活动中不必麻烦它们,我会滚动您自己的视图,然后使用Android非常喜欢的
适配器
类型模式来管理不断变化的数据:

一个非常仓促编写的实现将是:

public class VideoStartingViewFliper extends ViewFlipper {
private final Animation fromRight;
private final Animation toLeft;
private final Animation fromLeft;
private final Animation toRight;
private VideoViewAdapter mAdapter;

public VideoStartingViewFliper(final Context context, final AttributeSet attrs) {
    super(context, attrs);
    fromRight = new YourChoiceOfAnimation();
    fromRight.setAnimationListener(videoStartingAnimationListener);

    toLeft = new YourChoiceOfAnimation();
    toLeft.setAnimationListener(videoStartingAnimationListener);

    fromLeft = new YourChoiceOfAnimation();
    fromLeft.setAnimationListener(videoStartingAnimationListener);

    toRight = new YourChoiceOfAnimation();
    toRight.setAnimationListener(videoStartingAnimationListener);
}

static interface VideoViewAdapter {

    public String getVideoPath(int childId);

}

public void setVideoViewAdapter(final VideoViewAdapter adapter) {
    mAdapter = adapter;
}

// or even call this showNextVideo and don't override!
@Override
public void showNext() {
    setInAnimation(fromRight);
    setOutAnimation(toLeft);
    super.showNext();
}

@Override
public void showPrevious() {
    setInAnimation(fromLeft);
    setOutAnimation(toRight);
    super.showPrevious();

}

private final AnimationListener videoStartingAnimationListener = new AnimationListener() {

    @Override
    public void onAnimationStart(final Animation animation) {
        final VideoView video = ((VideoView) getCurrentView());
        video.stopPlayback();
    }

    @Override
    public void onAnimationRepeat(final Animation animation) {

    }

    @Override
    public void onAnimationEnd(final Animation animation) {
        final VideoView video = ((VideoView) getCurrentView());
        // check null here!
        video.setVideoPath(mAdapter.getVideoPath(getCurrentView().getId()));
        video.start();
    }
};
}

希望这有帮助。

您是否尝试过三种大视图布局过程中的一种(首先检查以确保只启动一次视频)
绘制
布局
测量
?由于(并且仅因为)您使用的是查看寻呼机,您可能别无选择,只能使用
draw
-别忘了调用super。最后,如果这是一个视图寻呼机,您是否考虑过在引入视频视图的动画上设置一个
AnimationListener
,然后在animationEnd上启动视频
。表面正在被创建和破坏。我刚刚意识到我使用的是表面视图而不是视图。我不知道这是否会改变情况。为什么不在创建所有内容后设置视频,准备好,但不要播放它。然后听视图翻转器上的“翻转”动画结束以调用开始?是的,视图很可能会在onCreate中被构造,甚至膨胀。我认为,你所说的创造,是指曾经被画在画布上。我仍然看不出听“视图翻转器”动画并等待它们完成,然后设置视频并运行它有什么不对-使用一个半像样的SD卡(即使您的视频在SD卡上)根本不需要时间。如果您的底层数据集不断变化,也许您只需要使用适配器模式,但除此之外,我认为没有问题。