Browse Source

短视频和上拉加载

詹子聪 5 years ago
parent
commit
5dfb99f842

+ 6 - 1
app/build.gradle

@@ -120,7 +120,7 @@ dependencies {
 
     //饺子视频播放器
     //implementation (name: 'jiaozivideoplayer-7.4.2', ext: 'aar')
-    //implementation 'cn.jzvd:jiaozivideoplayer:7.4.2'
+    implementation 'cn.jzvd:jiaozivideoplayer:7.4.2'
 
     // 右划销毁Activity,另外:sockeqwe/SwipeBack也可以参考
     //implementation 'com.aitangba:swipeback:1.0.3'
@@ -131,6 +131,11 @@ dependencies {
 
     implementation 'cn.hutool:hutool-all:5.4.3'
     implementation 'com.alibaba:fastjson:1.2.73'
+
+    // 下拉刷新,上拉加载更多
+    implementation  'com.scwang.smart:refresh-layout-kernel:2.0.1'
+    //implementation  'com.scwang.smart:refresh-footer-ball:2.0.1'
+    implementation  'com.scwang.smart:refresh-footer-classics:2.0.1'
 }
 repositories {
     mavenCentral()

+ 6 - 36
app/src/main/AndroidManifest.xml

@@ -43,58 +43,28 @@
             </intent-filter>
         </activity>
 
-        <activity
-            android:name="com.miekir.eden.ui.mine.register.RegisterActivity"
-            android:screenOrientation="portrait"
-            android:theme="@style/TextInputStyle"
-            android:windowSoftInputMode="stateVisible|adjustResize"/>
-
-        <activity
-            android:name="com.miekir.eden.ui.mine.register.fill.FillDataActivity"
-            android:screenOrientation="portrait"
-            android:theme="@style/TextInputStyle" />
-
-        <activity
-            android:name="com.miekir.eden.ui.mine.forget.ForgetActivity"
-            android:screenOrientation="portrait"
-            android:theme="@style/TextInputStyle" />
-
         <activity
             android:name="com.miekir.eden.ui.mine.MineActivity"
             android:screenOrientation="portrait"
             android:theme="@style/TextInputStyle" />
 
-        <activity
-            android:name="com.miekir.eden.ui.mine.coupon.AddPhotoActivity"
-            android:screenOrientation="portrait"
-            android:theme="@style/TextInputStyle" />
-
         <activity
             android:name="com.miekir.eden.ui.home.search.SearchActivity"
             android:screenOrientation="portrait"
             android:theme="@style/TextInputStyle" />
 
-        <activity
-            android:name="com.miekir.eden.ui.home.tool.json.JsonActivity"
-            android:screenOrientation="portrait"
-            android:theme="@style/TextInputStyle" />
-
-        <activity
-            android:name="com.miekir.eden.ui.home.tool.weather.WeatherActivity"
-            android:screenOrientation="portrait"
-            android:theme="@style/TextInputStyle" />
-
-        <activity
-            android:name="com.miekir.eden.ui.home.tool.yiji.YijiActivity"
-            android:screenOrientation="portrait"
-            android:theme="@style/TextInputStyle" />
-
         <activity
             android:name="com.miekir.eden.ui.home.goods.play.VideoPlayActivity"
             android:configChanges="orientation|screenSize|keyboardHidden"
             android:screenOrientation="landscape"
             android:theme="@android:style/Theme.Light.NoTitleBar.Fullscreen" />
 
+        <activity
+            android:name=".ui.home.video.KwyVideoActivity"
+            android:configChanges="orientation|screenSize|keyboardHidden"
+            android:screenOrientation="portrait"
+            android:theme="@style/VideoTheme" />
+
         <activity
             android:name="com.miekir.eden.ui.home.goods.detail.GoodsDetailActivity"
             android:screenOrientation="portrait"

+ 8 - 4
app/src/main/java/com/miekir/eden/manager/EdenManager.java

@@ -19,7 +19,7 @@ public class EdenManager {
     private SystemBean systemBean;
 
     private boolean isKwyPhotoReady;
-    private boolean isKwyVideoReady;
+    private String videoUrl;
 
     public static EdenManager getInstance() {
         if (edenManager == null) {
@@ -62,11 +62,15 @@ public class EdenManager {
     }
 
     public boolean isKwyVideoReady() {
-        return isKwyVideoReady;
+        return !TextUtils.isEmpty(videoUrl);
     }
 
-    public void setKwyVideoReady(boolean kwyVideoReady) {
-        isKwyVideoReady = kwyVideoReady;
+    public String getVideoUrl() {
+        return videoUrl;
+    }
+
+    public void setVideoUrl(String videoUrl) {
+        this.videoUrl = videoUrl;
     }
 
     public boolean isLogin() {

+ 12 - 1
app/src/main/java/com/miekir/eden/ui/TabActivity.java

@@ -24,6 +24,7 @@ import com.miekir.eden.base.BaseBeiActivity;
 import com.miekir.eden.base.ITopActionListener;
 import com.miekir.eden.bean.UpgradeBean;
 import com.miekir.eden.common.ICommonView;
+import com.miekir.eden.manager.EdenManager;
 import com.miekir.eden.tool.StringTool;
 import com.miekir.eden.tool.SystemTool;
 import com.miekir.eden.ui.function.FunctionFragment;
@@ -32,6 +33,7 @@ import com.miekir.eden.ui.home.about.upgrade.UpgradePresenter;
 import com.miekir.eden.ui.home.coupon.TemplateFragment;
 import com.miekir.eden.ui.home.goods.GoodsFragment;
 import com.miekir.eden.ui.home.search.SearchActivity;
+import com.miekir.eden.ui.home.video.VideoFragment;
 import com.miekir.eden.ui.mine.MineActivity;
 import com.miekir.eden.ui.mine.login.LoginActivity;
 import com.miekir.eden.widget.AppbarTranslateListener;
@@ -64,14 +66,23 @@ public class TabActivity extends BaseBeiActivity implements View.OnClickListener
 
     @Override
     public void initViews(Bundle savedInstanceState) {
-        String[] titles = {StringTool.getString(R.string.title_recommend), StringTool.getString(R.string.title_photo), StringTool.getString(R.string.title_about)};
+        List<String> titleList = new ArrayList<>();
         List<Fragment> fragments = new ArrayList<>();
         fragments.add(new GoodsFragment());
         fragments.add(new TemplateFragment(FunctionFragment.TEMPLATE_TYPE_BONUS));
+        titleList.add(StringTool.getString(R.string.title_recommend));
+        titleList.add(StringTool.getString(R.string.title_photo));
+        if (EdenManager.getInstance().isKwyVideoReady()) {
+            fragments.add(new VideoFragment());
+            titleList.add(StringTool.getString(R.string.title_video));
+        }
         //fragments.add(new TemplateFragment(FunctionFragment.TEMPLATE_TYPE_TEMPLATE));
         //fragments.add(new ToolFragment());
+        titleList.add(StringTool.getString(R.string.title_about));
         fragments.add(new AboutFragment());
 
+        String[] titles = new String[titleList.size()];
+        titles = titleList.toArray(titles);
         ViewPager vp_main = findViewById(R.id.vp_main);
         TabFragmentAdapter adapter = new TabFragmentAdapter(getSupportFragmentManager(), fragments);
         vp_main.setAdapter(adapter);

+ 146 - 0
app/src/main/java/com/miekir/eden/ui/home/video/KwyVideoActivity.java

@@ -0,0 +1,146 @@
+package com.miekir.eden.ui.home.video;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import com.alibaba.fastjson.JSON;
+import com.miekir.common.utils.ToastTool;
+import com.miekir.eden.R;
+import com.miekir.eden.kawayi.API;
+import com.miekir.eden.kawayi.bean.BaseBean;
+import com.miekir.eden.manager.EdenManager;
+import com.miekir.eden.tool.StringTool;
+import com.scwang.smart.refresh.layout.SmartRefreshLayout;
+import com.scwang.smart.refresh.layout.api.RefreshLayout;
+import com.scwang.smart.refresh.layout.listener.OnLoadMoreListener;
+
+import cn.hutool.http.HttpUtil;
+import cn.jzvd.JZDataSource;
+import cn.jzvd.Jzvd;
+import cn.jzvd.JzvdStd;
+import io.reactivex.Observable;
+import io.reactivex.ObservableEmitter;
+import io.reactivex.ObservableOnSubscribe;
+import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.functions.Action;
+import io.reactivex.schedulers.Schedulers;
+
+
+/**
+ * Copyright (C), 2019-2020, Miekir
+ *
+ * @author Miekir
+ * @date 2020/8/25 11:28
+ * Description: 视频播放类,这是一个全屏的界面
+ */
+public class KwyVideoActivity extends Activity {
+    public static final String KEY_URL = "url";
+    public static final String KEY_TITLE = "title";
+    private String mTitle;
+
+    private JzvdStd js_video;
+    private SmartRefreshLayout srl_video;
+    private boolean mIsLoading;
+
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_video_play);
+
+        String url = getIntent().getStringExtra(KEY_URL);
+        String title = getIntent().getStringExtra(KEY_TITLE);
+        mTitle = StringTool.getString(R.string.video_beauty);
+        js_video = findViewById(R.id.js_video);
+
+        Jzvd.WIFI_TIP_DIALOG_SHOWED = true;
+        // 直接播放视频
+        VideoPlayer.setVideoPlayListener(new VideoPlayer.VideoPlayListener() {
+            @Override
+            public void onPlayComplete() {
+                //finish();
+            }
+        });
+        JzvdStd.setCurrentJzvd(VideoPlayer.CURRENT_JZVD);
+        js_video.setUp(EdenManager.getInstance().getVideoUrl(), mTitle);
+        js_video.startVideo();
+        srl_video = findViewById(R.id.srl_video);
+        srl_video.setEnableRefresh(false);
+        srl_video.setOnLoadMoreListener(new OnLoadMoreListener() {
+            @Override
+            public void onLoadMore(@NonNull RefreshLayout refreshLayout) {
+                if (!mIsLoading) {
+                    mIsLoading = true;
+                    playNextVideo();
+                }
+            }
+        });
+    }
+
+    @Override
+    public void onBackPressed() {
+        Jzvd.backPress();
+        super.onBackPressed();
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        JzvdStd.goOnPlayOnResume();
+    }
+
+    @Override
+    protected void onPause() {
+        super.onPause();
+        JzvdStd.goOnPlayOnPause();
+    }
+
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+        JzvdStd.releaseAllVideos();
+        VideoPlayer.setVideoPlayListener(null);
+    }
+
+    private void playNextVideo() {
+        Observable<String> observable = Observable.create(new ObservableOnSubscribe<String>() {
+            @Override
+            //将事件发射出去,持有观察者的对象
+            public void subscribe(ObservableEmitter<String> e) throws Exception {
+                String videoResult = HttpUtil.get(API.VIDEO, 5000);
+                try {
+                    BaseBean baseBean = JSON.parseObject(videoResult, BaseBean.class);
+                    String videoUrl = baseBean.getJson();
+                    e.onNext(videoUrl);
+                    e.onComplete();
+                } catch (Exception videoException) {
+                    videoException.printStackTrace();
+                    e.onError(new Exception());
+                }
+            }
+        });
+
+        observable.observeOn(AndroidSchedulers.mainThread())
+                .subscribeOn(Schedulers.io())
+                .doOnNext(result -> {
+                    mIsLoading = false;
+                    srl_video.finishLoadMore();
+                    //JzvdStd.startFullscreenDirectly(this, VideoPlayer.class, result, mTitle);
+                    JZDataSource dataSource = new JZDataSource(result, mTitle);
+                    js_video.changeUrl(dataSource, 0);
+                })
+                .doOnError(err -> {
+                    mIsLoading = false;
+                    srl_video.finishLoadMore();
+                    ToastTool.showShort(StringTool.getString(R.string.video_get_failed));
+                    err.printStackTrace();
+                })
+                .doOnComplete(new Action() {
+                    @Override
+                    public void run() throws Exception {
+                    }
+                }).subscribe();
+    }
+}

+ 44 - 0
app/src/main/java/com/miekir/eden/ui/home/video/VideoFragment.java

@@ -0,0 +1,44 @@
+package com.miekir.eden.ui.home.video;
+
+
+import android.content.Intent;
+import android.view.View;
+
+import com.miekir.eden.R;
+import com.miekir.mvp.view.BaseMVPFragment;
+
+/**
+ * Copyright (C), 2019-2020, Miekir
+ *
+ * @author Miekir
+ * @date 2020/9/20 19:23
+ * Description: 短视频
+ */
+public class VideoFragment extends BaseMVPFragment implements View.OnClickListener {
+
+    @Override
+    protected void onViewInit() {
+        rootView.findViewById(R.id.cv_video).setOnClickListener(this);
+    }
+
+    @Override
+    protected void onLazyLoad() {
+
+    }
+
+    @Override
+    public int getLayoutResId() {
+        return R.layout.fragment_video;
+    }
+
+    @Override
+    public void onClick(View v) {
+        switch (v.getId()) {
+            case R.id.cv_video:
+                startActivity(new Intent(getActivity(), KwyVideoActivity.class));
+                break;
+            default:
+                break;
+        }
+    }
+}

+ 50 - 0
app/src/main/java/com/miekir/eden/ui/home/video/VideoPlayer.java

@@ -0,0 +1,50 @@
+package com.miekir.eden.ui.home.video;
+
+import android.content.Context;
+import android.util.AttributeSet;
+
+import cn.jzvd.JzvdStd;
+
+/**
+ * Copyright (C), 2019-2020, Miekir
+ *
+ * @author Miekir
+ * @date 2020/8/25 14:29
+ * Description: 视频播放
+ */
+public class VideoPlayer extends JzvdStd {
+
+    public VideoPlayer(Context context) {
+        super(context);
+    }
+
+    public VideoPlayer(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    @Override
+    public void onStateAutoComplete() {
+        super.onStateAutoComplete();
+        if (mVideoPlayListener != null) {
+            mVideoPlayListener.onPlayComplete();
+        }
+    }
+
+    @Override
+    protected void clickBack() {
+        super.clickBack();
+        if (mVideoPlayListener != null) {
+            mVideoPlayListener.onPlayComplete();
+        }
+    }
+
+    private static VideoPlayListener mVideoPlayListener;
+
+    public static void setVideoPlayListener(VideoPlayListener videoPlayListener) {
+        mVideoPlayListener = videoPlayListener;
+    }
+
+    public interface VideoPlayListener {
+        void onPlayComplete();
+    }
+}

+ 1 - 7
app/src/main/java/com/miekir/eden/ui/welcome/WelcomeActivity.java

@@ -2,7 +2,6 @@ package com.miekir.eden.ui.welcome;
 
 import android.content.Intent;
 import android.os.Bundle;
-import android.text.TextUtils;
 
 import androidx.annotation.Nullable;
 
@@ -101,18 +100,13 @@ public class WelcomeActivity extends BaseBeiActivity implements ILoginView, ISys
                 EdenManager.getInstance().setKwyPhotoReady(isPhotoReady);
 
                 // 视频
-                boolean isVideoReady = false;
                 String videoResult = HttpUtil.get(API.VIDEO, 5000);
                 try {
                     BaseBean baseBean = JSON.parseObject(videoResult, BaseBean.class);
-                    String videoUrl = baseBean.getJson();
-                    if (!TextUtils.isEmpty(videoUrl)) {
-                        isVideoReady = true;
-                    }
+                    EdenManager.getInstance().setVideoUrl(baseBean.getJson());
                 } catch (Exception videoException) {
                     videoException.printStackTrace();
                 }
-                EdenManager.getInstance().setKwyVideoReady(isVideoReady);
 
                 e.onComplete();
             }

+ 9 - 5
app/src/main/res/layout/activity_video_play.xml

@@ -1,11 +1,15 @@
 <?xml version="1.0" encoding="utf-8"?>
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<com.scwang.smart.refresh.layout.SmartRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:orientation="vertical">
+    android:layout_height="wrap_content"
+    android:id="@+id/srl_video">
 
     <cn.jzvd.JzvdStd
         android:id="@+id/js_video"
         android:layout_width="match_parent"
-        android:layout_height="match_parent"/>
-</FrameLayout>
+        android:layout_height="match_parent" />
+
+    <com.scwang.smart.refresh.footer.ClassicsFooter
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content" />
+</com.scwang.smart.refresh.layout.SmartRefreshLayout>

+ 62 - 0
app/src/main/res/layout/fragment_video.xml

@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content">
+
+    <androidx.cardview.widget.CardView
+        android:id="@+id/cv_video"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:clickable="true"
+        android:focusable="true"
+        android:foreground="?android:attr/selectableItemBackground"
+        app:cardCornerRadius="@dimen/height_indicator"
+        app:cardElevation="@dimen/margin_sss"
+        app:cardUseCompatPadding="true">
+        <!--app:cardUseCompatPadding="true"解决角边阴影问题-->
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:gravity="center_vertical"
+            android:orientation="vertical"
+            android:padding="@dimen/margin_s">
+            <!--标题-->
+            <TextView
+                android:id="@+id/tv_title"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginBottom="@dimen/margin_s"
+                android:ellipsize="end"
+                android:maxLines="3"
+                android:textColor="@color/black_theme"
+                android:textStyle="bold"
+                android:textSize="@dimen/text_sub_title"
+                android:text="@string/video_beauty"
+                android:visibility="gone"/>
+
+            <FrameLayout
+                android:id="@+id/fl_video_play"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content">
+
+                <com.makeramen.roundedimageview.RoundedImageView
+                    android:id="@+id/aciv_goods"
+                    android:layout_width="match_parent"
+                    android:layout_height="@dimen/height_cover"
+                    android:scaleType="centerCrop"
+                    android:src="@mipmap/poster_video"
+                    app:riv_corner_radius="4dp" />
+
+                <ImageView
+                    android:id="@+id/iv_video_play"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center"
+                    android:src="@mipmap/video_play" />
+            </FrameLayout>
+
+        </LinearLayout>
+    </androidx.cardview.widget.CardView>
+</FrameLayout>

BIN
app/src/main/res/mipmap-xxhdpi/poster_video.jpg


+ 4 - 0
app/src/main/res/values-zh-rCN/strings.xml

@@ -100,4 +100,8 @@
     <string name="mine_confirm_aligo">确定执行此不可逆转的操作?</string>
     <string name="ad_title">请领取美食优惠券后继续</string>
     <string name="err_rest_time">休息时间到</string>
+    <string name="title_video">视频</string>
+    <string name="video_get_failed">获取视频失败</string>
+    <string name="video_beauty">美女短视频</string>
+    <string name="video_play_next">播放下一个</string>
 </resources>

+ 4 - 0
app/src/main/res/values/strings.xml

@@ -100,4 +100,8 @@
     <string name="mine_confirm_aligo">Sure to proceed?</string>
     <string name="ad_title">Please go and get your coupon first</string>
     <string name="err_rest_time">Rest time now</string>
+    <string name="title_video">Video</string>
+    <string name="video_get_failed">Get video failed</string>
+    <string name="video_beauty">Video of beauty</string>
+    <string name="video_play_next">Play Next Video</string>
 </resources>

+ 4 - 0
app/src/main/res/values/styles.xml

@@ -105,6 +105,10 @@
         如果启动的Activity为透明Activity时,screenOrientation 需为默认状态,
         这种情况下,透明Activity使用的是栈中,上一层可见Activity的orientation设定-->
         <!--<item name="android:windowDisablePreview">true</item>-->
+    </style>
 
+    <style name="VideoTheme" parent="android:Theme.Light.NoTitleBar.Fullscreen">
+        <item name="android:windowContentOverlay">@null</item>
+        <item name="android:windowBackground">@color/colorPrimaryDark</item>
     </style>
 </resources>