Android视频播放实现

接口和封装的请求类我就不写了,直接从MVP开始

首先V层

public interface IShouView {
    //轮播成功
    void onBar(ShouBean bean);
    //视频展示
    void onXiang(XiangBean bean);
}

M层内容

public class ShowModel {
    ScuMod scuMod;
 
    public void setScuMod(ScuMod scuMod) {
        this.scuMod = scuMod;
    }
    //轮播请求
    public void BarChen(){
        //OkHttp里面可以添加拦截器
        OkHttpClient ok = new OkHttpClient.Builder()
                .build();
        //请求数据
        RetrofitUnitl.getInstance("http://api.svipmovie.com/",ok)
                .setCreate(Inters.class)
                .getBar()
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeOn(Schedulers.io())
                .subscribe(new Subscriber<ShouBean>() {
                    @Override
                    public void onCompleted() {
                    }
                    @Override
                    public void onError(Throwable e) {
 
                    }
                    @Override
                    public void onNext(ShouBean bean) {
                        scuMod.onBanr(bean);
                    }
                });
    }
 
    //影片请求
    public void XiangChen(int punm){
        //OkHttp里面可以添加拦截器
        OkHttpClient ok = new OkHttpClient.Builder()
                .build();
        //请求数据
        RetrofitUnitl.getInstance("http://api.svipmovie.com/",ok)
                .setCreate(Inters.class)
                .getXiang(punm)
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeOn(Schedulers.io())
                .subscribe(new Subscriber<XiangBean>() {
                    @Override
                    public void onCompleted() {
                    }
                    @Override
                    public void onError(Throwable e) {
 
                    }
                    @Override
                    public void onNext(XiangBean bean) {
                        scuMod.onXiang(bean);
                    }
                });
    }
    //定义一个接口
    public interface ScuMod{
        void onBanr(ShouBean bean);
        void onXiang(XiangBean bean);
    }
}

P层


public class ShowPresenter implements ShowModel.ScuMod {
    IShouView view;
    ShowModel model;
 
    public ShowPresenter(IShouView view) {
        this.view = view;
        model = new ShowModel();
        model.setScuMod(this);
    }
 
    @Override
    public void onBanr(ShouBean bean) {
        view.onBar(bean);
    }
 
    @Override
    public void onXiang(XiangBean bean) {
        view.onXiang(bean);
    }
 
    //定义一个方法
    public void ShowBanr(){
        model.BarChen();
    }
    //定义一个方法
    public void ShowXiang(int pnum){
        model.XiangChen(pnum);
    }
}

主页面展示内容


public class MainActivity extends AppCompatActivity implements IShouView {
 
    @BindView(R.id.bar)
    Banner bar;
    @BindView(R.id.rv)
    RecyclerView rv;
    private ShowPresenter presenter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //找控件
        ButterKnife.bind(this);
        presenter = new ShowPresenter(this);
        presenter.ShowBanr();
       presenter.ShowXiang(getNextPage());
    }
 
    @Override
    public void onBar(ShouBean bean) {
        //轮播
        List<String> lists = new ArrayList<>();
        for (int i = 0; i < bean.getRet().getList().size(); i++) {
            lists.add(bean.getRet().getList().get(i).getChildList().get(0).getPic());
        }
        bar.setImageLoader(new MyApps());
        bar.setImages(lists);
        bar.start();
    }
    @Override
    public void onXiang(final XiangBean bean) {
     rv.setLayoutManager(new LinearLayoutManager(MainActivity.this));
     MyAdapter adapter = new MyAdapter(MainActivity.this,bean);
     rv.setAdapter(adapter);
     //点击跳转
        adapter.setOnItemClickListener(new MyAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(View view, int position) {
                Intent intent = new Intent(MainActivity.this,Zhan_Activity.class);
                intent.putExtra("pnum",bean.getRet().getPnum());
                startActivity(intent);
            }
        });
    }
    public int getNextPage() {
        int page = getRandomNumber(1, 108);
        return page;
    }
    public static int getRandomNumber(int min, int max) {
        return new Random().nextInt(max) % (max - min + 1) + min;
    }
}

