I have a Marque Text in my player view so that when song names don't fit in the allotted space it will scroll the entire song name. However it is constantly stopping and starting, so that the entire song name is never displayed. I have spent far many hours researching and trying to find out why this is but I have come up with nothing that seems to fix the issue.
Player Activity
public class PlayerActivity extends AppCompatActivity implements MediaPlayer.OnCompletionListener{
TextView songName, artistName, durationPlayed, duration_total;
ImageView coverArt, coverArtBack, nextBtn,prevBtn, shuffleBtn, repeatBtn, playPauseBtn;
//FloatingActionButton playPauseBtn;
SeekBar seekBar;
int position = -1;
static ArrayList<MusicFiles> listSongs = new ArrayList<>();
static Uri uri;
static MediaPlayer mediaPlayer;
private Handler handler = new Handler();
private Thread playThread, prevThread, nextThread;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
setContentView(R.layout.activity_player);
initView();
getIntentMethod();
songName.setText(listSongs.get(position).getTitle());
songName.setSelected(true);
artistName.setText(listSongs.get(position).getArtist());
mediaPlayer.setOnCompletionListener(this);
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if (mediaPlayer !=null && fromUser)
{
mediaPlayer.seekTo(progress * 1000);
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
PlayerActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
if (mediaPlayer !=null)
{
int mCurrentPosition = mediaPlayer.getCurrentPosition() / 1000;
seekBar.setProgress(mCurrentPosition);
durationPlayed.setText(formattedTime(mCurrentPosition));
}
handler.postDelayed(this, 1000);
}
});
shuffleBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (shuffleBoolean)
{
shuffleBoolean = false;
shuffleBtn.setImageResource(R.drawable.ic_shuffle_off);
}
else
{
shuffleBoolean = true;
shuffleBtn.setImageResource(R.drawable.ic_shuffle_on);
}
}
});
repeatBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (repeatBoolean)
{
repeatBoolean = false;
repeatBtn.setImageResource(R.drawable.ic_repeat_off);
}
else
{
repeatBoolean = true;
repeatBtn.setImageResource(R.drawable.ic_repeat_on);
}
}
});
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (hasFocus) {
getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
}
}
@Override
protected void onResume() {
playThreadBtn();
nextThreadBtn();
prevThreadBtn();
super.onResume();
}
private void prevThreadBtn() {
prevThread = new Thread()
{
@Override
public void run() {
super.run();
prevBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
prevBtnClicked();
}
});
}
};
prevThread.start();
}
private void prevBtnClicked() {
if (mediaPlayer.isPlaying())
{
mediaPlayer.stop();
mediaPlayer.release();
if (shuffleBoolean && !repeatBoolean)
{
position = getRandom(listSongs.size() - 1);
}
else if (!shuffleBoolean && !repeatBoolean) {
position = ((position - 1) < 0 ? (listSongs.size() - 1) : (position - 1));
}
uri = Uri.parse(listSongs.get(position).getPath());
mediaPlayer = MediaPlayer.create(getApplicationContext(), uri);
metaData(uri);
songName.setText(listSongs.get(position).getTitle());
songName.setSelected(true);
artistName.setText(listSongs.get(position).getArtist());
seekBar.setMax(mediaPlayer.getDuration()/1000);
PlayerActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
if (mediaPlayer !=null)
{
int mCurrentPosition = mediaPlayer.getCurrentPosition() / 1000;
seekBar.setProgress(mCurrentPosition);
}
handler.postDelayed(this, 1000);
}
});
mediaPlayer.setOnCompletionListener(this);
playPauseBtn.setBackgroundResource(R.drawable.ic_pause);
mediaPlayer.start();
}
else
{
mediaPlayer.stop();
mediaPlayer.release();
if (shuffleBoolean && !repeatBoolean)
{
position = getRandom(listSongs.size() - 1);
}
else if (!shuffleBoolean && !repeatBoolean) {
position = ((position - 1) < 0 ? (listSongs.size() - 1) : (position - 1));
}
uri = Uri.parse(listSongs.get(position).getPath());
mediaPlayer = MediaPlayer.create(getApplicationContext(), uri);
metaData(uri);
songName.setText(listSongs.get(position).getTitle());
songName.setSelected(true);
artistName.setText(listSongs.get(position).getArtist());
seekBar.setMax(mediaPlayer.getDuration()/1000);
PlayerActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
if (mediaPlayer !=null)
{
int mCurrentPosition = mediaPlayer.getCurrentPosition() / 1000;
seekBar.setProgress(mCurrentPosition);
}
handler.postDelayed(this, 1000);
}
});
mediaPlayer.setOnCompletionListener(this);
playPauseBtn.setBackgroundResource(R.drawable.ic_play);
}
}
private void nextThreadBtn() {
nextThread = new Thread()
{
@Override
public void run() {
super.run();
nextBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
nextBtnClicked();
}
});
}
};
nextThread.start();
}
private void nextBtnClicked() {
if (mediaPlayer.isPlaying())
{
mediaPlayer.stop();
mediaPlayer.release();
if (shuffleBoolean && !repeatBoolean)
{
position = getRandom(listSongs.size() - 1);
}
else if (!shuffleBoolean && !repeatBoolean) {
position = ((position +1) % listSongs.size());
}
// ELSE POSITION WILL BE POSITION
//position = ((position + 1) % listSongs.size());
uri = Uri.parse(listSongs.get(position).getPath());
mediaPlayer = MediaPlayer.create(getApplicationContext(), uri);
metaData(uri);
songName.setText(listSongs.get(position).getTitle());
artistName.setText(listSongs.get(position).getArtist());
seekBar.setMax(mediaPlayer.getDuration()/1000);
PlayerActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
if (mediaPlayer !=null)
{
int mCurrentPosition = mediaPlayer.getCurrentPosition() / 1000;
seekBar.setProgress(mCurrentPosition);
}
handler.postDelayed(this, 1000);
}
});
mediaPlayer.setOnCompletionListener(this);
playPauseBtn.setBackgroundResource(R.drawable.ic_pause);
mediaPlayer.start();
}
else
{
mediaPlayer.stop();
mediaPlayer.release();
if (shuffleBoolean && !repeatBoolean)
{
position = getRandom(listSongs.size() - 1);
}
else if (!shuffleBoolean && !repeatBoolean) {
position = ((position +1) % listSongs.size());
}
uri = Uri.parse(listSongs.get(position).getPath());
mediaPlayer = MediaPlayer.create(getApplicationContext(), uri);
metaData(uri);
songName.setText(listSongs.get(position).getTitle());
artistName.setText(listSongs.get(position).getArtist());
seekBar.setMax(mediaPlayer.getDuration()/1000);
PlayerActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
if (mediaPlayer !=null)
{
int mCurrentPosition = mediaPlayer.getCurrentPosition() / 1000;
seekBar.setProgress(mCurrentPosition);
}
handler.postDelayed(this, 1000);
}
});
mediaPlayer.setOnCompletionListener(this);
playPauseBtn.setBackgroundResource(R.drawable.ic_play);
}
}
private int getRandom(int i) {
Random random = new Random();
return random.nextInt(i + 1);
}
private void playThreadBtn() {
playThread = new Thread()
{
@Override
public void run() {
super.run();
playPauseBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
playPauseBtnClicked();
}
});
}
// )
};
playThread.start();
}
private void playPauseBtnClicked() {
if (mediaPlayer.isPlaying())
{
playPauseBtn.setImageResource(R.drawable.ic_play);
mediaPlayer.pause();
seekBar.setMax(mediaPlayer.getDuration()/1000);
PlayerActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
if (mediaPlayer !=null)
{
int mCurrentPosition = mediaPlayer.getCurrentPosition() / 1000;
seekBar.setProgress(mCurrentPosition);
}
handler.postDelayed(this, 1000);
}
});
}
else
{
playPauseBtn.setImageResource(R.drawable.ic_pause);
mediaPlayer.start();
seekBar.setMax(mediaPlayer.getDuration()/1000);
PlayerActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
if (mediaPlayer !=null)
{
int mCurrentPosition = mediaPlayer.getCurrentPosition() / 1000;
seekBar.setProgress(mCurrentPosition);
}
handler.postDelayed(this, 1000);
}
});
}
}
private String formattedTime(int mCurrentPosition) {
String totalOut = "";
String totalNew = "";
String seconds = String.valueOf(mCurrentPosition % 60);
String minutes = String.valueOf(mCurrentPosition / 60);
totalOut = minutes + ":" + seconds;
totalNew = minutes + ":" + "0" + seconds;
if (seconds.length() == 1)
{
return totalNew;
}
else
{
return totalOut;
}
}
private void getIntentMethod() {
position = getIntent().getIntExtra("position", -1);
listSongs = musicFiles;
if (listSongs !=null)
{
playPauseBtn.setImageResource(R.drawable.ic_pause);
uri = Uri.parse(listSongs.get(position).getPath());
}
if (mediaPlayer !=null)
{
mediaPlayer.stop();
mediaPlayer.release();
mediaPlayer = MediaPlayer.create(getApplicationContext(), uri);
mediaPlayer.start();
}
else
{
mediaPlayer = MediaPlayer.create(getApplicationContext(), uri);
mediaPlayer.start();
}
seekBar.setMax(mediaPlayer.getDuration() / 1000);
metaData(uri);
}
private void initView() {
songName = findViewById(R.id.songName);
artistName = findViewById(R.id.songArtist);
durationPlayed = findViewById(R.id.durationPlayed);
duration_total = findViewById(R.id.durationTotal);
coverArt = findViewById(R.id.coverArt);
nextBtn = findViewById(R.id.btnNext);
prevBtn = findViewById(R.id.btnPrevious);
shuffleBtn = findViewById(R.id.btnShuffle);
repeatBtn = findViewById(R.id.btnRepeat);
playPauseBtn = findViewById(R.id.btnPlayPause);
seekBar = findViewById(R.id.seekBar);
}
private void metaData(Uri uri)
{
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
retriever.setDataSource(uri.toString());
final int durationTotal = Integer.parseInt(listSongs.get(position).getDuration())/1000;
duration_total.setText(formattedTime(durationTotal));
final byte[] art = retriever.getEmbeddedPicture();
Bitmap bitmap;
if (art !=null)
{
bitmap = BitmapFactory.decodeByteArray(art, 0, art.length);
ImageAnimation(this, coverArt, bitmap);
}
else
{
ImageView gradient = findViewById(R.id.coverArt);
RelativeLayout mContainer = findViewById(R.id.mContainer);
//gradient.setBackgroundResource(R.drawable.gradient_bg);
mContainer.setBackgroundResource(R.drawable.main_bg);
}
}
public void ImageAnimation(final Context context, final ImageView imageView, final Bitmap bitmap)
{
Animation animOut = AnimationUtils.loadAnimation(context, android.R.anim.fade_out);
final Animation animIn = AnimationUtils.loadAnimation(context, android.R.anim.fade_in);
animOut.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
Glide.with(context).load(bitmap).fitCenter().into(imageView);
animIn.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
imageView.startAnimation(animIn);
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
imageView.startAnimation(animOut);
}
@Override
public void onCompletion(MediaPlayer mp) {
nextBtnClicked();
if (mediaPlayer !=null)
{
mediaPlayer = MediaPlayer.create(getApplicationContext(), uri);
mediaPlayer.start();
mediaPlayer.setOnCompletionListener(this);
}
}
}
Player XMLfor the TextView
<TextView
android:id="@+id/songName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/durationPlayed"
android:layout_marginTop="40dp"
android:gravity="center_horizontal"
android:layout_marginStart="32dp"
android:layout_marginEnd="32dp"
android:textSize="22sp"
android:textStyle="bold"
android:singleLine="true"
android:ellipsize="marquee"
android:fadingEdge="horizontal"
android:marqueeRepeatLimit="marquee_forever"
android:scrollHorizontally="true"
android:text="Dark of You"
/>
Image of what is happening. https://i.stack.imgur.com/aezHC.jpg
I am hoping someone can point out what I am doing incorrectly. Any help would be greatly appreciated.