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

时间:2013-07-23 15:46:36

标签: android view android-viewpager surfaceview android-custom-view

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

1 个答案:

答案 0 :(得分:1)

如何在视频寻呼机屏幕上自动启动视频

这是潜在的问题。明智地,OP想要尝试孤立它在某种意义上“进入屏幕”的地步。问题是这可能意味着许多事情:

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

在大多数情况下,视图在Activity的onCreate 中被夸大并创建(例如,如果您使用了setContentView)。

OP也没有运气使用surfaceCreated回调。因此,我们在上述评论中考虑了OP是否会对三个抽奖阶段layoutmeasuredraw感兴趣。在android中实际“在屏幕上放置视图”有两个阶段 - 测量和布局传递 - 请参阅here

问题是,事实证明OP是动画他在屏幕上的视图,所以问题变成了如何判断动画后视频“到达”屏幕的时间。

重点是:你实际上想要在绘图过程中稍后检测一个舞台,这是可以理解的!动画可以通过多次调用invalidate来调用draw,因此该视图的Canvas需要很多ViewAnimator个 - 所以当你想要播放视频的阶段绝对不是首先显示在用户界面中。

针对此特定情况的解决方案

ViewPager个实例(例如Adapter)上使用动画侦听器。为了不必在teh活动中打扰他们,我会推出自己的视图,然后使用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(); } }; } 类型模式来管理不断变化的数据:

一个非常仓促的书面实施将是:

{{1}}

希望这有帮助。