ViewPager показывает Mediacontrols на ImageView перед VideoView - PullRequest
3 голосов
/ 20 октября 2019

Функция галереи:

Я разрабатываю функцию, аналогичную галерее, где пользователи могут проводить пальцем, чтобы увидеть загруженное ими изображение или видео.

Проблема:

Всякий раз, когда после просмотра изображения появляется видео, Mediacontrols для видеовидения отображается при просмотре изображения в течение примерно 2 секунд

Image showing Mediacontrols

Код:

item_pager.xml:

<?xml version="1.0" encoding="utf-8"?>
  <layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

<LinearLayout
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:layout_gravity="center"
  android:background="@color/black_overlay"
  android:gravity="center"
  android:orientation="vertical">

  <ImageView
   android:id="@+id/images_pager"
   android:layout_width="match_parent"
   android:layout_height="250dp"
   android:adjustViewBounds="true"
   android:scaleType="fitXY"
   android:visibility="visible"
   app:srcCompat="@drawable/cctv_icon" />

  <VideoView
   android:id="@+id/videoview"
   android:layout_width="match_parent"
   android:layout_height="250dp"
   android:adjustViewBounds="true"
   android:visibility="gone" />
 </LinearLayout>

</layout>

Код PagerAdapter:

public class ItemViewpager extends PagerAdapter implements MediaPlayer.OnPreparedListener, 
   View.OnClickListener, MediaPlayer.OnCompletionListener, View.OnFocusChangeListener {
 private List<MediaInfo> mediaInfos;
 private LayoutInflater layoutInflater;
 private MediaController mediaController;
 private HashMap<Integer, MediaController> mediaMap;
 private VideoView videoView;
 private ImageView imageView;
 private int currPos = 0;

 public ItemViewpager(List<MediaInfo> mediaInfos) {
  this.mediaInfos = mediaInfos;
  mediaMap = new HashMap<>(mediaInfos.size());
 }

@Override
public int getCount() {
return mediaInfos.size();
}

@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
 return view == ((LinearLayout) object);
}

@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
 layoutInflater= 
  (LayoutInflater)container.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  View itemView = layoutInflater.inflate(R.layout.item_pager, container, false);

   imageView = itemView.findViewById(R.id.images_pager);
   videoView = itemView.findViewById(R.id.videoview);
   videoView.setOnPreparedListener(this);
   videoView.setOnCompletionListener(this);
   videoView.setOnFocusChangeListener(this);

   boolean video = mediaInfos.get(position).video;
   String uri = mediaInfos.get(position).uri;

   mediaController = new MediaController(container.getContext());
   mediaMap.put(position, mediaController);
  if (video) {
     imageView.setVisibility(View.GONE);
     videoView.setVisibility(View.VISIBLE);
     videoView.setVideoURI(Uri.parse(uri));
     mediaController.setAnchorView(videoView);
     videoView.setMediaController(mediaController);
     videoView.requestFocus();
     videoView.seekTo(1);
   } else {
    imageView.setVisibility(View.VISIBLE);
    videoView.setVisibility(View.GONE);
    Picasso.get().load(uri).fit().placeholder(R.mipmap.ic_launcher).into(imageView);
   }
  if (mediaMap.size() > 0)
   mediaMap.get(position).hide();

container.addView(itemView);

return itemView;
}

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
 container.removeView((LinearLayout) object);
}

@Override
public void onPrepared(MediaPlayer mediaPlayer) {

}

public void onPageSelectionListener(int pos) {
  currPos = pos;
  boolean video = mediaInfos.get(currPos).video;

  /*if (mediaMap.size() > 0) {
   if (video)
    mediaMap.get(currPos).show(0);
   else
    mediaMap.get(currPos).hide();
  }*/
  }


  @Override
  public void onClick(View view) {
  }

  @Override
  public void onCompletion(MediaPlayer mediaPlayer) {
  boolean video = mediaInfos.get(currPos).video;

   /*if (!video)
    videoView.stopPlayback();
   else
    mediaMap.get(currPos).show();*/
    }

   @Override
   public void onFocusChange(View view, boolean focus) {
   }

  }

Заранее спасибо:

Ответы [ 5 ]

0 голосов
/ 02 ноября 2019

Наконец-то моя проблема получила разрешение от ответ от Ронак Тхаккар

Использованный CustomViewpager пыталсязагружайте только одну страницу различными способами.

Вы всегда можете увидеть исходный код в классе.

0 голосов
/ 02 ноября 2019

Лучший вариант - изменить ViewPager адаптер с PagerAdapter на FragmentStatePagerAdapter. Это означает, что вам придется иметь дело с фрагментами и жизненным циклом. Вам нужно будет поместить VideoView / ImageView внутри Fragment и создать экземпляр воспроизведения видео, только когда пользователь увидит VideoView. Так вы избавитесь от показа MediaController на изображениях. Способ загрузки видео, воспроизводимого внутри фрагмента, следующий:

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
}

Когда флаг isVisibleToUser равен true, вы начинаете воспроизведение видео. Вы можете проверить дополнительную помощь здесь: Видео не останавливается во фрагменте ViewPager

Google для более подробной информации, есть множество примеров, как вы можете достичь того, что вы хотите. Я также предлагаю для воспроизведения видео, что вы должны избавиться от VideoView и научиться воспроизводить видео с помощью ExoPlayer, это сложнее для воспроизведения видео, но в итоге это гораздо лучше оптимизированное и производительное решение

Также старайтесь избегать использования ViewPager для будущего, уже есть новый компонент, ViewPager2 на основе RecyclerView.

0 голосов
/ 31 октября 2019

Попробуйте по следующему пути

    boolean video = mediaInfos.get(currPos).video;
    if(video){
        mediaController.setVisibility(View.GONE);
// You need the object of mediaController which is of currently visible videoView on the screen
    }else{
        mediaController.setVisibility(View.VISIBLE); 
    }
0 голосов
/ 02 ноября 2019

Сначала создайте объект MediaController. Затем нужно показать его, вызвать view.VISIBLE, когда нужно скрыть, вызвать view.gone.

 MediaController ctrl = new MediaController(context);

if(video){
     ctrl.setVisibility(View.VISIBLE);
videoView.setMediaController(ctrl);

    }else{
       ctrl.setVisibility(View.GONE);
    }
0 голосов
/ 26 октября 2019

Попробуйте это:

if (video) {
     imageView.setVisibility(View.GONE);
     videoView.setVisibility(View.VISIBLE);
     videoView.setVideoURI(Uri.parse(uri));
     mediaController.setAnchorView(videoView);
     videoView.setMediaController(mediaController);
     videoView.requestFocus();
     videoView.seekTo(1);
   } else {
    imageView.setVisibility(View.VISIBLE);
    videoView.setVisibility(View.GONE);
    //add below line, hide mediaController
    videoView.setMediaController(null);
    Picasso.get().load(uri).fit().placeholder(R.mipmap.ic_launcher).into(imageView);
   }

Этот код скрыть MediaController:

videoView.setMediaController(null);
...