布局


<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.xjq.lianxi.MainActivity">
 <LinearLayout
     android:layout_width="match_parent"
     android:layout_height="200dp"
     android:orientation="vertical"
     >
 
     <com.youth.banner.Banner
       android:id="@+id/bar"
       android:layout_width="match_parent"
       android:layout_height="match_parent">
 
         <EditText
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:hint="请输入内容" />
     </com.youth.banner.Banner>
 
 </LinearLayout>
    <TextView
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:text="精彩推荐"
        android:gravity="center_vertical"
        />
    <android.support.v7.widget.RecyclerView
        android:id="@+id/rv"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
 
    </android.support.v7.widget.RecyclerView>
 
</LinearLayout>

主布局的适配器

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyHolder> {
 
    private Context context;
    private XiangBean bean;
    private OnItemClickListener mOnItemClickListener;
 
    public MyAdapter(Context context, XiangBean bean) {
        this.context = context;
        this.bean = bean;
    }
    //点击的接口
    public interface OnItemClickListener{
        void onItemClick(View view,int position);
    }
    public void setOnItemClickListener(OnItemClickListener mOnItemClickListener){
        this.mOnItemClickListener = mOnItemClickListener;
    }
 
    @Override
    public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        //拿到我们自己定义的布局
        MyHolder holder = new MyHolder(LayoutInflater.from(context).inflate(R.layout.recyclerview_item1, parent, false));
        return holder;
    }
 
    @Override
    public void onBindViewHolder(final MyHolder holder, final int position) {
        //加载文字
        holder.tv.setText(bean.getRet().getList().get(position).getTitle());
        Uri uri=Uri.parse(bean.getRet().getList().get(position).getPic());
        //图片构造者
        DraweeController controller = Fresco.newDraweeControllerBuilder()
                .setUri(uri)
                .setAutoPlayAnimations(true)
                .build();
        holder.simpleDraweeView.setController(controller);
        //判断图片点击
        if(mOnItemClickListener != null){
            holder.simpleDraweeView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    mOnItemClickListener.onItemClick(holder.simpleDraweeView,position);
                }
            });
        }
    }
    @Override
    public int getItemCount() {
        return bean.getRet().getList().size();
    }
    class MyHolder extends RecyclerView.ViewHolder {
        SimpleDraweeView simpleDraweeView;
        TextView tv;
 
        public MyHolder(View itemView) {
            super(itemView);
            simpleDraweeView=itemView.findViewById(R.id.sv);
            tv = itemView.findViewById(R.id.tv);
        }
    }

}

主布局适配器布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    >
 
    <com.facebook.drawee.view.SimpleDraweeView
        android:id="@+id/sv"
        android:layout_width="match_parent"
        android:layout_height="200dp" />
    <TextView
        android:id="@+id/tv"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:text="名字"
        android:gravity="center"
        />
 
</LinearLayout>

跳转播放Activity


