Android视频做闪屏页

本文介绍了一种实现全屏视频播放的Fragment懒加载方案,该方案能够在Fragment可见时加载视频资源并播放,不可见时停止加载,有效解决Fragment预加载问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.example.test;


import android.content.Context;
import android.util.AttributeSet;
import android.widget.VideoView;


/**
 * Function:
 * Created by watire on 2016/12/26.
 */


public class FullScreenVideoView extends VideoView {


    public FullScreenVideoView(Context context) {
        super(context);
    }


    public FullScreenVideoView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }


    public FullScreenVideoView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }


    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        setMeasuredDimension(getDefaultSize(0, widthMeasureSpec), getDefaultSize(0, heightMeasureSpec));
    }
    

}

package com.example.test;


import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;


/**
 * Fragment预加载问题的解决方案:
 * 1.可以懒加载的Fragment
 * 2.切换到其他页面时停止加载数据(可选)
 * Created by yuandl on 2016-11-17.
 */


public abstract class LazyLoadFragment extends Fragment {
    /**
     * 视图是否已经初初始化
     */
    protected boolean isInit = false;
    protected boolean isLoad = false;
    protected final String TAG = "LazyLoadFragment";
    private View view;


    @Override
    public View onCreateView(LayoutInflater inflater,  ViewGroup container,  Bundle savedInstanceState) {
        view = inflater.inflate(setContentView(), container, false);
        isInit = true;
        /**初始化的时候去加载数据**/
        isCanLoadData();
        return view;
    }


    /**
     * 视图是否已经对用户可见,系统的方法
     */
    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        isCanLoadData();
    }


    /**
     * 是否可以加载数据
     * 可以加载数据的条件:
     * 1.视图已经初始化
     * 2.视图对用户可见
     */
    private void isCanLoadData() {
        if (!isInit) {
            return;
        }


        if (getUserVisibleHint()) {
            lazyLoad();
            isLoad = true;
        } else {
            if (isLoad) {
                stopLoad();
            }
        }
    }


    /**
     * 视图销毁的时候讲Fragment是否初始化的状态变为false
     */
    @Override
    public void onDestroyView() {
        super.onDestroyView();
        isInit = false;
        isLoad = false;


    }


    protected void showToast(String message) {
        if (!TextUtils.isEmpty(message)) {
//            Toast.makeText(getContext(), message, Toast.LENGTH_SHORT).show();
        }


    }


    /**
     * 设置Fragment要显示的布局
     *
     * @return 布局的layoutId
     */
    protected abstract int setContentView();


    /**
     * 获取设置的布局
     *
     * @return
     */
    protected View getContentView() {
        return view;
    }


    /**
     * 找出对应的控件
     *
     * @param id
     * @param <T>
     * @return
     */
    protected <T extends View> T findViewById(int id) {


        return (T) getContentView().findViewById(id);
    }


    /**
     * 当视图初始化并且对用户可见的时候去真正的加载数据
     */
    protected abstract void lazyLoad();


    /**
     * 当视图已经对用户不可见并且加载过数据,如果需要在切换到其他页面时停止加载数据,可以调用此方法
     */
    protected void stopLoad() {
    }
}



package com.example.test;


import android.media.MediaPlayer;
import android.support.v4.app.FragmentActivity;
import android.widget.ImageView;
import android.widget.Toast;


/**
 * Function:
 * Created by dubin on 2016/12/26.
 */


