2014-01-23 4 views
7

이미지 및 비디오를 표시하기 위해 조각이있는 View Pager를 사용하고 있습니다. 이미지 및 비디오를 올바르게 표시 할 수 있지만 비디오를 스 와이프하고 비디오를 재생할 때 문제가 있습니다. 스 와이프 다음 또는 이전 다음 비디오는 여전히 다음 또는 이전 화면에서 재생되지만 다음 슬라이드 나 다음 슬라이드를 움직이면 비디오가 멈추지 만 다음 슬라이드 나 이전 슬라이드에서는 볼 수 없습니다.비디오가 조각 내에서 일시 중지되지 않습니다. ViewPager

더 자세히 검색하지만 해결책을 얻지 못 했으므로 도움이 될 것입니다. 미리 감사드립니다.

이 조각 클래스

public class ContentFragment extends Fragment { 
    private final String imageResourceId; 
    private String type; 


    public ContentFragment(String imageResourceId,String type) { 
     System.out.println("Path In cons="+imageResourceId+"and type is="+type); 
     this.imageResourceId = imageResourceId; 
     this.type= type; 
    } 


    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Log.e("Test", "hello"); 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 

    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 

     View view = inflater.inflate(R.layout.content_layout, container, false); 

     TouchImageView imageView = (TouchImageView) view.findViewById(R.id.touchImage); 
     imageView.setImageResource(R.id.touchImage); 
     imageView.setMaxZoom(10f); 
     VideoView videoView =(VideoView) view.findViewById(R.id.videoView1); 

     if(type.equals("image")) { 
      imageView.invalidate(); 

      imageView.setVisibility(View.VISIBLE); 
      videoView.setVisibility(View.GONE); 

      try { 
       System.out.println("IN Content Fragment"+imageResourceId.toString()); 

       Bitmap bmp = BitmapFactory.decodeFile(imageResourceId.toString()); 
       imageView.setImageBitmap(bmp); 

      } catch(Exception e) { 
       System.out.println("Error Of image File"+e); 
      } 


     } else 
     try { 
     if(type.equals("video")){ 
      videoView.invalidate(); 
      videoView.setVisibility(View.VISIBLE); 
      imageView.setVisibility(View.GONE); 

      String path = imageResourceId.toString(); 
      videoView.setVideoURI(Uri.parse(path)); 
       videoView.setMediaController(new MediaController(getActivity())); 
       videoView.setFocusable(true); 
       videoView.start(); 
      } 
     } catch(Exception e) { 
     e.printStackTrace(); 
     } 

     return view; 
    } 
} 

입니다 이것은 호출기 어댑터 활동을하다

public class MediaActivity extends FragmentActivity { 

    private MyAdapter mAdapter; 
     private ViewPager mPager; 


     public ArrayList<Content> contentList; 
    Context context; 
     LinearLayout numberOfPageLayout; 
    SharedPreferences sharedPreferences; 
    Handler progressHandler; 
     /** Called when the activity is first created. */ 
     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_media); 
      context=(Context) getApplicationContext();       
        mPager = (ViewPager) findViewById(R.id.pager); 
      progressHandler = new Handler(); 
      contentList=new ArrayList<Content>(); 
       new AsyncTask<Void, Void, Void>() { 

        @Override 
        protected Void doInBackground(Void... params) { 
         // TODO Auto-generated method stub 
         contentList=new ContentDBAdapter(context).getAllContent(); 

         }   
         return null; 
        } 
        @Override 
        protected void onPostExecute(Void result) { 
         // TODO Auto-generated method stub 
         super.onPostExecute(result); 
         mAdapter = new MyAdapter(getSupportFragmentManager(),contentList); 
         mPager.setAdapter(mAdapter); 
        } 
       }.execute(); 




      mPager.setOnPageChangeListener(new OnPageChangeListener() { 

       @Override 
       public void onPageSelected(int arg0) { 
        // TODO Auto-generated method stub 

       } 

       @Override 
       public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 
        // TODO Auto-generated method stub 


       } 

       @Override 
       public void onPageScrollStateChanged(int arg0) { 
        // TODO Auto-generated method stub 

       } 
      }); 
     } 


     public static class MyAdapter extends FragmentPagerAdapter { 
      ArrayList <Content>contList=new ArrayList<Content>(); 
      public MyAdapter(FragmentManager fm,ArrayList<Content> cont) { 
       super(fm); 
       this.contList=cont; 
      } 

      @Override 
      public int getCount() { 
       totalPage=contList.size(); 
       return contList.size(); 
      } 

      @Override 
      public Fragment getItem(int position) { 

       Content con=contList.get(position); 

       return new ContentFragment(con.getPath(),con.getType()); 

      } 
     } 

} 
+0

