我正在尝试创建自定义平面视图,每次视图在屏幕上时,视图都会自动开始播放视频。我想知道当视图在UI上显示并被用户看到时,View中的哪个方法会被通知。我正在使用一个viewpager,因此SurfaceCreated不起作用,因为视图是在屏幕上显示之前创建的。
答案 0 :(得分:1)
如何在视频寻呼机屏幕上自动启动视频
这是潜在的问题。明智地,OP想要尝试孤立它在某种意义上“进入屏幕”的地步。问题是这可能意味着许多事情:
当我第一次听到这个问题时,我认为一个好的案例是onAttachedToWindow
- 请参阅docs。对于根据原始标题阅读此问题的人来说,这就是您想要的。
在大多数情况下,视图在Activity的onCreate 中被夸大并创建(例如,如果您使用了setContentView)。
OP也没有运气使用surfaceCreated回调。因此,我们在上述评论中考虑了OP是否会对三个抽奖阶段layout
,measure
和draw
感兴趣。在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}}
希望这有帮助。