Android-在线视频播放器实现

1 前言

在线视频播放
搜索
分类
全屏
评论列表
收藏数
分享数
分享
热门搜索词
清除缓存
每日图片


效果图如下:




以上四张效果图,仅仅展示了主页的UI,本想录制视频,但是都超过了大小限制,无法上传。

2 申明

以上效果图以及整个在线视频APP的代码,仅仅作为学习交流之用,不可用于任何商业之用,由此出现的任何问题与作者本人无关!

3 架构设计

3.1 模块化

整个APP的架构设计模块化开发,大的方向上设计四个模块,分别对应首页的四个fragment。

    if (isNeedHomeModule.toBoolean()) {
        api project(':module_home')
    }
    if (isNeedChatModule.toBoolean()) {
        api project(':module_chat')
    }
    if (isNeedRecomModule.toBoolean()) {
        api project(':module_recom')
    }
    if (isNeedMeModule.toBoolean()) {
        api project(':module_me')
    }

在这里插入图片描述
以上四个模块作为APP的主要模块,四个模块之间不可直接交互应用,他们之间的交互全部通过ARouter路由进行。

在这四个模块之下,有lib_icon模块、lib_base模块、network模块,这三个模块为以上四个主要模块提供支持。
lib_icon模块提供整个APP的资源支持,公共资源均可以放在这里
lib_base模块提供主要代码级别的支持,主要基类,公用类等
network模块提供整个APP的网络请求支持

另外需要说明的是,上面的四个主要模块可以作为APP主要的入口,由此四个模块可单独运行测试,如果在APP体量特别大的情况下,能够单独运行,大大减小测试开发力度。这也是ARouter的一个好处。

3.2 MVP
public interface IView {
}
public interface IPresenter {
    /**
     * destroy
     */
    void destroy();
}
public abstract class BasePresenter<T extends IView> implements IPresenter {

    protected T iView;
    public BasePresenter(T iView) {
        this.iView = iView;
    }

    @Override
    public void destroy() {
        iView = null;
    }
}

以上涉及IView接口扩展整个UI包括activity和fragment。
BasePresenter抽象类类实现UI相关的逻辑

举例欢迎页

public interface LaunchContract {

    interface LaunchView extends IView {
        /**
         * 设置首页图片
         * @param url string
         */
        void showFlash(String url);

        /**
         * load launch fail
         */
        void loadLaunchFail();
    }

    interface LaunchPresenter {
        /**
         * 获取图片
         */
        void getImage();
    }

}

欢迎页LaunchContract 接口包括了两个接口,这两个接口中声明了UI和presenter交互的接口,实现类中实现这两个接口即可,并且,view和presenter的交互只有以上声明的方法才能调用,这样逻辑清晰。

欢迎页实现类如下:

public class LaunchActivity extends BaseActivity implements LaunchContract.LaunchView {

    private static final int SLEEP_TIME = 6000;
    private static final int REQUEST_PERMISSION_SETTING = 99;
    @BindView(R.id.splash_root)
    ImageView mSplashRoot;

    private LaunchPresenter mLaunchPresenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_launch);
        mUnBinder = ButterKnife.bind(this);
        mLaunchPresenter = new LaunchPresenter(this);
        requestPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE,
                Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.READ_PHONE_STATE);
    }

    @Override
    public void showFlash(String url) {
        GlideUtil.Companion.showImage(LaunchActivity.this, mSplashRoot, url, new GlideUtil.Companion.ImageListener() {
            @Override
            public void onFailed() {

            }

            @Override
            public void onReady(@NotNull Drawable resource) {
                runAlphaAnim(resource);
            }
        });
    }
    ....................................
}

LaunchActivity 类实现LaunchContract.LaunchView接口,声明LaunchPresenter对象

public class LaunchPresenter extends BasePresenter<LaunchContract.LaunchView> implements LaunchContract.LaunchPresenter {

    public LaunchPresenter(LaunchContract.LaunchView iView) {
        super(iView);
    }

    @Override
    public void getImage() {
        
    }

}

LaunchPresenter 类实现LaunchContract.LaunchPresenter接口

以上整个MVP的逻辑架构,将逻辑与UI分离,代码更加清晰。

4 开发环境

Java1.8
Kotlin
Android 28
Android build tools 28.0.3
Android Studio 3.5

Gradle plugin tool version 3.1.0
Gradle 4.10.1

5 主要三方库

	// a router
    api "com.alibaba:arouter-api:${rootProject.ext.arouter_api_v}"
    kapt "com.alibaba:arouter-compiler:${rootProject.ext.arouter_compile_v}"

    // fast json
    api "com.alibaba:fastjson:${rootProject.ext.fast_json_v}"

    // retrofit
    api "com.squareup.retrofit2:retrofit:${rootProject.ext.retrofit_v}"
    api "com.squareup.retrofit2:converter-gson:${rootProject.ext.retrofit_v}"

    // butter knife
    api "com.jakewharton:butterknife:${rootProject.ext.butter_knife_v}"
    kapt "com.jakewharton:butterknife-compiler:${rootProject.ext.butter_knife_v}"

    // leak canary
    debugApi "com.squareup.leakcanary:leakcanary-android:${rootProject.ext.leakcanary_v}"
    releaseApi "com.squareup.leakcanary:leakcanary-android-no-op:${rootProject.ext.leakcanary_v}"
    debugApi "com.squareup.leakcanary:leakcanary-support-fragment:${rootProject.ext.leakcanary_v}"

    // rxjava
    api "io.reactivex.rxjava2:rxjava:${rootProject.ext.rxjava_v}"
    api "io.reactivex.rxjava2:rxandroid:${rootProject.ext.rxandroid_v}"
    api 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'

    //android event bus
    api "org.simple:androideventbus:${rootProject.ext.android_event_bus_v}"

    // event bus
    api "org.greenrobot:eventbus:${rootProject.ext.eventbus_v}"

    //glide
    api("com.github.bumptech.glide:glide:${rootProject.ext.glide_v}") {
        exclude group: "com.android.support"
    }
    annotationProcessor "com.github.bumptech.glide:compiler:${rootProject.ext.glide_v}"
    kapt "com.github.bumptech.glide:compiler:${rootProject.ext.glide_v}"
    api "com.android.support:multidex:${rootProject.ext.multidex_v}"

    api 'com.youth.banner:banner:1.4.10'
    api 'com.hyman:flowlayout-lib:1.1.2'
    api 'cn.jzvd:jiaozivideoplayer:7.0.5'
    api 'cn.carbs.android:ExpandableTextView:1.0.3'

代码就不公开了,想要源代码的同学,给我发邮件吧(nyyin@qq.com)

再次声明,代码仅仅学习之用,严禁商业之用~!


欢迎关注公众号:技术印象

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值