누구나 해결책을 말해 줄 수 있습니까? – Ankit

답변

9

ViewPager 오프 스크린 계속 조각을 시작하기 때문이다 :

여기 내 코드입니다. 예를 들어 사용자에게 조각을 볼 수 있습니다. ViewPager은 (왼쪽에서) 이전 조각을 유지하려고 시도하고 다음 조각 (오른쪽에서)이 시작됩니다. 이렇게하면 ViewPager이 다음 페이지와 이전 페이지가 이미 준비되어 있으므로 사용자가 페이지를 변경하기로 결정할 때 부드럽게 슬라이딩 할 수 있습니다.

경우에 따라 비디오 플레이어가 보이지 않지만 (화면이 꺼져 있음) 위의 동작으로 인해 ViewPager이 계속 재생됩니다. setOffscreenPageLimit() 메서드를 사용하여이 동작을 변경할 수 있습니다. 페이지 제한을 0으로 설정하면 오프 스크린 조각이 즉시 일시 중지됩니다. 불행히도 그들은 멈추지 않을뿐만 아니라 멈추어 활동에서 분리됩니다. 즉, 조각으로 돌아 가면 다시 전체 레이아웃을 다시 만듭니다. 따라서 Fragment.setUserVisibleHint() 또는 Fragment.onHiddenChanged() 중 하나를 무시하고 거기에서 일시 중지/재생 논리를 실행 해보세요. ViewPager은 조각이 실제로 사용자에게 표시되는지 여부에 따라 조각의 숨겨진 상태를 업데이트합니다.

희망이 도움이됩니다.

+0

답변을 주셔서 감사합니다 beworker,하지만 안드로이드 갤러리 애플 리케이션과 같은 다른 방법 으로이 문제를 해결, 나는 직접 그 비디오보기를 사용하고 있지 않습니다, 이미지보기에서 축소판을 가지고 그 작은 이미지를 클릭하면 비디오가 재생됩니다. 그러나 나는 당신의 해결책을 시도 할 것입니다. – Ankit

+1

감사합니다. @beworker, 그것은 나를 위해 일했습니다. – Umesh

4

비디오를 재생하는 조각에서 setUserVisibleHint 메서드를 재정의해야합니다.

public void setUserVisibleHint(boolean isVisibleToUser) {  
    super.setUserVisibleHint(isVisibleToUser);       
    if (this.isVisible()) 
    {    
     if (!isVisibleToUser) // If we are becoming invisible, then... 
     { 
      //pause or stop video 
     } 

     if (isVisibleToUser) 
     {        
      //play your video    
     } 

    } 

    } 
+0

내가 멈추거나 플레이어를 일시 정지 할 때 나는 예외가 있고 player.release()를 사용할 때; 플레이어를 멈추지 만 다음 비디오를 재생할 수 없거나 돌아 오는 경우 –

+0

코드를 게시하십시오. –

+0

새로운 질문으로 내 문제를 추가 할 것입니다. https://stackoverflow.com/questions/45052603/video-image-viewpager –

관련 문제