public class Zhan_Activity extends FragmentActivity {
    @BindView(R.id.rg)
    RadioGroup rg;
    @BindView(R.id.zhan_vp)
    ViewPager zhanVp;
    List<Fragment> list = new ArrayList<>();
    private JCVideoPlayerStandard jcVideoPlayerStandard;
    String s1 = "http://ips.ifeng.com/video19.ifeng.com/video09/2014/06/16/1989823-102-086-0009.mp4";
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_zhan);
        ButterKnife.bind(this);
        jcVideoPlayerStandard = findViewById(R.id.js);
        jcVideoPlayerStandard.setUp(s1, jcVideoPlayerStandard.SCREEN_LAYOUT_NORMAL, "视频标题");
        //拿到fragment
        initData();
        //拿到适配器
        MyPapy papy = new MyPapy(getSupportFragmentManager());
        rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup radioGroup, int i) {
                switch (i){
                    case R.id.rb1:
                        zhanVp.setCurrentItem(0);
                        break;
                    case R.id.rb2:
                        zhanVp.setCurrentItem(1);
                        break;
                    default:
                        break;
                }
            }
        });
        zhanVp.setAdapter(papy);
        //点击事件
        zhanVp.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            }
 
            @Override
            public void onPageSelected(int position) {
                switch (position){
                    case 0:
                      rg.check(R.id.rb1);
                        break;
                    case 1:
                        rg.check(R.id.rb2);
                        break;
                        default:
                            break;
                }
            }
 
            @Override
            public void onPageScrollStateChanged(int state) {
 
            }
        });
    }
 
    private void initData() {
        list.add(new Fragment1());
        list.add(new Fragment2());
    }
 
    @Override
    public void onBackPressed() {
        if (JCVideoPlayer.backPress()) {
            return;
        }
        super.onBackPressed();
    }
    //fragment适配器
  class  MyPapy extends FragmentPagerAdapter{
 
      public MyPapy(FragmentManager fm) {
          super(fm);
      }
      @Override
      public Fragment getItem(int position) {
          return list.get(position);
      }
 
      @Override
      public int getCount() {
          return list.size();
      }
  }

}

布局

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.xjq.lianxi.Zhan_Activity">
 
    <fm.jiecao.jcvideoplayer_lib.JCVideoPlayerStandard
        android:id="@+id/js"
        android:layout_width="match_parent"
        android:layout_height="300dp">
    </fm.jiecao.jcvideoplayer_lib.JCVideoPlayerStandard>
    <RadioGroup
        android:id="@+id/rg"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:orientation="horizontal"
        >
        <RadioButton
            android:id="@+id/rb1"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="match_parent"
            android:button="@null"
            android:text="简介"
            android:gravity="center"
            />
        <RadioButton
            android:id="@+id/rb2"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="match_parent"
            android:button="@null"
            android:text="评论"
            android:gravity="center"
            />
    </RadioGroup>
    <android.support.v4.view.ViewPager
        android:id="@+id/zhan_vp"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
 
    </android.support.v4.view.ViewPager>
 
</LinearLayout>

简介Fragment


public class Fragment1 extends Fragment implements IShouView {
 
    public int cont;
    @BindView(R.id.f1_tv)
    TextView f1Tv;
    @BindView(R.id.f1_rv)
    RecyclerView f1Rv;
    Unbinder unbinder;
    public ShowPresenter presenter;
 
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = View.inflate(getContext(), R.layout.fragm_1, null);
        presenter = new ShowPresenter(this);
        presenter.ShowXiang(cont);
        Intent intent = getActivity().getIntent();
        cont = intent.getIntExtra("pnum", 0);
        unbinder = ButterKnife.bind(this, view);
        return view;
    }
 
    @Override
    public void onDestroyView() {
        super.onDestroyView();
        unbinder.unbind();
    }
 
    @Override
    public void onBar(ShouBean bean) {
    }
 
    @Override
    public void onXiang(XiangBean bean) {
     cont = bean.getRet().getPnum();
     f1Tv.setText(bean.getRet().getList().get(8).getDescription());
     f1Rv.setLayoutManager(new GridLayoutManager(getActivity(),2));
        XiangAdapter adapter = new XiangAdapter(getActivity(),bean);
        f1Rv.setAdapter(adapter);
    }

}

简介的布局


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >
    <TextView
        android:id="@+id/f1_tv"
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:text="电影详解"
        />
    <android.support.v7.widget.RecyclerView
        android:id="@+id/f1_rv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"></android.support.v7.widget.RecyclerView>
</LinearLayout>

评价的Fragment就不写了

最后的配置和依赖我也不写了,说一下jiecaovoideoplayer的配置,点击下面的连接详细看吧

jiecaovideoplayer简单使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值