public class VideoItemFragment extends LazyLoadFragment
        implements MediaPlayer.OnCompletionListener, MediaPlayer.OnErrorListener, MediaPlayer.OnPreparedListener {


    private boolean mHasPaused;
    private int mVideoPosition;
    private int position;
    private int videoRes;
    private int imgRes;
    private FullScreenVideoView mVideoView;
    private ImageView mvSlogan;




    public VideoItemFragment() {
        mHasPaused = false;
        mVideoPosition = 0;
    }


    @Override
    protected int setContentView() {
        return R.layout.video_viewpager_item;
    }
//开始加载数据 播放视频
    @Override
    protected void lazyLoad() {
        if (getArguments() == null) {
            return;
        }
        position = getArguments().getInt("position");
        videoRes = getArguments().getInt("videoRes");
        imgRes = getArguments().getInt("imgRes");


        mVideoView = findViewById(R.id.vvSplash);
        mvSlogan = findViewById(R.id.ivSlogan);
        mVideoView.setOnErrorListener(this);
        mVideoView.setOnPreparedListener(this);
        mVideoView.setVideoPath("android.resource://" + getActivity().getPackageName() + "/" + videoRes);
        mvSlogan.setImageResource(imgRes);


    }


    @Override
    protected void stopLoad() {
        super.stopLoad();
        if (mVideoView != null) {
            mVideoView.stopPlayback();
        }
    }


    @Override
    public void onCompletion(MediaPlayer mediaPlayer) {
   
   
    Toast.makeText(getActivity(), "结束", 1).show();
        FragmentActivity localFragmentActivity = getActivity();
        if ((localFragmentActivity != null) && ((localFragmentActivity instanceof FullscreenActivity))) {
            ((FullscreenActivity) localFragmentActivity).next(position);
        }
    }


    @Override
    public boolean onError(MediaPlayer mediaPlayer, int i, int i1) {
        FragmentActivity localFragmentActivity = getActivity();
        if ((localFragmentActivity != null) && ((localFragmentActivity instanceof FullscreenActivity))) {
            ((FullscreenActivity) localFragmentActivity).next(position);
        }
        return true;
    }


    @Override
    public void onPrepared(MediaPlayer mediaPlayer) {
            if (mVideoView != null) {
                mVideoView.requestFocus();
                mVideoView.setOnCompletionListener(this);
                mVideoView.seekTo(0);
                mVideoView.start();
            }
            return;


    }




    @Override
    public void onResume() {
        super.onResume();
        if (mHasPaused) {
            if (mVideoView != null) {
                mVideoView.seekTo(mVideoPosition);
                mVideoView.resume();
            }
        }
        return;
    }


    @Override
    public void onPause() {
        super.onPause();
        if (mVideoView != null) {
            mVideoPosition = mVideoView.getCurrentPosition();
        }
        mHasPaused = true;
    }


    public void onDestroy() {
        super.onDestroy();
        if (mVideoView != null) {
            mVideoView.stopPlayback();
        }
        return;
    }


    public void pause() {
        if ((mVideoView != null) && (mVideoView.canPause())) {
            mVideoView.setOnCompletionListener(null);
            mVideoView.pause();
        }
        return;


    }


    public void play() {
        if (mVideoView != null) {
            mVideoView.requestFocus();
            mVideoView.setOnCompletionListener(this);
            mVideoView.seekTo(0);
        } else {
            return;
        }
        mVideoView.start();
    }


    public void reLoadVideo() {
        if (mVideoView != null) {
            mVideoView.setVideoPath("android.resource://" + getActivity().getPackageName() + "/" + videoRes);
        }
    }


}


package com.example.test;


import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.view.ViewPager;


/**
 * Function: Created by dubin on 2016/12/26.
 */
public class FullscreenActivity extends FragmentActivity implements
ViewPager.OnPageChangeListener {


private ExtendedViewPager mVpVideo;


private ViewPagerAdapter mVpAdapter;
private FullScreenVideoView mVideoView;


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);


setContentView(R.layout.activity_fullscreen);


mVpVideo = (ExtendedViewPager) findViewById(R.id.vp_video);
mVpAdapter = new ViewPagerAdapter(getSupportFragmentManager());
mVpVideo.setAdapter(mVpAdapter);
mVpVideo.setOffscreenPageLimit(1);




}


class ViewPagerAdapter extends FragmentStatePagerAdapter {
private final int[] videoRes;


public ViewPagerAdapter(FragmentManager paramFragmentManager) {
super(paramFragmentManager);
this.videoRes = new int[] { R.raw.splash_1 };


}


public int getCount() {
return this.videoRes.length;
}


public Fragment getItem(int paramInt) {
VideoItemFragment videoItemFragment = new VideoItemFragment();
Bundle localBundle = new Bundle();
localBundle.putInt("position", paramInt);
localBundle.putInt("videoRes", this.videoRes[paramInt]);
// localBundle.putInt("imgRes", this.slogonImgRes[paramInt]);
videoItemFragment.setArguments(localBundle);
if (paramInt < getCount()) {
return videoItemFragment;
}
throw new RuntimeException("Position out of range. Adapter has "
+ getCount() + " items");
}
}


public void next(int positon) {
int i = this.mVpVideo.getCurrentItem();
if (positon == i) {
positon += 1;


this.mVpVideo.setCurrentItem(positon, true);
}
}


@Override
public void onPageScrolled(int position, float positionOffset,
int positionOffsetPixels) {


}


@Override
public void onPageSelected(int position) {
((VideoItemFragment) (mVpAdapter.getItem(position))).play();
}


@Override
public void onPageScrollStateChanged(int state) {


}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值