「Android/VideoView/イベント」の版間の差分
提供: 初心者エンジニアの簡易メモ
(→動画プレイヤーサンプル(イベント)) |
(→動画プレイヤーサンプル(イベント)) |
||
(同じ利用者による、間の5版が非表示) | |||
行1: | 行1: | ||
==動画プレイヤーサンプル(イベント)== | ==動画プレイヤーサンプル(イベント)== | ||
− | + | <pre> | |
− | + | import android.media.MediaPlayer; | |
− | + | import android.support.v7.app.AppCompatActivity; | |
− | + | import android.os.Bundle; | |
− | + | import android.view.Gravity; | |
− | + | import android.view.ViewGroup; | |
− | + | import android.widget.FrameLayout; | |
− | + | import android.widget.VideoView; | |
− | + | public class MainActivity extends AppCompatActivity { | |
private VideoView mVideoView; | private VideoView mVideoView; | ||
@Override | @Override | ||
行18: | 行18: | ||
FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); | FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); | ||
layoutParams.gravity = Gravity.CENTER; | layoutParams.gravity = Gravity.CENTER; | ||
− | FrameLayout layout = (FrameLayout)findViewById(R.id. | + | FrameLayout layout = (FrameLayout)findViewById(R.id.videoLayout); |
layout.addView(mVideoView, layoutParams); | layout.addView(mVideoView, layoutParams); | ||
− | + | // タッチイベント(タッチしてるときはずっと発行される) | |
− | + | mVideoView.setOnTouchListener(new View.OnTouchListener() { | |
− | + | @Override | |
− | + | public boolean onTouch(View arg0, MotionEvent arg1) { | |
− | Log.i(" | + | Log.i(TAG, "onTouch"); |
− | return true; | + | return true; |
+ | } | ||
+ | }); | ||
+ | // 最後まで再生したらイベント発行 | ||
+ | mVideoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { | ||
+ | @Override | ||
+ | public void onCompletion(MediaPlayer mp) { | ||
+ | Log.i(TAG, "onCompletion"); | ||
+ | } | ||
+ | }); | ||
+ | // 再生準備完了したらイベント発行(ライフサイサイクルでpauseになっても発行) | ||
+ | // setVideoPathを設定し準備できたら発行される | ||
+ | mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { | ||
+ | @Override | ||
+ | public void onPrepared(MediaPlayer mp) { | ||
+ | Log.i(TAG, "onPrepared"); | ||
+ | //mVideoView.start(); | ||
+ | } | ||
+ | }); | ||
+ | // エラーイベント | ||
+ | mVideoView.setOnErrorListener(new MediaPlayer.OnErrorListener() { | ||
+ | @Override | ||
+ | public boolean onError(MediaPlayer media, int what, int extra) { | ||
+ | Log.i(TAG, "onError"); | ||
+ | return true; | ||
+ | } | ||
+ | }); | ||
+ | mVideoView.setVideoPath("~.mp4"); | ||
+ | Button playButton = (Button)findViewById(R.id.playbutton); | ||
+ | playButton.setOnClickListener(new View.OnClickListener() { | ||
+ | public void onClick(View v) { | ||
+ | mVideoView.start(); | ||
} | } | ||
}); | }); | ||
− | + | Button btnpauseButton = (Button)findViewById(R.id.pausebutton); | |
− | + | btnpauseButton.setOnClickListener(new View.OnClickListener() { | |
− | + | public void onClick(View v) { | |
− | public void | + | mVideoView.pause(); |
− | + | ||
} | } | ||
}); | }); | ||
− | + | Button seekButton = (Button)findViewById(R.id.seekbutton); | |
− | + | seekButton.setOnClickListener(new View.OnClickListener() { | |
− | + | public void onClick(View v) { | |
− | public void | + | mVideoView.seekTo(7000); // msecで指定。7秒目に移るかと思ったが、初回から再生された。 |
− | + | ||
− | mVideoView. | + | |
} | } | ||
}); | }); | ||
− | + | Button stopPlaybackButton = (Button)findViewById(R.id.stopplaybackbutton); | |
− | + | stopPlaybackButton.setOnClickListener(new View.OnClickListener() { | |
− | + | public void onClick(View v) { | |
− | public | + | mVideoView.stopPlayback(); // これなぜかとまる。 |
− | + | } | |
− | + | }); | |
+ | Button replayButton = (Button)findViewById(R.id.replaybutton); | ||
+ | replayButton.setOnClickListener(new View.OnClickListener() { | ||
+ | public void onClick(View v) { | ||
+ | mVideoView.seekTo(0); | ||
+ | mVideoView.start(); | ||
} | } | ||
}); | }); | ||
− | |||
− | |||
} | } | ||
− | + | } | |
+ | </pre> | ||
res/layout/activity_main.xml | res/layout/activity_main.xml | ||
− | + | <pre> | |
+ | <ScrollView | ||
+ | android:layout_width="match_parent" | ||
+ | android:layout_height="wrap_content" | ||
+ | > | ||
+ | <LinearLayout | ||
+ | android:layout_width="match_parent" | ||
+ | android:layout_height="match_parent" | ||
+ | android:gravity="center_horizontal" | ||
+ | android:orientation="vertical" | ||
+ | > | ||
+ | <Button | ||
+ | android:text="動画再生" | ||
+ | android:layout_width="wrap_content" | ||
+ | android:layout_height="wrap_content" | ||
+ | android:id="@+id/playbutton"> | ||
+ | </Button> | ||
+ | <Button | ||
+ | android:text="動画停止" | ||
+ | android:layout_width="wrap_content" | ||
+ | android:layout_height="wrap_content" | ||
+ | android:id="@+id/pausebutton"> | ||
+ | </Button> | ||
+ | <Button | ||
+ | android:text="動画seek" | ||
+ | android:layout_width="wrap_content" | ||
+ | android:layout_height="wrap_content" | ||
+ | android:id="@+id/seekbutton"> | ||
+ | </Button> | ||
+ | <Button | ||
+ | android:text="動画再生停止" | ||
+ | android:layout_width="wrap_content" | ||
+ | android:layout_height="wrap_content" | ||
+ | android:id="@+id/stopplaybackbutton"> | ||
+ | </Button> | ||
+ | <Button | ||
+ | android:text="リプレイ" | ||
+ | android:layout_width="wrap_content" | ||
+ | android:layout_height="wrap_content" | ||
+ | android:id="@+id/replaybutton"> | ||
+ | </Button> | ||
+ | <VideoView | ||
+ | android:id="@+id/VideoView1" | ||
+ | android:layout_width="match_parent" | ||
+ | android:layout_height="100dp" | ||
+ | /> | ||
+ | </LinearLayout> | ||
+ | </ScrollView> | ||
+ | </pre> | ||
+ | |||
+ | ==イベント周り調査== | ||
+ | ===onPreparedイベントを発生させる条件=== | ||
+ | 3つ条件がありand条件となる | ||
+ | *setVideoPathを設定 | ||
+ | *setVisibility(View.VISIBLE) | ||
+ | *viewの縦幅横幅の両方が0でない | ||
+ | |||
+ | ===その他イベント=== | ||
+ | *onPrepared内でstartするのが良さそう。 | ||
+ | *start,pause,seekToを実行してもonPrepared,onCompletion,onTouchのイベントは走らない | ||
+ | *stopPlaybackを実行するとstart,pause,seekToあたりが動かなくなる(謎) | ||
− | + | ==参照== | |
+ | VideoView公式:https://developer.android.com/reference/android/widget/VideoView |
2018年11月16日 (金) 17:55時点における最新版
動画プレイヤーサンプル(イベント)
import android.media.MediaPlayer; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.Gravity; import android.view.ViewGroup; import android.widget.FrameLayout; import android.widget.VideoView; public class MainActivity extends AppCompatActivity { private VideoView mVideoView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mVideoView = new VideoView(this); FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); layoutParams.gravity = Gravity.CENTER; FrameLayout layout = (FrameLayout)findViewById(R.id.videoLayout); layout.addView(mVideoView, layoutParams); // タッチイベント(タッチしてるときはずっと発行される) mVideoView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View arg0, MotionEvent arg1) { Log.i(TAG, "onTouch"); return true; } }); // 最後まで再生したらイベント発行 mVideoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { Log.i(TAG, "onCompletion"); } }); // 再生準備完了したらイベント発行(ライフサイサイクルでpauseになっても発行) // setVideoPathを設定し準備できたら発行される mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { Log.i(TAG, "onPrepared"); //mVideoView.start(); } }); // エラーイベント mVideoView.setOnErrorListener(new MediaPlayer.OnErrorListener() { @Override public boolean onError(MediaPlayer media, int what, int extra) { Log.i(TAG, "onError"); return true; } }); mVideoView.setVideoPath("~.mp4"); Button playButton = (Button)findViewById(R.id.playbutton); playButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { mVideoView.start(); } }); Button btnpauseButton = (Button)findViewById(R.id.pausebutton); btnpauseButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { mVideoView.pause(); } }); Button seekButton = (Button)findViewById(R.id.seekbutton); seekButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { mVideoView.seekTo(7000); // msecで指定。7秒目に移るかと思ったが、初回から再生された。 } }); Button stopPlaybackButton = (Button)findViewById(R.id.stopplaybackbutton); stopPlaybackButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { mVideoView.stopPlayback(); // これなぜかとまる。 } }); Button replayButton = (Button)findViewById(R.id.replaybutton); replayButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { mVideoView.seekTo(0); mVideoView.start(); } }); } }
res/layout/activity_main.xml
<ScrollView android:layout_width="match_parent" android:layout_height="wrap_content" > <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center_horizontal" android:orientation="vertical" > <Button android:text="動画再生" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/playbutton"> </Button> <Button android:text="動画停止" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/pausebutton"> </Button> <Button android:text="動画seek" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/seekbutton"> </Button> <Button android:text="動画再生停止" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/stopplaybackbutton"> </Button> <Button android:text="リプレイ" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/replaybutton"> </Button> <VideoView android:id="@+id/VideoView1" android:layout_width="match_parent" android:layout_height="100dp" /> </LinearLayout> </ScrollView>
イベント周り調査
onPreparedイベントを発生させる条件
3つ条件がありand条件となる
- setVideoPathを設定
- setVisibility(View.VISIBLE)
- viewの縦幅横幅の両方が0でない
その他イベント
- onPrepared内でstartするのが良さそう。
- start,pause,seekToを実行してもonPrepared,onCompletion,onTouchのイベントは走らない
- stopPlaybackを実行するとstart,pause,seekToあたりが動かなくなる(謎)
参照
VideoView公式:https://developer.android.com/reference/android/widget/VideoView