In my current app there is requirement to create custom video player and the special requirement is, to display or mark video progress-bar with different color at some given time-index just like Youtube marks its video with yellow color to indicate ads on its video progress bar.
For more clarity please check below screen-shot:
At this moment I'm done with Video Player functionality using VideoView and for now, I'm using Horizontal ProgressBar to show video progress. I did lot of research, but unfortunately no result so far. There is no compulsion to use only Horizontal ProgressBar, we can use SeekBar or inbuilt MediaController too, but the thing is we should be able to mark it with different color at some given position. Below is my code I have written so far:
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#000000"
android:paddingLeft="5dp"
android:paddingTop="5dp"
android:paddingRight="5dp"
android:paddingBottom="5dp"
tools:context=".MainActivity">
<VideoView
android:id="@+id/myVideo"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_centerInParent="true" />
<RelativeLayout
android:id="@+id/rlVidProgress"
android:layout_width="match_parent"
android:layout_alignParentBottom="true"
android:layout_height="wrap_content">
<TextView
android:id="@+id/tvCurrentTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="5dp"
android:layout_marginRight="20dp"
android:text="00:00"
android:textColor="@android:color/white"
android:textSize="13dp"
android:textStyle="bold" />
<ProgressBar
android:id="@+id/videoProgress"
style="@android:style/Widget.ProgressBar.Horizontal"
android:layout_centerVertical="true"
android:layout_toLeftOf="@+id/tvTotalTime"
android:layout_width="fill_parent"
android:layout_toRightOf="@+id/tvCurrentTime"
android:layout_height="10dp"
android:layout_marginBottom="10dp" />
<TextView
android:id="@+id/tvTotalTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_alignParentRight="true"
android:layout_marginLeft="20dp"
android:layout_marginRight="5dp"
android:text="00:00"
android:textColor="@android:color/white"
android:textSize="13dp"
android:textStyle="bold" />
</RelativeLayout>
<TextView
android:id="@+id/tvAutoSave"
android:layout_width="wrap_content"
android:textColor="@android:color/white"
android:layout_alignParentRight="true"
android:layout_marginBottom="10dp"
android:text="@string/click_to_auto_save_offer"
android:background="@drawable/white_border_bg"
android:textSize="13dp"
android:layout_above="@+id/rlVidProgress"
android:visibility="gone"
android:paddingBottom="3dp"
android:paddingTop="3dp"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:textStyle="bold"
android:layout_height="wrap_content" />
</RelativeLayout>
MainActivity.java
public class MainActivity extends AppCompatActivity implements View.OnClickListener
{
ProgressBar videoProgress;
TextView tvCurrentTime;
Handler handler;
VideoView vidView;
String strTotalDuration;
TextView tvAutoSave;
Animation animFadeIn, animFadeOut;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
animFadeIn = new AlphaAnimation(0, 1);
animFadeIn.setInterpolator(new DecelerateInterpolator()); //add this
animFadeIn.setDuration(1000);
animFadeOut = new AlphaAnimation(1, 0);
animFadeOut.setInterpolator(new AccelerateInterpolator()); //and this
//animFadeOut.setStartOffset(500);
animFadeOut.setDuration(500);
tvCurrentTime = (TextView) findViewById(R.id.tvCurrentTime);
final TextView tvTotalTime = (TextView) findViewById(R.id.tvTotalTime);
tvAutoSave = (TextView) findViewById(R.id.tvAutoSave);
tvAutoSave.setOnClickListener(this);
vidView = (VideoView)findViewById(R.id.myVideo);
videoProgress = (ProgressBar) findViewById(R.id.videoProgress);
videoProgress.setProgress(0);
videoProgress.setMax(100);
final String videoSource = "https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4";
vidView.setKeepScreenOn(true);
vidView.setVideoURI(Uri.parse(videoSource));
vidView.setMediaController(null);
handler = new Handler();
// Define the code block to be executed
final Runnable runnableCode = new Runnable() {
@Override
public void run()
{
updateCurrentTime();
// Repeat this the same runnable code block again another 1 seconds
// 'this' is referencing the Runnable object
handler.postDelayed(this, 1000);
}
};
vidView.setOnCompletionListener(new MediaPlayer.OnCompletionListener()
{
@Override
public void onCompletion(MediaPlayer mp)
{
if(tvAutoSave.getVisibility() == View.VISIBLE)
{
tvAutoSave.setVisibility(View.GONE);
tvAutoSave.startAnimation(animFadeOut);
}
}
});
vidView.setOnPreparedListener(new MediaPlayer.OnPreparedListener()
{
@Override
public void onPrepared(MediaPlayer mp)
{
vidView.start();
strTotalDuration = msToTimeConverter(vidView.getDuration());
tvTotalTime.setText(""+strTotalDuration);
// Start the initial runnable task by posting through the handler
handler.post(runnableCode);
//startHandler();
}
}
);
}
private void updateCurrentTime()
{
if (videoProgress.getProgress() >= 100)
{
handler.removeMessages(0);
}
String currentPosition = msToTimeConverter(vidView.getCurrentPosition());
String[] strArr = currentPosition.split(":");
if(strArr.length==2 && (strArr[1].equals("06") || strArr[1].equals("6")))
{
Toast.makeText(MainActivity.this, "Trigger success at 6 sec position.......", Toast.LENGTH_SHORT).show();
tvAutoSave.setVisibility(View.VISIBLE);
tvAutoSave.startAnimation(animFadeIn);
}
int progress = vidView.getCurrentPosition() * 100 / vidView.getDuration();
videoProgress.setProgress(progress);
tvCurrentTime.setText(""+currentPosition);
}
String msToTimeConverter(int millis)
{
return String.format("%02d:%02d", TimeUnit.MILLISECONDS.toMinutes(millis) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)),
TimeUnit.MILLISECONDS.toSeconds(millis) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis)));
}
@Override
public void onClick(View v)
{
switch (v.getId())
{
case R.id.tvAutoSave:
tvAutoSave.setVisibility(View.GONE);
tvAutoSave.startAnimation(animFadeOut);
Toast.makeText(MainActivity.this, "Offer(s) saved in wallet successfully", Toast.LENGTH_SHORT).show();
break;
}
}
}

