티스토리 뷰

어플 실행화면 위는 버튼/ 아래는 seekbar

SeekBar 마우스로 옮길 때 깜빡거리지 않도록 하기 위한 처리

+ seekbar는 자동으로 비디오뷰와 연결된 것이 아니기 때문에 핸들러등으로 연결해줘야한다.

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    boolean isPrepared = false;
    boolean isTouch = false;

boolean으로 손을 데고 있는지 아닌지를 설정해준다.

손가락 닿았을 때를 flag를 세워서 손가락을 뗏을 때 false  로 만든다

        seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int i, boolean b) { 
            //프로그래스바가 변할때
            //유튜브에서 이동위치의 섬네일 뜨게하는 것처럼. 

            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {
                isTouch = true;
            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
                vv.seekTo(seekBar.getProgress());
                isTouch =false;
            }
        });

핸들러로 계속해서 그 위치가 어딘지를 알려줘야한다. 현재 플레이되고 있는 시간을 알려줌. 

    Handler handler = new Handler(){
        @Override
        public void handleMessage(@NonNull Message msg) {
            super.handleMessage(msg);
            handler.sendEmptyMessageDelayed(0,500); //0.5초마다 보내게
            if(!isTouch){ //터치되고 있지 않으면 핸들러따라 움직이세요. 재생이 되고 있는 부분에 동그라미를 움직이세요
                seekBar.setProgress(vv.getCurrentPosition());
            }

            Log.d("aabb","pos: "+vv.getCurrentPosition());
        }
    };

 

 

 

Video View 관련 기능들

       vv.getDuration(); //총 재생시간을 ms 가져옴
       vv.getCurrentPosition(); //현재 재생 부분 가져옴  ms
       vv.seekTo(1000);  // 해당하는 재생 위치로 이동 ms
       vv.pause(); //일시 정지
       vv.stopPlayback(); //완전 스톱
       vv.isPlaying(); 현재 플레이중인지 확인(플레이시 true를 반환한다)

 

 

 java

package com.example.videoview;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.MediaController;
import android.widget.SeekBar;
import android.widget.VideoView;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    boolean isPrepared = false;
    boolean isTouch = false;

    VideoView vv;
    Button playBt;
    SeekBar seekBar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        vv = findViewById(R.id.vv);
        playBt = findViewById(R.id.play_bt);
        seekBar = findViewById(R.id.seekBar);

        Uri uri = Uri.parse("http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4");
        vv.setVideoURI(uri);
        vv.requestFocus();
        vv.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mediaPlayer) {
                //재생 준비가 완료 되었을 때
                isPrepared = true;
                seekBar.setMax(vv.getDuration());
            }
        });
        vv.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mediaPlayer) {
                //재생이 끝났을 때
            }
        });

        seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int i, boolean b) {

            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {
                isTouch = true;
            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
                vv.seekTo(seekBar.getProgress());
                isTouch =false;
            }
        });

//        vv.getDuration(); //총 재생시간을 ms 가져옴
//        vv.getCurrentPosition(); //현재 재생 부분 가져옴  ms
//        vv.seekTo(1000);  // 해당하는 재생 위치로 이동 ms
//        vv.pause(); //일시 정지
//        vv.stopPlayback(); //완전 스톱

        MediaController controller = new MediaController(this);
        vv.setMediaController(controller);

        findViewById(R.id.play_bt).setOnClickListener(this);
        findViewById(R.id.move_bt).setOnClickListener(this);
        findViewById(R.id.stop_bt).setOnClickListener(this);
        handler.sendEmptyMessageDelayed(0, 1000);
    }

    Handler handler = new Handler(){
        @Override
        public void handleMessage(@NonNull Message msg) {
            super.handleMessage(msg);
            handler.sendEmptyMessageDelayed(0,500);
            if(!isTouch){
                seekBar.setProgress(vv.getCurrentPosition());
            }

            Log.d("aabb","pos: "+vv.getCurrentPosition());
        }
    };

    @Override
    public void onClick(View view) {
        if(view.getId() == R.id.play_bt){
            if(vv.isPlaying()){
                vv.pause();
                playBt.setText("재생");
            }else{
                vv.start();
                playBt.setText("일시정지");
            }
        }else if(view.getId() == R.id.move_bt){
            vv.seekTo(vv.getCurrentPosition()+3000); // 3초 뒤로 갑니다
        }else if(view.getId() == R.id.stop_bt){
            vv.pause();
            vv.seekTo(0);
            playBt.setText("재생");
        }
    }
}

레이아웃

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <VideoView
        android:id="@+id/vv"
        android:layout_width="match_parent"
        android:layout_height="300dp" />

    <LinearLayout
        android:id="@+id/layout"
        android:layout_below="@id/vv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:orientation="horizontal">

        <Button
            android:id="@+id/play_bt"
            android:layout_below="@+id/vv"
            android:text="재생"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <Button
            android:id="@+id/move_bt"
            android:layout_below="@+id/play_bt"
            android:text="3 초 뒤"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>

        <Button
            android:id="@+id/stop_bt"
            android:layout_below="@+id/move_bt"
            android:text="정지"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
    </LinearLayout>


    <SeekBar
        android:id="@+id/seekBar"
        android:layout_marginTop="50dp"
        android:layout_below="@+id/layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</RelativeLayout>
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함