Android 当视图显示在ui上时,会通知视图中的哪个方法
我正在尝试创建一个自定义的surfaceview,每次视图出现在屏幕上时,视图都会自己开始播放视频。我想知道当视图显示在UI上并被用户看到时,视图中的哪个方法会被通知。我使用的是viewpager,因此创建的表面不起作用,因为视图是在显示在屏幕上之前创建的。如何在屏幕上显示视频时在视图页面中自动启动视频 这是根本问题。从某种意义上说,OP明智地希望尝试并隔离它“出现在屏幕上”的点。问题是,这可能意味着很多事情: 当我第一次听到这个问题时,我认为一个很好的例子应该是Android 当视图显示在ui上时,会通知视图中的哪个方法,android,view,android-viewpager,surfaceview,android-custom-view,Android,View,Android Viewpager,Surfaceview,Android Custom View,我正在尝试创建一个自定义的surfaceview,每次视图出现在屏幕上时,视图都会自己开始播放视频。我想知道当视图显示在UI上并被用户看到时,视图中的哪个方法会被通知。我使用的是viewpager,因此创建的表面不起作用,因为视图是在显示在屏幕上之前创建的。如何在屏幕上显示视频时在视图页面中自动启动视频 这是根本问题。从某种意义上说,OP明智地希望尝试并隔离它“出现在屏幕上”的点。问题是,这可能意味着很多事情: 当我第一次听到这个问题时,我认为一个很好的例子应该是onAttachedToWind
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卡上)根本不需要时间。如果您的底层数据集不断变化,也许您只需要使用适配器模式,但除此之外,我认为没有问题。