Bläddra i källkod

YCVideoPlayer

yangchong 7 år sedan
förälder
incheckning
c8c8095d78
38 ändrade filer med 2071 tillägg och 75 borttagningar
  1. 0 55
      .idea/inspectionProfiles/Project_Default.xml
  2. 0 6
      .idea/smartfox_info.xml
  3. 6 0
      app/src/main/AndroidManifest.xml
  4. 32 0
      app/src/main/java/org/yczbj/ycvideoplayer/base/BaseInterceptor.java
  5. 2 2
      app/src/main/java/org/yczbj/ycvideoplayer/bean/TabEntity.java
  6. 8 9
      app/src/main/java/org/yczbj/ycvideoplayer/ui/home/view/HomeFragment.java
  7. 35 0
      app/src/main/java/org/yczbj/ycvideoplayer/ui/main/contract/VideoPlayerJzContract.java
  8. 37 0
      app/src/main/java/org/yczbj/ycvideoplayer/ui/main/contract/VideoPlayerMeContract.java
  9. 58 0
      app/src/main/java/org/yczbj/ycvideoplayer/ui/main/model/VideoPlayerComment.java
  10. 48 0
      app/src/main/java/org/yczbj/ycvideoplayer/ui/main/model/VideoPlayerFavorite.java
  11. 67 0
      app/src/main/java/org/yczbj/ycvideoplayer/ui/main/presenter/VideoPlayerJzPresenter.java
  12. 68 0
      app/src/main/java/org/yczbj/ycvideoplayer/ui/main/presenter/VideoPlayerMePresenter.java
  13. 386 0
      app/src/main/java/org/yczbj/ycvideoplayer/ui/main/view/activity/VideoPlayerJzActivity.java
  14. 331 0
      app/src/main/java/org/yczbj/ycvideoplayer/ui/main/view/activity/VideoPlayerMeActivity.java
  15. 36 0
      app/src/main/java/org/yczbj/ycvideoplayer/ui/main/view/adapter/NarrowImageAdapter.java
  16. 45 0
      app/src/main/java/org/yczbj/ycvideoplayer/ui/main/view/adapter/VideoPlayerMeAdapter.java
  17. 2 1
      app/src/main/java/org/yczbj/ycvideoplayer/ui/test2/TestMyActivity.java
  18. 162 0
      app/src/main/java/org/yczbj/ycvideoplayer/util/InterceptorUtils.java
  19. 230 0
      app/src/main/java/org/yczbj/ycvideoplayer/util/OkHttpUtils.java
  20. 226 0
      app/src/main/java/org/yczbj/ycvideoplayer/util/ScreenCaptureUtils.java
  21. BIN
      app/src/main/res/drawable-xhdpi/ic_write_normal.png
  22. BIN
      app/src/main/res/drawable-xhdpi/ic_write_pressed.png
  23. BIN
      app/src/main/res/drawable-xhdpi/icon_video_collection.png
  24. BIN
      app/src/main/res/drawable-xhdpi/icon_video_download_core.png
  25. BIN
      app/src/main/res/drawable-xhdpi/icon_video_share.png
  26. BIN
      app/src/main/res/drawable-xhdpi/icon_zan_details_normal.png
  27. BIN
      app/src/main/res/drawable-xhdpi/icon_zan_details_pressed.png
  28. 8 0
      app/src/main/res/drawable/selector_video_player_detail.xml
  29. 39 0
      app/src/main/res/layout/activity_video_player_jz_detail.xml
  30. 39 0
      app/src/main/res/layout/activity_video_player_me_detail.xml
  31. 63 0
      app/src/main/res/layout/head_video_player.xml
  32. 29 0
      app/src/main/res/layout/head_video_player_content.xml
  33. 17 0
      app/src/main/res/layout/head_video_player_title.xml
  34. 48 0
      app/src/main/res/layout/item_video_player_com.xml
  35. 19 0
      app/src/main/res/layout/view_video_more_horizontal.xml
  36. 27 0
      app/src/main/res/layout/view_video_player_favorite.xml
  37. 2 2
      app/src/main/res/layout/view_vlayout_button.xml
  38. 1 0
      app/src/main/res/values/colors.xml

+ 0 - 55
.idea/inspectionProfiles/Project_Default.xml

@@ -1,60 +1,6 @@
 <component name="InspectionProjectProfileManager">
   <profile version="1.0">
     <option name="myName" value="Project Default" />
-    <inspection_tool class="AliAccessStaticViaInstance" enabled="false" level="BLOCKER" enabled_by_default="false" />
-    <inspection_tool class="AliAccessToNonThreadSafeStaticFieldFromInstance" enabled="false" level="CRITICAL" enabled_by_default="false" />
-    <inspection_tool class="AliArrayNamingShouldHaveBracket" enabled="false" level="MAJOR" enabled_by_default="false" />
-    <inspection_tool class="AliControlFlowStatementWithoutBraces" enabled="false" level="BLOCKER" enabled_by_default="false" />
-    <inspection_tool class="AliDeprecation" enabled="false" level="CRITICAL" enabled_by_default="false" />
-    <inspection_tool class="AliEqualsAvoidNull" enabled="false" level="CRITICAL" enabled_by_default="false" />
-    <inspection_tool class="AliLongLiteralsEndingWithLowercaseL" enabled="false" level="BLOCKER" enabled_by_default="false" />
-    <inspection_tool class="AliMissingOverrideAnnotation" enabled="false" level="BLOCKER" enabled_by_default="false" />
-    <inspection_tool class="AliWrapperTypeEquality" enabled="false" level="BLOCKER" enabled_by_default="false" />
-    <inspection_tool class="AlibabaAbstractClassShouldStartWithAbstractNaming" enabled="false" level="CRITICAL" enabled_by_default="false" />
-    <inspection_tool class="AlibabaAbstractMethodOrInterfaceMethodMustUseJavadoc" enabled="false" level="MAJOR" enabled_by_default="false" />
-    <inspection_tool class="AlibabaAvoidApacheBeanUtilsCopy" enabled="false" level="BLOCKER" enabled_by_default="false" />
-    <inspection_tool class="AlibabaAvoidCommentBehindStatement" enabled="false" level="MAJOR" enabled_by_default="false" />
-    <inspection_tool class="AlibabaAvoidComplexCondition" enabled="false" level="MAJOR" enabled_by_default="false" />
-    <inspection_tool class="AlibabaAvoidConcurrentCompetitionRandom" enabled="false" level="MAJOR" enabled_by_default="false" />
-    <inspection_tool class="AlibabaAvoidManuallyCreateThread" enabled="false" level="CRITICAL" enabled_by_default="false" />
-    <inspection_tool class="AlibabaAvoidMissUseOfMathRandom" enabled="false" level="MAJOR" enabled_by_default="false" />
-    <inspection_tool class="AlibabaAvoidNewDateGetTime" enabled="false" level="BLOCKER" enabled_by_default="false" />
-    <inspection_tool class="AlibabaAvoidPatternCompileInMethod" enabled="false" level="BLOCKER" enabled_by_default="false" />
-    <inspection_tool class="AlibabaAvoidReturnInFinally" enabled="false" level="CRITICAL" enabled_by_default="false" />
-    <inspection_tool class="AlibabaAvoidStartWithDollarAndUnderLineNaming" enabled="false" level="CRITICAL" enabled_by_default="false" />
-    <inspection_tool class="AlibabaAvoidUseTimer" enabled="false" level="BLOCKER" enabled_by_default="false" />
-    <inspection_tool class="AlibabaBooleanPropertyShouldNotStartWithIs" enabled="false" level="CRITICAL" enabled_by_default="false" />
-    <inspection_tool class="AlibabaClassCastExceptionWithSubListToArrayList" enabled="false" level="CRITICAL" enabled_by_default="false" />
-    <inspection_tool class="AlibabaClassCastExceptionWithToArray" enabled="false" level="CRITICAL" enabled_by_default="false" />
-    <inspection_tool class="AlibabaClassMustHaveAuthor" enabled="false" level="MAJOR" enabled_by_default="false" />
-    <inspection_tool class="AlibabaClassNamingShouldBeCamel" enabled="false" level="MAJOR" enabled_by_default="false" />
-    <inspection_tool class="AlibabaCollectionInitShouldAssignCapacity" enabled="false" level="MAJOR" enabled_by_default="false" />
-    <inspection_tool class="AlibabaCommentsMustBeJavadocFormat" enabled="false" level="MAJOR" enabled_by_default="false" />
-    <inspection_tool class="AlibabaConcurrentExceptionWithModifyOriginSubList" enabled="false" level="CRITICAL" enabled_by_default="false" />
-    <inspection_tool class="AlibabaConstantFieldShouldBeUpperCase" enabled="false" level="CRITICAL" enabled_by_default="false" />
-    <inspection_tool class="AlibabaCountDownShouldInFinally" enabled="false" level="MAJOR" enabled_by_default="false" />
-    <inspection_tool class="AlibabaDontModifyInForeachCircle" enabled="false" level="BLOCKER" enabled_by_default="false" />
-    <inspection_tool class="AlibabaEnumConstantsMustHaveComment" enabled="false" level="CRITICAL" enabled_by_default="false" />
-    <inspection_tool class="AlibabaExceptionClassShouldEndWithException" enabled="false" level="CRITICAL" enabled_by_default="false" />
-    <inspection_tool class="AlibabaIbatisMethodQueryForList" enabled="false" level="MAJOR" enabled_by_default="false" />
-    <inspection_tool class="AlibabaLowerCamelCaseVariableNaming" enabled="false" level="CRITICAL" enabled_by_default="false" />
-    <inspection_tool class="AlibabaMethodReturnWrapperType" enabled="false" level="MAJOR" enabled_by_default="false" />
-    <inspection_tool class="AlibabaPackageNaming" enabled="false" level="MAJOR" enabled_by_default="false" />
-    <inspection_tool class="AlibabaPojoMustOverrideToString" enabled="false" level="MAJOR" enabled_by_default="false" />
-    <inspection_tool class="AlibabaPojoMustUsePrimitiveField" enabled="false" level="MAJOR" enabled_by_default="false" />
-    <inspection_tool class="AlibabaPojoNoDefaultValue" enabled="false" level="MAJOR" enabled_by_default="false" />
-    <inspection_tool class="AlibabaRemoveCommentedCode" enabled="false" level="MAJOR" enabled_by_default="false" />
-    <inspection_tool class="AlibabaServiceOrDaoClassShouldEndWithImpl" enabled="false" level="CRITICAL" enabled_by_default="false" />
-    <inspection_tool class="AlibabaStringConcat" enabled="false" level="MAJOR" enabled_by_default="false" />
-    <inspection_tool class="AlibabaSwitchStatement" enabled="false" level="CRITICAL" enabled_by_default="false" />
-    <inspection_tool class="AlibabaTestClassShouldEndWithTestNaming" enabled="false" level="MAJOR" enabled_by_default="false" />
-    <inspection_tool class="AlibabaThreadLocalShouldRemove" enabled="false" level="CRITICAL" enabled_by_default="false" />
-    <inspection_tool class="AlibabaThreadPoolCreation" enabled="false" level="BLOCKER" enabled_by_default="false" />
-    <inspection_tool class="AlibabaThreadShouldSetName" enabled="false" level="CRITICAL" enabled_by_default="false" />
-    <inspection_tool class="AlibabaTransactionMustHaveRollback" enabled="false" level="MAJOR" enabled_by_default="false" />
-    <inspection_tool class="AlibabaUndefineMagicConstant" enabled="false" level="MAJOR" enabled_by_default="false" />
-    <inspection_tool class="AlibabaUnsupportedExceptionWithModifyAsList" enabled="false" level="CRITICAL" enabled_by_default="false" />
-    <inspection_tool class="AlibabaUseQuietReferenceNotation" enabled="false" level="MAJOR" enabled_by_default="false" />
     <inspection_tool class="JavaDoc" enabled="true" level="WARNING" enabled_by_default="true">
       <option name="TOP_LEVEL_CLASS_OPTIONS">
         <value>
@@ -86,6 +32,5 @@
       <option name="IGNORE_POINT_TO_ITSELF" value="false" />
       <option name="myAdditionalJavadocTags" value="date" />
     </inspection_tool>
-    <inspection_tool class="MapOrSetKeyShouldOverrideHashCodeEquals" enabled="false" level="CRITICAL" enabled_by_default="false" />
   </profile>
 </component>

+ 0 - 6
.idea/smartfox_info.xml

@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="SmartFoxProjectConfig">
-    <option name="projectInspectionClosed" value="true" />
-  </component>
-</project>

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

@@ -22,6 +22,12 @@
             </intent-filter>
         </activity>
 
+        <activity android:name=".ui.main.view.activity.VideoPlayerMeActivity"
+            android:configChanges="orientation|keyboardHidden|screenSize"
+            android:screenOrientation="portrait"/>
+        <activity android:name=".ui.main.view.activity.VideoPlayerJzActivity"
+            android:configChanges="orientation|keyboardHidden|screenSize"
+            android:screenOrientation="portrait"/>
 
 
         <!--下面这些均是测试视频播放器-->

+ 32 - 0
app/src/main/java/org/yczbj/ycvideoplayer/base/BaseInterceptor.java

@@ -0,0 +1,32 @@
+package org.yczbj.ycvideoplayer.base;
+
+import java.io.IOException;
+
+import okhttp3.Interceptor;
+import okhttp3.Request;
+import okhttp3.Response;
+
+/**
+ * ================================================
+ * 作    者:杨充
+ * 版    本:1.0
+ * 创建日期:2016/6/20
+ * 描    述:自定义拦截器,比如请求中有共同的请求头或者key值
+ * 修订历史:
+ * ================================================
+ */
+public class BaseInterceptor implements Interceptor {
+
+    @Override
+    public Response intercept(Chain chain) throws IOException {
+        //用chain.request()构造一个新的传入统计参数的request,作为参数调用chain.proceed
+        Request req = chain.request();
+        Request request = req.newBuilder()
+                .addHeader("Cookie", "Cookie值,假设值")
+                .addHeader("appType", "android")
+                .addHeader("uuid", "uuid")
+                .addHeader("key","key值")
+                .build();
+        return chain.proceed(request);
+    }
+}

+ 2 - 2
app/src/main/java/org/yczbj/ycvideoplayer/bean/TabEntity.java

@@ -5,8 +5,8 @@ import com.flyco.tablayout.listener.CustomTabEntity;
 public class TabEntity implements CustomTabEntity {
 
     public String title;
-    public int selectedIcon;
-    public int unSelectedIcon;
+    private int selectedIcon;
+    private int unSelectedIcon;
 
     public TabEntity(String title, int selectedIcon, int unSelectedIcon) {
         this.title = title;

+ 8 - 9
app/src/main/java/org/yczbj/ycvideoplayer/ui/home/view/HomeFragment.java

@@ -2,13 +2,9 @@ package org.yczbj.ycvideoplayer.ui.home.view;
 
 import android.content.Context;
 import android.graphics.Color;
-import android.os.Bundle;
-import android.os.Handler;
 import android.support.v4.widget.SwipeRefreshLayout;
 import android.support.v7.widget.RecyclerView;
-import android.view.LayoutInflater;
 import android.view.View;
-import android.view.ViewGroup;
 
 import com.alibaba.android.vlayout.DelegateAdapter;
 import com.alibaba.android.vlayout.VirtualLayoutManager;
@@ -25,6 +21,8 @@ import org.yczbj.ycvideoplayer.base.BaseDelegateAdapter;
 import org.yczbj.ycvideoplayer.base.BaseFragment;
 import org.yczbj.ycvideoplayer.ui.home.view.adapter.BannerPagerAdapter;
 import org.yczbj.ycvideoplayer.ui.main.view.MainActivity;
+import org.yczbj.ycvideoplayer.ui.main.view.activity.VideoPlayerJzActivity;
+import org.yczbj.ycvideoplayer.ui.main.view.activity.VideoPlayerMeActivity;
 import org.yczbj.ycvideoplayer.ui.test.TestActivity;
 import org.yczbj.ycvideoplayer.ui.test2.TestMyActivity;
 
@@ -33,7 +31,6 @@ import java.util.LinkedList;
 import java.util.List;
 
 import butterknife.Bind;
-import butterknife.ButterKnife;
 
 
 /**
@@ -218,10 +215,10 @@ public class HomeFragment extends BaseFragment {
                                 startActivity(TestMyActivity.class);
                                 break;
                             case R.id.tv_home_third:
-
+                                startActivity(VideoPlayerMeActivity.class);
                                 break;
                             case R.id.tv_home_four:
-
+                                startActivity(VideoPlayerJzActivity.class);
                                 break;
                             case R.id.tv_home_five:
 
@@ -246,8 +243,10 @@ public class HomeFragment extends BaseFragment {
         initTitleView(1);
         GridLayoutHelper gridLayoutHelper = new GridLayoutHelper(2);
         gridLayoutHelper.setPadding(0, 16, 0, 16);
-        gridLayoutHelper.setVGap(16);   // 控制子元素之间的垂直间距
-        gridLayoutHelper.setHGap(0);    // 控制子元素之间的水平间距
+        // 控制子元素之间的垂直间距
+        gridLayoutHelper.setVGap(16);
+        // 控制子元素之间的水平间距
+        gridLayoutHelper.setHGap(0);
         gridLayoutHelper.setBgColor(Color.WHITE);
         BaseDelegateAdapter adapter = new BaseDelegateAdapter(activity, gridLayoutHelper, R.layout.view_vlayout_grid, 4, Constant.viewType.typeGv) {
             @Override

+ 35 - 0
app/src/main/java/org/yczbj/ycvideoplayer/ui/main/contract/VideoPlayerJzContract.java

@@ -0,0 +1,35 @@
+package org.yczbj.ycvideoplayer.ui.main.contract;
+
+
+import android.support.v7.app.AppCompatActivity;
+
+import org.yczbj.ycvideoplayer.base.BasePresenter;
+import org.yczbj.ycvideoplayer.base.BaseView;
+import org.yczbj.ycvideoplayer.ui.main.model.VideoPlayerComment;
+
+import java.util.List;
+
+/**
+ * ================================================
+ * 作    者:杨充
+ * 版    本:1.0
+ * 创建日期:2017/3/18
+ * 描    述:
+ * 修订历史:
+ * ================================================
+ */
+public interface VideoPlayerJzContract {
+
+    //View(activity/fragment)继承,需要实现的方法
+    interface View extends BaseView {
+        void setAdapterView(List<VideoPlayerComment> comments);
+    }
+
+    //Presenter控制器
+    interface Presenter extends BasePresenter {
+        void bindView(AppCompatActivity activity);
+        void getData();
+    }
+
+
+}

+ 37 - 0
app/src/main/java/org/yczbj/ycvideoplayer/ui/main/contract/VideoPlayerMeContract.java

@@ -0,0 +1,37 @@
+package org.yczbj.ycvideoplayer.ui.main.contract;
+
+
+import android.support.v7.app.AppCompatActivity;
+
+import com.flyco.tablayout.listener.CustomTabEntity;
+
+import org.yczbj.ycvideoplayer.base.BasePresenter;
+import org.yczbj.ycvideoplayer.base.BaseView;
+import org.yczbj.ycvideoplayer.ui.main.model.VideoPlayerComment;
+
+import java.util.List;
+
+/**
+ * ================================================
+ * 作    者:杨充
+ * 版    本:1.0
+ * 创建日期:2017/3/18
+ * 描    述:
+ * 修订历史:
+ * ================================================
+ */
+public interface VideoPlayerMeContract {
+
+    //View(activity/fragment)继承,需要实现的方法
+    interface View extends BaseView {
+        void setAdapterView(List<VideoPlayerComment> comments);
+    }
+
+    //Presenter控制器
+    interface Presenter extends BasePresenter {
+        void bindView(AppCompatActivity activity);
+        void getData();
+    }
+
+
+}

+ 58 - 0
app/src/main/java/org/yczbj/ycvideoplayer/ui/main/model/VideoPlayerComment.java

@@ -0,0 +1,58 @@
+package org.yczbj.ycvideoplayer.ui.main.model;
+
+
+/**
+ * ================================================
+ * 作    者:杨充
+ * 版    本:1.0
+ * 创建日期:2018/1/9
+ * 描    述:视频播放器详情页面评论实体类
+ * 修订历史:
+ * ================================================
+ */
+public class VideoPlayerComment {
+
+    private int userLogo;
+    private String name;
+    private int zan;
+    private String content;
+
+    public VideoPlayerComment(int userLogo, String name, int zan, String content) {
+        this.userLogo = userLogo;
+        this.name = name;
+        this.zan = zan;
+        this.content = content;
+    }
+
+    public int getUserLogo() {
+        return userLogo;
+    }
+
+    public void setUserLogo(int userLogo) {
+        this.userLogo = userLogo;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public int getZan() {
+        return zan;
+    }
+
+    public void setZan(int zan) {
+        this.zan = zan;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+}

+ 48 - 0
app/src/main/java/org/yczbj/ycvideoplayer/ui/main/model/VideoPlayerFavorite.java

@@ -0,0 +1,48 @@
+package org.yczbj.ycvideoplayer.ui.main.model;
+
+
+/**
+ * ================================================
+ * 作    者:杨充
+ * 版    本:1.0
+ * 创建日期:2018/1/9
+ * 描    述:视频播放器详情页面猜你喜欢实体类
+ * 修订历史:
+ * ================================================
+ */
+public class VideoPlayerFavorite {
+
+    private String title;
+    private int logoUrl;
+    private String url;
+
+    public VideoPlayerFavorite(String title, int logoUrl, String url) {
+        this.title = title;
+        this.logoUrl = logoUrl;
+        this.url = url;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public int getLogoUrl() {
+        return logoUrl;
+    }
+
+    public void setLogoUrl(int logoUrl) {
+        this.logoUrl = logoUrl;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+}

+ 67 - 0
app/src/main/java/org/yczbj/ycvideoplayer/ui/main/presenter/VideoPlayerJzPresenter.java

@@ -0,0 +1,67 @@
+package org.yczbj.ycvideoplayer.ui.main.presenter;
+
+import android.app.Activity;
+import android.support.v7.app.AppCompatActivity;
+
+import org.yczbj.ycvideoplayer.R;
+import org.yczbj.ycvideoplayer.ui.main.contract.VideoPlayerJzContract;
+import org.yczbj.ycvideoplayer.ui.main.contract.VideoPlayerMeContract;
+import org.yczbj.ycvideoplayer.ui.main.model.VideoPlayerComment;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import rx.subscriptions.CompositeSubscription;
+
+
+/**
+ * ================================================
+ * 作    者:杨充
+ * 版    本:1.0
+ * 创建日期:2017/3/18
+ * 描    述:Main主页面
+ * 修订历史:
+ * ================================================
+ */
+public class VideoPlayerJzPresenter implements VideoPlayerJzContract.Presenter {
+
+    private VideoPlayerJzContract.View mView;
+    private CompositeSubscription mSubscriptions;
+    private Activity activity;
+
+    public VideoPlayerJzPresenter(VideoPlayerJzContract.View androidView) {
+        this.mView = androidView;
+        mSubscriptions = new CompositeSubscription();
+    }
+
+    @Override
+    public void subscribe() {
+
+    }
+
+
+    @Override
+    public void unSubscribe() {
+        mSubscriptions.clear();
+        if(activity!=null){
+            activity = null;
+        }
+    }
+
+
+    @Override
+    public void bindView(AppCompatActivity activity) {
+        this.activity = activity;
+    }
+
+    @Override
+    public void getData() {
+        List<VideoPlayerComment> comments = new ArrayList<>();
+        for(int a=0 ; a<20 ; a++){
+            VideoPlayerComment videoPlayerComment = new VideoPlayerComment(
+                    R.drawable.battery_10,"潇湘剑雨",5,"这个仿优酷视频Ui太好呢");
+            comments.add(videoPlayerComment);
+        }
+        mView.setAdapterView(comments);
+    }
+}

+ 68 - 0
app/src/main/java/org/yczbj/ycvideoplayer/ui/main/presenter/VideoPlayerMePresenter.java

@@ -0,0 +1,68 @@
+package org.yczbj.ycvideoplayer.ui.main.presenter;
+
+import android.app.Activity;
+import android.support.v7.app.AppCompatActivity;
+
+import com.flyco.tablayout.listener.CustomTabEntity;
+
+import org.yczbj.ycvideoplayer.R;
+import org.yczbj.ycvideoplayer.ui.main.contract.VideoPlayerMeContract;
+import org.yczbj.ycvideoplayer.ui.main.model.VideoPlayerComment;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import rx.subscriptions.CompositeSubscription;
+
+
+/**
+ * ================================================
+ * 作    者:杨充
+ * 版    本:1.0
+ * 创建日期:2017/3/18
+ * 描    述:Main主页面
+ * 修订历史:
+ * ================================================
+ */
+public class VideoPlayerMePresenter implements VideoPlayerMeContract.Presenter {
+
+    private VideoPlayerMeContract.View mView;
+    private CompositeSubscription mSubscriptions;
+    private Activity activity;
+
+    public VideoPlayerMePresenter(VideoPlayerMeContract.View androidView) {
+        this.mView = androidView;
+        mSubscriptions = new CompositeSubscription();
+    }
+
+    @Override
+    public void subscribe() {
+
+    }
+
+
+    @Override
+    public void unSubscribe() {
+        mSubscriptions.clear();
+        if(activity!=null){
+            activity = null;
+        }
+    }
+
+
+    @Override
+    public void bindView(AppCompatActivity activity) {
+        this.activity = activity;
+    }
+
+    @Override
+    public void getData() {
+        List<VideoPlayerComment> comments = new ArrayList<>();
+        for(int a=0 ; a<20 ; a++){
+            VideoPlayerComment videoPlayerComment = new VideoPlayerComment(
+                    R.drawable.battery_10,"潇湘剑雨",5,"这个仿优酷视频Ui太好呢");
+            comments.add(videoPlayerComment);
+        }
+        mView.setAdapterView(comments);
+    }
+}

+ 386 - 0
app/src/main/java/org/yczbj/ycvideoplayer/ui/main/view/activity/VideoPlayerJzActivity.java

@@ -0,0 +1,386 @@
+package org.yczbj.ycvideoplayer.ui.main.view.activity;
+
+import android.annotation.SuppressLint;
+import android.graphics.Color;
+import android.os.Bundle;
+import android.os.Handler;
+import android.support.annotation.Nullable;
+import android.support.design.widget.FloatingActionButton;
+import android.support.v4.widget.SwipeRefreshLayout;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.util.Log;
+import android.util.TypedValue;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import com.blankj.utilcode.util.SizeUtils;
+import com.pedaily.yc.ycdialoglib.toast.ToastUtil;
+import com.squareup.picasso.Picasso;
+
+import org.yczbj.ycrefreshviewlib.YCRefreshView;
+import org.yczbj.ycrefreshviewlib.adapter.RecyclerArrayAdapter;
+import org.yczbj.ycrefreshviewlib.item.RecycleViewItemLine;
+import org.yczbj.ycrefreshviewlib.item.SpaceViewItemLine;
+import org.yczbj.ycvideoplayer.R;
+import org.yczbj.ycvideoplayer.base.BaseActivity;
+import org.yczbj.ycvideoplayer.ui.main.contract.VideoPlayerJzContract;
+import org.yczbj.ycvideoplayer.ui.main.contract.VideoPlayerMeContract;
+import org.yczbj.ycvideoplayer.ui.main.model.VideoPlayerComment;
+import org.yczbj.ycvideoplayer.ui.main.model.VideoPlayerFavorite;
+import org.yczbj.ycvideoplayer.ui.main.presenter.VideoPlayerJzPresenter;
+import org.yczbj.ycvideoplayer.ui.main.presenter.VideoPlayerMePresenter;
+import org.yczbj.ycvideoplayer.ui.main.view.adapter.NarrowImageAdapter;
+import org.yczbj.ycvideoplayer.ui.main.view.adapter.VideoPlayerMeAdapter;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import butterknife.Bind;
+import cn.jzvd.CustomView.MyJZVideoPlayerStandard;
+import cn.jzvd.JZUserAction;
+import cn.jzvd.JZUserActionStandard;
+import cn.jzvd.JZVideoPlayer;
+import cn.jzvd.JZVideoPlayerStandard;
+
+/**
+ * ================================================
+ * 作    者:杨充
+ * 版    本:1.0
+ * 创建日期:2018/1/9
+ * 描    述:视频播放器详情页面,仿优酷视频播放,使用饺子封装库
+ * 修订历史:
+ * ================================================
+ */
+public class VideoPlayerJzActivity extends BaseActivity implements VideoPlayerJzContract.View {
+
+
+    @Bind(R.id.recyclerView)
+    YCRefreshView recyclerView;
+    @Bind(R.id.fab)
+    FloatingActionButton fab;
+    @Bind(R.id.jz_video)
+    MyJZVideoPlayerStandard jzVideo;
+
+
+    private VideoPlayerJzContract.Presenter presenter = new VideoPlayerJzPresenter(this);
+    private VideoPlayerMeAdapter adapter;
+
+
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        presenter.bindView(this);
+        presenter.subscribe();
+    }
+
+
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+        presenter.unSubscribe();
+    }
+
+
+    @Override
+    public int getContentView() {
+        return R.layout.activity_video_player_jz_detail;
+    }
+
+
+    @Override
+    public void initView() {
+        initVideoPlayer();
+        initYCRefreshView();
+    }
+
+
+    @Override
+    public void initListener() {
+        adapter.setOnItemClickListener(new RecyclerArrayAdapter.OnItemClickListener() {
+            @Override
+            public void onItemClick(int position) {
+
+            }
+        });
+    }
+
+
+    @Override
+    public void initData() {
+        recyclerView.showProgress();
+        presenter.getData();
+    }
+
+
+    private void initVideoPlayer() {
+        jzVideo.setUp("http://jzvd.nathen.cn/342a5f7ef6124a4a8faf00e738b8bee4/cf6d9db0bd4d41f59d09ea0a81e918fd-5287d2089db37e62345123a1be272f8b.mp4"
+                , JZVideoPlayerStandard.SCREEN_WINDOW_NORMAL, "饺子快长大");
+        Picasso.with(this)
+                .load("http://jzvd-pic.nathen.cn/jzvd-pic/1bb2ebbe-140d-4e2e-abd2-9e7e564f71ac.png")
+                .into(jzVideo.thumbImageView);
+        JZVideoPlayer.setJzUserAction(new MyUserActionStandard());
+    }
+
+
+    private void initYCRefreshView() {
+        recyclerView.setLayoutManager(new LinearLayoutManager(this));
+        final RecycleViewItemLine line = new RecycleViewItemLine(this, LinearLayout.HORIZONTAL,
+                SizeUtils.dp2px(1), Color.parseColor("#f5f5f7"));
+        recyclerView.addItemDecoration(line);
+        adapter = new VideoPlayerMeAdapter(this);
+        recyclerView.setAdapter(adapter);
+        addHeader();
+        recyclerView.setRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
+            @Override
+            public void onRefresh() {
+                SwipeRefreshLayout swipeToRefresh = recyclerView.getSwipeToRefresh();
+                if (swipeToRefresh.isRefreshing()) {
+                    recyclerView.setRefreshing(false);
+                }
+            }
+        });
+    }
+
+
+    /**
+     * 添加头部
+     */
+    private void addHeader() {
+        adapter.removeAllHeader();
+        initTopHeaderView();
+        initHeaderTitle();
+        initHorizontalView();
+        initVideoContentView();
+        initBottomHeaderView();
+    }
+
+
+    @Override
+    public void setAdapterView(List<VideoPlayerComment> comments) {
+        adapter.addAll(comments);
+        adapter.notifyDataSetChanged();
+        recyclerView.showRecycler();
+    }
+
+
+    private void initTopHeaderView() {
+        adapter.addHeader(new RecyclerArrayAdapter.ItemView() {
+            @Override
+            public View onCreateView(ViewGroup parent) {
+                return LayoutInflater.from(VideoPlayerJzActivity.this).inflate(
+                        R.layout.head_video_player, parent, false);
+            }
+
+
+            @Override
+            public void onBindView(View headerView) {
+                TextView tvPlayerTitle = (TextView) headerView.findViewById(R.id.tv_player_title);
+                TextView tvPlayerName = (TextView) headerView.findViewById(R.id.tv_player_name);
+                TextView tvPlayerDuty = (TextView) headerView.findViewById(R.id.tv_player_duty);
+                ImageView ivPlayerCollection = (ImageView) headerView.findViewById(R.id.iv_player_collection);
+                ImageView ivPlayerDownload = (ImageView) headerView.findViewById(R.id.iv_player_download);
+                ImageView ivPlayerShare = (ImageView) headerView.findViewById(R.id.iv_player_share);
+
+                View.OnClickListener listener = new View.OnClickListener() {
+                    @Override
+                    public void onClick(View v) {
+                        switch (v.getId()) {
+                            case R.id.iv_player_collection:
+                                ToastUtil.showToast(VideoPlayerJzActivity.this, "收藏视频");
+                                break;
+                            case R.id.iv_player_download:
+
+                                break;
+                            case R.id.iv_player_share:
+                                ToastUtil.showToast(VideoPlayerJzActivity.this, "分享视频");
+                                break;
+                            default:
+                                break;
+                        }
+                    }
+                };
+                ivPlayerCollection.setOnClickListener(listener);
+                ivPlayerDownload.setOnClickListener(listener);
+                ivPlayerShare.setOnClickListener(listener);
+            }
+        });
+    }
+
+
+    private void initHeaderTitle() {
+        adapter.addHeader(new RecyclerArrayAdapter.ItemView() {
+            @Override
+            public View onCreateView(ViewGroup parent) {
+                return LayoutInflater.from(VideoPlayerJzActivity.this).inflate
+                        (R.layout.head_video_player_title, parent, false);
+            }
+
+            @Override
+            public void onBindView(View headerView) {
+                TextView tvPlayerTitle = (TextView) headerView.findViewById(R.id.tv_player_title);
+                tvPlayerTitle.setText("热门推荐");
+            }
+        });
+    }
+
+
+    private void initHorizontalView() {
+        adapter.addHeader(new RecyclerArrayAdapter.ItemView() {
+            @Override
+            public View onCreateView(ViewGroup parent) {
+                RecyclerView recyclerView = new RecyclerView(parent.getContext()) {
+                    //为了不打扰横向RecyclerView的滑动操作,可以这样处理
+                    @SuppressLint("ClickableViewAccessibility")
+                    @Override
+                    public boolean onTouchEvent(MotionEvent event) {
+                        super.onTouchEvent(event);
+                        return true;
+                    }
+                };
+                RecyclerView.LayoutParams layoutParams = new RecyclerView.LayoutParams(
+                        ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
+                layoutParams.setMargins(SizeUtils.dp2px(10), SizeUtils.dp2px(5),
+                        SizeUtils.dp2px(10), SizeUtils.dp2px(5));
+                recyclerView.setLayoutParams(layoutParams);
+                final NarrowImageAdapter narrowAdapter;
+                recyclerView.setAdapter(narrowAdapter = new NarrowImageAdapter(parent.getContext()));
+                recyclerView.setLayoutManager(new LinearLayoutManager(parent.getContext(), LinearLayoutManager.HORIZONTAL, false));
+                recyclerView.addItemDecoration(new SpaceViewItemLine(SizeUtils.dp2px(8)));
+
+                narrowAdapter.setMore(R.layout.view_video_more_horizontal, new RecyclerArrayAdapter.OnLoadMoreListener() {
+                    @Override
+                    public void onLoadMore() {
+                        new Handler().postDelayed(new Runnable() {
+                            @Override
+                            public void run() {
+                                ToastUtil.showToast(VideoPlayerJzActivity.this, "没有更多呢!");
+                            }
+                        }, 1000);
+                    }
+                });
+                List<VideoPlayerFavorite> favoriteList = new ArrayList<>();
+                for (int a = 0; a < 10; a++) {
+                    VideoPlayerFavorite videoPlayerFavorite = new VideoPlayerFavorite(
+                            "这个是猜你喜欢的标题", R.drawable.bg_small_tree_min, "");
+                    favoriteList.add(videoPlayerFavorite);
+
+                }
+                narrowAdapter.addAll(favoriteList);
+                return recyclerView;
+            }
+
+            @Override
+            public void onBindView(View headerView) {
+                //这里的处理别忘了
+                ((ViewGroup) headerView).requestDisallowInterceptTouchEvent(true);
+            }
+        });
+    }
+
+
+    private void initVideoContentView() {
+        adapter.addHeader(new RecyclerArrayAdapter.ItemView() {
+            @Override
+            public View onCreateView(ViewGroup parent) {
+                return LayoutInflater.from(VideoPlayerJzActivity.this).inflate
+                        (R.layout.head_video_player_content, parent, false);
+            }
+
+            @Override
+            public void onBindView(View headerView) {
+                TextView tvPlayerCurriculum = (TextView) headerView.findViewById(R.id.tv_player_curriculum);
+            }
+        });
+    }
+
+
+    private void initBottomHeaderView() {
+        adapter.addFooter(new RecyclerArrayAdapter.ItemView() {
+            @Override
+            public View onCreateView(ViewGroup parent) {
+                TextView tv = new TextView(VideoPlayerJzActivity.this);
+                tv.setLayoutParams(new ViewGroup.LayoutParams(
+                        ViewGroup.LayoutParams.MATCH_PARENT, SizeUtils.dp2px(36)));
+                tv.setGravity(Gravity.CENTER);
+                tv.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16);
+                tv.setText("哥们,已经没有数据了……");
+                return tv;
+            }
+
+            @Override
+            public void onBindView(View headerView) {
+
+            }
+        });
+    }
+
+
+    /**
+     * 这只是给埋点统计用户数据用的,不能写和播放相关的逻辑,监听事件请参考MyJZVideoPlayerStandard,复写函数取得相应事件
+     */
+    class MyUserActionStandard implements JZUserActionStandard {
+        @Override
+        public void onEvent(int type, Object url, int screen, Object... objects) {
+            switch (type) {
+                case JZUserAction.ON_CLICK_START_ICON:
+                    Log.i("TEST_USER_EVENT", "ON_CLICK_START_ICON" + " title is : " + (objects.length == 0 ? "" : objects[0]) + " url is : " + url + " screen is : " + screen);
+                    break;
+                case JZUserAction.ON_CLICK_START_ERROR:
+                    Log.i("TEST_USER_EVENT", "ON_CLICK_START_ERROR" + " title is : " + (objects.length == 0 ? "" : objects[0]) + " url is : " + url + " screen is : " + screen);
+                    break;
+                case JZUserAction.ON_CLICK_START_AUTO_COMPLETE:
+                    Log.i("TEST_USER_EVENT", "ON_CLICK_START_AUTO_COMPLETE" + " title is : " + (objects.length == 0 ? "" : objects[0]) + " url is : " + url + " screen is : " + screen);
+                    break;
+                case JZUserAction.ON_CLICK_PAUSE:
+                    Log.i("TEST_USER_EVENT", "ON_CLICK_PAUSE" + " title is : " + (objects.length == 0 ? "" : objects[0]) + " url is : " + url + " screen is : " + screen);
+                    break;
+                case JZUserAction.ON_CLICK_RESUME:
+                    Log.i("TEST_USER_EVENT", "ON_CLICK_RESUME" + " title is : " + (objects.length == 0 ? "" : objects[0]) + " url is : " + url + " screen is : " + screen);
+                    break;
+                case JZUserAction.ON_SEEK_POSITION:
+                    Log.i("TEST_USER_EVENT", "ON_SEEK_POSITION" + " title is : " + (objects.length == 0 ? "" : objects[0]) + " url is : " + url + " screen is : " + screen);
+                    break;
+                case JZUserAction.ON_AUTO_COMPLETE:
+                    Log.i("TEST_USER_EVENT", "ON_AUTO_COMPLETE" + " title is : " + (objects.length == 0 ? "" : objects[0]) + " url is : " + url + " screen is : " + screen);
+                    break;
+                case JZUserAction.ON_ENTER_FULLSCREEN:
+                    Log.i("TEST_USER_EVENT", "ON_ENTER_FULLSCREEN" + " title is : " + (objects.length == 0 ? "" : objects[0]) + " url is : " + url + " screen is : " + screen);
+                    break;
+                case JZUserAction.ON_QUIT_FULLSCREEN:
+                    Log.i("TEST_USER_EVENT", "ON_QUIT_FULLSCREEN" + " title is : " + (objects.length == 0 ? "" : objects[0]) + " url is : " + url + " screen is : " + screen);
+                    break;
+                case JZUserAction.ON_ENTER_TINYSCREEN:
+                    Log.i("TEST_USER_EVENT", "ON_ENTER_TINYSCREEN" + " title is : " + (objects.length == 0 ? "" : objects[0]) + " url is : " + url + " screen is : " + screen);
+                    break;
+                case JZUserAction.ON_QUIT_TINYSCREEN:
+                    Log.i("TEST_USER_EVENT", "ON_QUIT_TINYSCREEN" + " title is : " + (objects.length == 0 ? "" : objects[0]) + " url is : " + url + " screen is : " + screen);
+                    break;
+                case JZUserAction.ON_TOUCH_SCREEN_SEEK_VOLUME:
+                    Log.i("TEST_USER_EVENT", "ON_TOUCH_SCREEN_SEEK_VOLUME" + " title is : " + (objects.length == 0 ? "" : objects[0]) + " url is : " + url + " screen is : " + screen);
+                    break;
+                case JZUserAction.ON_TOUCH_SCREEN_SEEK_POSITION:
+                    Log.i("TEST_USER_EVENT", "ON_TOUCH_SCREEN_SEEK_POSITION" + " title is : " + (objects.length == 0 ? "" : objects[0]) + " url is : " + url + " screen is : " + screen);
+                    break;
+                case JZUserActionStandard.ON_CLICK_START_THUMB:
+                    Log.i("TEST_USER_EVENT", "ON_CLICK_START_THUMB" + " title is : " + (objects.length == 0 ? "" : objects[0]) + " url is : " + url + " screen is : " + screen);
+                    break;
+                case JZUserActionStandard.ON_CLICK_BLANK:
+                    Log.i("TEST_USER_EVENT", "ON_CLICK_BLANK" + " title is : " + (objects.length == 0 ? "" : objects[0]) + " url is : " + url + " screen is : " + screen);
+                    break;
+                default:
+                    Log.i("TEST_USER_EVENT", "unknow");
+                    break;
+            }
+        }
+    }
+
+
+
+}

+ 331 - 0
app/src/main/java/org/yczbj/ycvideoplayer/ui/main/view/activity/VideoPlayerMeActivity.java

@@ -0,0 +1,331 @@
+package org.yczbj.ycvideoplayer.ui.main.view.activity;
+
+import android.annotation.SuppressLint;
+import android.graphics.Color;
+import android.os.Bundle;
+import android.os.Handler;
+import android.support.annotation.Nullable;
+import android.support.design.widget.FloatingActionButton;
+import android.support.v4.widget.SwipeRefreshLayout;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.util.TypedValue;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import com.blankj.utilcode.util.SizeUtils;
+import com.pedaily.yc.ycdialoglib.toast.ToastUtil;
+
+import org.yczbj.ycrefreshviewlib.YCRefreshView;
+import org.yczbj.ycrefreshviewlib.adapter.RecyclerArrayAdapter;
+import org.yczbj.ycrefreshviewlib.item.RecycleViewItemLine;
+import org.yczbj.ycrefreshviewlib.item.SpaceViewItemLine;
+import org.yczbj.ycvideoplayer.R;
+import org.yczbj.ycvideoplayer.base.BaseActivity;
+import org.yczbj.ycvideoplayer.ui.main.contract.VideoPlayerMeContract;
+import org.yczbj.ycvideoplayer.ui.main.model.VideoPlayerComment;
+import org.yczbj.ycvideoplayer.ui.main.model.VideoPlayerFavorite;
+import org.yczbj.ycvideoplayer.ui.main.presenter.VideoPlayerMePresenter;
+import org.yczbj.ycvideoplayer.ui.main.view.adapter.NarrowImageAdapter;
+import org.yczbj.ycvideoplayer.ui.main.view.adapter.VideoPlayerMeAdapter;
+import org.yczbj.ycvideoplayer.ui.test2.model.DataUtil;
+import org.yczbj.ycvideoplayer.util.ImageUtils;
+import org.yczbj.ycvideoplayerlib.VideoPlayer;
+import org.yczbj.ycvideoplayerlib.VideoPlayerController;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import butterknife.Bind;
+
+/**
+ * ================================================
+ * 作    者:杨充
+ * 版    本:1.0
+ * 创建日期:2018/1/9
+ * 描    述:视频播放器详情页面,仿优酷视频播放,使用自己的封装库
+ * 修订历史:
+ * ================================================
+ */
+public class VideoPlayerMeActivity extends BaseActivity implements VideoPlayerMeContract.View{
+
+    @Bind(R.id.video_player)
+    VideoPlayer videoPlayer;
+    @Bind(R.id.recyclerView)
+    YCRefreshView recyclerView;
+    @Bind(R.id.fab)
+    FloatingActionButton fab;
+
+    private VideoPlayerMeContract.Presenter presenter = new VideoPlayerMePresenter(this);
+    private VideoPlayerMeAdapter adapter;
+
+
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        presenter.bindView(this);
+        presenter.subscribe();
+    }
+
+
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+        presenter.unSubscribe();
+    }
+
+
+    @Override
+    public int getContentView() {
+        return R.layout.activity_video_player_me_detail;
+    }
+
+
+    @Override
+    public void initView() {
+        initVideoPlayer();
+        initYCRefreshView();
+    }
+
+
+    @Override
+    public void initListener() {
+        adapter.setOnItemClickListener(new RecyclerArrayAdapter.OnItemClickListener() {
+            @Override
+            public void onItemClick(int position) {
+
+            }
+        });
+    }
+
+
+    @Override
+    public void initData() {
+        recyclerView.showProgress();
+        presenter.getData();
+    }
+
+
+    private void initVideoPlayer() {
+        //设置播放类型
+        // IjkPlayer or MediaPlayer
+        videoPlayer.setPlayerType(VideoPlayer.TYPE_NATIVE);
+        //网络视频地址
+        String videoUrl = DataUtil.getVideoListData().get(0).getVideoUrl();
+        //设置视频地址和请求头部
+        videoPlayer.setUp(videoUrl, null);
+        //创建视频控制器
+        VideoPlayerController controller = new VideoPlayerController(this);
+        controller.setTitle("高仿优酷视频播放页面");
+        controller.setLength(98000);
+        ImageUtils.loadImgByPicasso(this, R.drawable.image_default, R.drawable.image_default, controller.imageView());
+        //设置视频控制器
+        videoPlayer.setController(controller);
+        //是否从上一次的位置继续播放
+        videoPlayer.continueFromLastPosition(true);
+        //设置播放速度
+        videoPlayer.setSpeed(1.0f);
+    }
+
+
+    private void initYCRefreshView() {
+        recyclerView.setLayoutManager(new LinearLayoutManager(this));
+        final RecycleViewItemLine line = new RecycleViewItemLine(this, LinearLayout.HORIZONTAL,
+                SizeUtils.dp2px(1), Color.parseColor("#f5f5f7"));
+        recyclerView.addItemDecoration(line);
+        adapter = new VideoPlayerMeAdapter(this);
+        recyclerView.setAdapter(adapter);
+        addHeader();
+        recyclerView.setRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
+            @Override
+            public void onRefresh() {
+                SwipeRefreshLayout swipeToRefresh = recyclerView.getSwipeToRefresh();
+                if(swipeToRefresh.isRefreshing()){
+                    recyclerView.setRefreshing(false);
+                }
+            }
+        });
+    }
+
+
+    /**
+     * 添加头部
+     */
+    private void addHeader() {
+        adapter.removeAllHeader();
+        initTopHeaderView();
+        initHeaderTitle();
+        initHorizontalView();
+        initVideoContentView();
+        initBottomHeaderView();
+    }
+
+
+    @Override
+    public void setAdapterView(List<VideoPlayerComment> comments) {
+        adapter.addAll(comments);
+        adapter.notifyDataSetChanged();
+        recyclerView.showRecycler();
+    }
+
+
+    private void initTopHeaderView() {
+        adapter.addHeader(new RecyclerArrayAdapter.ItemView() {
+            @Override
+            public View onCreateView(ViewGroup parent) {
+                return LayoutInflater.from(VideoPlayerMeActivity.this).inflate(
+                        R.layout.head_video_player, parent, false);
+            }
+
+
+            @Override
+            public void onBindView(View headerView) {
+                TextView tvPlayerTitle = (TextView) headerView.findViewById(R.id.tv_player_title);
+                TextView tvPlayerName = (TextView) headerView.findViewById(R.id.tv_player_name);
+                TextView tvPlayerDuty = (TextView) headerView.findViewById(R.id.tv_player_duty);
+                ImageView ivPlayerCollection = (ImageView) headerView.findViewById(R.id.iv_player_collection);
+                ImageView ivPlayerDownload = (ImageView) headerView.findViewById(R.id.iv_player_download);
+                ImageView ivPlayerShare = (ImageView) headerView.findViewById(R.id.iv_player_share);
+
+                View.OnClickListener listener = new View.OnClickListener() {
+                    @Override
+                    public void onClick(View v) {
+                        switch (v.getId()){
+                            case R.id.iv_player_collection:
+                                ToastUtil.showToast(VideoPlayerMeActivity.this,"收藏视频");
+                                break;
+                            case R.id.iv_player_download:
+
+                                break;
+                            case R.id.iv_player_share:
+                                ToastUtil.showToast(VideoPlayerMeActivity.this,"分享视频");
+                                break;
+                            default:
+                                break;
+                        }
+                    }
+                };
+                ivPlayerCollection.setOnClickListener(listener);
+                ivPlayerDownload.setOnClickListener(listener);
+                ivPlayerShare.setOnClickListener(listener);
+            }
+        });
+    }
+
+
+    private void initHeaderTitle() {
+        adapter.addHeader(new RecyclerArrayAdapter.ItemView() {
+            @Override
+            public View onCreateView(ViewGroup parent) {
+                return LayoutInflater.from(VideoPlayerMeActivity.this).inflate
+                        (R.layout.head_video_player_title, parent, false);
+            }
+
+            @Override
+            public void onBindView(View headerView) {
+                TextView tvPlayerTitle = (TextView) headerView.findViewById(R.id.tv_player_title);
+                tvPlayerTitle.setText("热门推荐");
+            }
+        });
+    }
+
+
+    private void initHorizontalView() {
+        adapter.addHeader(new RecyclerArrayAdapter.ItemView() {
+            @Override
+            public View onCreateView(ViewGroup parent) {
+                RecyclerView recyclerView = new RecyclerView(parent.getContext()){
+                    //为了不打扰横向RecyclerView的滑动操作,可以这样处理
+                    @SuppressLint("ClickableViewAccessibility")
+                    @Override
+                    public boolean onTouchEvent(MotionEvent event) {
+                        super.onTouchEvent(event);
+                        return true;
+                    }
+                };
+                RecyclerView.LayoutParams layoutParams = new RecyclerView.LayoutParams(
+                        ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
+                layoutParams.setMargins(SizeUtils.dp2px(10),SizeUtils.dp2px(5),
+                        SizeUtils.dp2px(10),SizeUtils.dp2px(5));
+                recyclerView.setLayoutParams(layoutParams);
+                final NarrowImageAdapter narrowAdapter;
+                recyclerView.setAdapter(narrowAdapter = new NarrowImageAdapter(parent.getContext()));
+                recyclerView.setLayoutManager(new LinearLayoutManager(parent.getContext(), LinearLayoutManager.HORIZONTAL,false));
+                recyclerView.addItemDecoration(new SpaceViewItemLine(SizeUtils.dp2px(8)));
+
+                narrowAdapter.setMore(R.layout.view_video_more_horizontal, new RecyclerArrayAdapter.OnLoadMoreListener() {
+                    @Override
+                    public void onLoadMore() {
+                        new Handler().postDelayed(new Runnable() {
+                            @Override
+                            public void run() {
+                                ToastUtil.showToast(VideoPlayerMeActivity.this,"没有更多呢!");
+                            }
+                        },1000);
+                    }
+                });
+                List<VideoPlayerFavorite> favoriteList = new ArrayList<>();
+                for(int a=0 ; a<10 ; a++){
+                    VideoPlayerFavorite videoPlayerFavorite = new VideoPlayerFavorite(
+                            "这个是猜你喜欢的标题",R.drawable.bg_small_tree_min,"");
+                    favoriteList.add(videoPlayerFavorite);
+
+                }
+                narrowAdapter.addAll(favoriteList);
+                return recyclerView;
+            }
+
+            @Override
+            public void onBindView(View headerView) {
+                //这里的处理别忘了
+                ((ViewGroup)headerView).requestDisallowInterceptTouchEvent(true);
+            }
+        });
+    }
+
+
+
+    private void initVideoContentView() {
+        adapter.addHeader(new RecyclerArrayAdapter.ItemView() {
+            @Override
+            public View onCreateView(ViewGroup parent) {
+                return LayoutInflater.from(VideoPlayerMeActivity.this).inflate
+                        (R.layout.head_video_player_content, parent, false);
+            }
+
+            @Override
+            public void onBindView(View headerView) {
+                TextView tvPlayerCurriculum = (TextView) headerView.findViewById(R.id.tv_player_curriculum);
+            }
+        });
+    }
+
+
+    private void initBottomHeaderView() {
+        adapter.addFooter(new RecyclerArrayAdapter.ItemView() {
+            @Override
+            public View onCreateView(ViewGroup parent) {
+                TextView tv = new TextView(VideoPlayerMeActivity.this);
+                tv.setLayoutParams(new ViewGroup.LayoutParams(
+                        ViewGroup.LayoutParams.MATCH_PARENT, SizeUtils.dp2px(36)));
+                tv.setGravity(Gravity.CENTER);
+                tv.setTextSize(TypedValue.COMPLEX_UNIT_SP,16);
+                tv.setText("哥们,已经没有数据了……");
+                return tv;
+            }
+
+            @Override
+            public void onBindView(View headerView) {
+
+            }
+        });
+    }
+
+
+}

+ 36 - 0
app/src/main/java/org/yczbj/ycvideoplayer/ui/main/view/adapter/NarrowImageAdapter.java

@@ -0,0 +1,36 @@
+package org.yczbj.ycvideoplayer.ui.main.view.adapter;
+
+import android.content.Context;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+
+import org.yczbj.ycrefreshviewlib.adapter.RecyclerArrayAdapter;
+import org.yczbj.ycrefreshviewlib.viewHolder.BaseViewHolder;
+import org.yczbj.ycvideoplayer.R;
+import org.yczbj.ycvideoplayer.ui.main.model.VideoPlayerFavorite;
+
+
+public class NarrowImageAdapter extends RecyclerArrayAdapter<VideoPlayerFavorite> {
+
+
+    public NarrowImageAdapter(Context context) {
+        super(context);
+    }
+
+    @Override
+    public BaseViewHolder OnCreateViewHolder(ViewGroup parent, int viewType) {
+        return new NarrowImageViewHolder(parent);
+    }
+
+    private static class NarrowImageViewHolder extends BaseViewHolder<VideoPlayerFavorite> {
+
+        NarrowImageViewHolder(ViewGroup parent) {
+            super(parent, R.layout.view_video_player_favorite);
+        }
+
+        @Override
+        public void setData(VideoPlayerFavorite data) {
+
+        }
+    }
+}

+ 45 - 0
app/src/main/java/org/yczbj/ycvideoplayer/ui/main/view/adapter/VideoPlayerMeAdapter.java

@@ -0,0 +1,45 @@
+package org.yczbj.ycvideoplayer.ui.main.view.adapter;
+
+import android.annotation.SuppressLint;
+import android.app.Activity;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+
+import org.yczbj.ycrefreshviewlib.adapter.RecyclerArrayAdapter;
+import org.yczbj.ycrefreshviewlib.viewHolder.BaseViewHolder;
+import org.yczbj.ycvideoplayer.R;
+import org.yczbj.ycvideoplayer.ui.main.model.VideoPlayerComment;
+
+
+public class VideoPlayerMeAdapter extends RecyclerArrayAdapter<VideoPlayerComment> {
+
+    public VideoPlayerMeAdapter(Activity activity) {
+        super(activity);
+    }
+
+    @Override
+    public BaseViewHolder OnCreateViewHolder(ViewGroup parent, int viewType) {
+        return new VideoPlayerViewHolder(parent);
+    }
+
+
+    private class VideoPlayerViewHolder extends BaseViewHolder<VideoPlayerComment> {
+
+        ImageView iv_movie_photo;
+        TextView tv_movie_title , tv_movie_directors ,tv_movie_casts,tv_movie_genres ,tv_movie_rating_rate;
+        View view_color;
+
+        VideoPlayerViewHolder(ViewGroup parent) {
+            super(parent, R.layout.item_video_player_com);
+        }
+
+        @Override
+        public void setData(VideoPlayerComment data) {
+            super.setData(data);
+
+        }
+    }
+}

+ 2 - 1
app/src/main/java/org/yczbj/ycvideoplayer/ui/test2/TestMyActivity.java

@@ -85,7 +85,8 @@ public class TestMyActivity extends BaseActivity implements View.OnClickListener
     @Override
     public void initView() {
         //设置播放类型
-        niceVideoPlayer.setPlayerType(VideoPlayer.TYPE_NATIVE); // IjkPlayer or MediaPlayer
+        // IjkPlayer or MediaPlayer
+        niceVideoPlayer.setPlayerType(VideoPlayer.TYPE_NATIVE);
         //网络视频地址
         String videoUrl = DataUtil.getVideoListData().get(0).getVideoUrl();
         //设置视频地址和请求头部

+ 162 - 0
app/src/main/java/org/yczbj/ycvideoplayer/util/InterceptorUtils.java

@@ -0,0 +1,162 @@
+package org.yczbj.ycvideoplayer.util;
+
+import android.util.Log;
+
+import com.blankj.utilcode.util.NetworkUtils;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+import okhttp3.CacheControl;
+import okhttp3.Cookie;
+import okhttp3.CookieJar;
+import okhttp3.HttpUrl;
+import okhttp3.Interceptor;
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import okhttp3.Response;
+import okhttp3.logging.HttpLoggingInterceptor;
+
+/**
+ * Created by PC on 2017/9/22.
+ * 作者:PC
+ */
+
+public class InterceptorUtils {
+
+    /**
+     * 创建日志拦截器
+     * @return              HttpLoggingInterceptor
+     */
+    public static HttpLoggingInterceptor getHttpLoggingInterceptor(boolean debug) {
+        HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {
+            @Override
+            public void log(String message) {
+                Log.e("OkHttp", "log = " + message);
+            }
+        });
+        if (debug) {
+            // 测试
+            loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
+        } else {
+            // 打包
+            loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.NONE);
+        }
+        return loggingInterceptor;
+    }
+
+
+    /**
+     * 请求头拦截器
+     * 使用addHeader()不会覆盖之前设置的header,若使用header()则会覆盖之前的header
+     * @return
+     */
+    public static Interceptor getRequestHeader() {
+        Interceptor headerInterceptor = new Interceptor() {
+            @Override
+            public Response intercept(Chain chain) throws IOException {
+                Request originalRequest = chain.request();
+                Request.Builder builder = originalRequest.newBuilder();
+                builder.addHeader("version", "1");
+                builder.addHeader("time", System.currentTimeMillis() + "");
+                Request.Builder requestBuilder = builder.method(originalRequest.method(), originalRequest.body());
+                Request request = requestBuilder.build();
+                return chain.proceed(request);
+            }
+        };
+        return headerInterceptor;
+    }
+
+
+    /**
+     * 统一请求拦截器
+     * 统一的请求参数
+     */
+    public static Interceptor commonParamsInterceptor() {
+        Interceptor commonParams = new Interceptor() {
+            @Override
+            public Response intercept(Chain chain) throws IOException {
+                Request originRequest = chain.request();
+                Request request;
+                HttpUrl httpUrl = originRequest.url().newBuilder()
+                        .addQueryParameter("paltform", "android")
+                        .addQueryParameter("version", "1.0.0")
+                        .build();
+                request = originRequest.newBuilder()
+                        .url(httpUrl)
+                        .build();
+                return chain.proceed(request);
+            }
+        };
+        return commonParams;
+    }
+
+
+    /**
+     * 在无网络的情况下读取缓存,有网络的情况下根据缓存的过期时间重新请求
+     * @return
+     */
+    public static Interceptor getCacheInterceptor() {
+        Interceptor commonParams = new Interceptor() {
+            @Override
+            public Response intercept(Chain chain) throws IOException {
+                Request request = chain.request();
+                if (!NetworkUtils.isConnected()) {
+                    //无网络下强制使用缓存,无论缓存是否过期,此时该请求实际上不会被发送出去。
+                    request = request.newBuilder()
+                            .cacheControl(CacheControl.FORCE_CACHE)
+                            .build();
+                }
+                Response response = chain.proceed(request);
+                if (NetworkUtils.isConnected()) {
+                    // 有网络情况下,根据请求接口的设置,配置缓存。
+                    // 这样在下次请求时,根据缓存决定是否真正发出请求。
+                    String cacheControl = request.cacheControl().toString();
+                    //当然如果你想在有网络的情况下都直接走网络,那么只需要
+                    //将其超时时间这是为0即可:String cacheControl="Cache-Control:public,max-age=0"
+                    int maxAge = 60 * 60;
+                    // read from cache for 1 minute
+                    return response.newBuilder()
+                            .header("Cache-Control", cacheControl)
+                            .header("Cache-Control", "public, max-age=" + maxAge)
+                            .removeHeader("Pragma") .build();
+                } else { //无网络
+                    // tolerate 4-weeks stale
+                    int maxStale = 60 * 60 * 24 * 28;
+                    return response.newBuilder()
+                            .header("Cache-Control", "public,only-if-cached,max-stale=360000")
+                            .header("Cache-Control", "public,only-if-cached,max-stale=" + maxStale)
+                            .removeHeader("Pragma") .build();
+                }
+            }
+        };
+        return commonParams;
+    }
+
+
+    /**
+     * 自定义CookieJar
+     * @param builder
+     */
+    public static void addCookie(OkHttpClient.Builder builder){
+        builder.cookieJar(new CookieJar() {
+            private final HashMap<HttpUrl, List<Cookie>> cookieStore = new HashMap<>();
+            @Override
+            public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
+                cookieStore.put(url, cookies);
+                //保存cookie //也可以使用SP保存
+            }
+
+            @Override
+            public List<Cookie> loadForRequest(HttpUrl url) {
+                List<Cookie> cookies = cookieStore.get(url);
+                //取出cookie
+                return cookies != null ? cookies : new ArrayList<Cookie>();
+            }
+        });
+    }
+
+
+}

+ 230 - 0
app/src/main/java/org/yczbj/ycvideoplayer/util/OkHttpUtils.java

@@ -0,0 +1,230 @@
+package org.yczbj.ycvideoplayer.util;
+
+
+
+import org.yczbj.ycvideoplayer.base.BaseInterceptor;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.FileNameMap;
+import java.net.URLConnection;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+import okhttp3.Call;
+import okhttp3.Callback;
+import okhttp3.Connection;
+import okhttp3.Interceptor;
+import okhttp3.MediaType;
+import okhttp3.MultipartBody;
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import okhttp3.RequestBody;
+import okhttp3.Response;
+
+/**
+ * ================================================
+ * 作    者:杨充
+ * 版    本:1.0
+ * 创建日期:2018/1/9
+ * 描    述:http简单请求工具类[没有封装],只是作为分析源码基础,不建议使用
+ * 修订历史:
+ * ================================================
+ */
+public class OkHttpUtils {
+
+    private static OkHttpClient client = null;
+
+    private OkHttpUtils() {}
+
+    /**
+     * 恶汉式单例
+     * @return                  返回OkHttpClient实例对象
+     */
+    public static OkHttpClient getInstance() {
+        if (client == null) {
+            synchronized (OkHttpUtils.class) {
+                if (client == null){
+                    client = new OkHttpClient.Builder()
+                            .addInterceptor(InterceptorUtils.getHttpLoggingInterceptor(true))
+                            .addInterceptor(new BaseInterceptor())
+                            .connectTimeout(15, TimeUnit.SECONDS)
+                            .writeTimeout(20, TimeUnit.SECONDS)
+                            .readTimeout(20, TimeUnit.SECONDS)
+                            .build();
+                }
+            }
+        }
+        return client;
+    }
+
+    /**
+     * 普通的get请求
+     * @param url               请求地址,比如:http://api.tianapi.com/social/?key=APIKEY&num=10
+     * @param callback          callback
+     *
+     *                          使用场景:比如投资界,新芽的新闻,数据等详情页面用get请求
+     */
+    @SuppressWarnings("AlibabaRemoveCommentedCode")
+    public static void getWebRequest(String url , Callback callback){
+        Request request = new Request.Builder()
+                .url(url)
+                .build();
+        Call call = getInstance().newCall(request);
+        call.enqueue(callback);
+
+
+        try {
+            Response response = client.newCall(request).execute();
+            // getInstance().newCall(request).enqueue(callback);
+            // Response response = getInstance().newCall(request).execute();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+
+    /**
+     * 普通的post请求
+     * @param url               请求地址,比如:http://api.tianapi.com/social/
+     * @param mapParams         请求参数,比如key=APIKEY;num=10;……
+     * @param callback          callback
+     *
+     *                          使用场景:比如投资界,新芽list页面用post请求
+     */
+    public static void postWebRequest(String url, Map<String, Object> mapParams, Callback callback){
+        StringBuilder sb = new StringBuilder();
+        for (String key :mapParams.keySet()) {
+            sb.append(key)
+                    .append("=")
+                    .append("")
+                    .append(mapParams.get(key))
+                    .append("&");
+        }
+        RequestBody requestBody = RequestBody.create(
+                MediaType.parse("application/x-www-form-urlencoded"),sb.toString());
+        Request request = new Request.Builder()
+                .url(url)
+                .post(requestBody)
+                .build();
+        Call call = getInstance().newCall(request);
+        call.enqueue(callback);
+    }
+
+
+    /**
+     * 普通post的json请求
+     * @param url               请求地址
+     * @param json              请求参数,json
+     * @param callback          callback
+     *
+     *                          使用场景,还没遇到过
+     */
+    public static void postJsonRequest(String url , String json , Callback callback){
+        RequestBody body = RequestBody.create(
+                MediaType.parse("application/json; charset=utf-8"), json);
+        Request request = new Request.Builder()
+                .url(url)
+                .post(body)
+                .build();
+        Call call = getInstance().newCall(request);
+        call.enqueue(callback);
+    }
+
+
+    /**
+     * 上传文件,post请求
+     * @param url               请求地址
+     * @param pathName          文件路径名称
+     * @param fileName          文件名
+     * @param callback          callback
+     */
+    public static void postUploadFile(String url, String pathName, String fileName, Callback callback) {
+        //判断文件类型
+        MediaType mediaType = MediaType.parse(judgeType(pathName));
+        //创建文件参数
+        MultipartBody.Builder builder ;
+        if (mediaType != null) {
+            builder = new MultipartBody.Builder()
+                    .setType(MultipartBody.FORM)
+                    .addFormDataPart(mediaType.type(), fileName,
+                                    RequestBody.create(mediaType, new File(pathName)));
+            //发出请求参数
+            Request request = new Request.Builder()
+                    .url(url)
+                    .post(builder.build())
+                    .build();
+            Call call = getInstance().newCall(request);
+            call.enqueue(callback);
+        }
+    }
+
+
+    /**
+     * 下载文件
+     * @param url               请求地址
+     * @param fileDir           父路径名字符串
+     * @param fileName          子路径名的字符串
+     */
+    public static void downFile(String url, final String fileDir, final String fileName) {
+        Request request = new Request.Builder()
+                .url(url)
+                .build();
+        Call call = getInstance().newCall(request);
+        call.enqueue(new Callback() {
+            @Override
+            public void onFailure(Call call, IOException e) {
+
+            }
+
+            @Override
+            public void onResponse(Call call, Response response) throws IOException {
+                InputStream is = null;
+                byte[] buf = new byte[2048];
+                int len ;
+                FileOutputStream fos = null;
+                try {
+                    //noinspection ConstantConditions
+                    is = response.body().byteStream();
+                    File file = new File(fileDir, fileName);
+                    fos = new FileOutputStream(file);
+                    while ((len = is.read(buf)) != -1) {
+                        fos.write(buf, 0, len);
+                    }
+                    fos.flush();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                } finally {
+                    if (is != null){
+                        is.close();
+                    }
+                    if (fos != null){
+                        fos.close();
+                    }
+                }
+            }
+        });
+
+    }
+
+
+    /**
+     * 根据文件路径判断MediaType
+     * @param path              文件路径
+     * @return                  返回字符串类型的文件类型
+     */
+    private static String judgeType(String path) {
+        FileNameMap fileNameMap = URLConnection.getFileNameMap();
+        String contentTypeFor = fileNameMap.getContentTypeFor(path);
+        if (contentTypeFor == null) {
+            contentTypeFor = "application/octet-stream";
+        }
+        return contentTypeFor;
+    }
+
+
+}

+ 226 - 0
app/src/main/java/org/yczbj/ycvideoplayer/util/ScreenCaptureUtils.java

@@ -0,0 +1,226 @@
+package org.yczbj.ycvideoplayer.util;
+
+
+import android.annotation.SuppressLint;
+import android.app.Activity;
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.graphics.Picture;
+import android.graphics.drawable.ColorDrawable;
+import android.graphics.drawable.Drawable;
+import android.os.Build;
+import android.support.v7.widget.RecyclerView;
+import android.util.LruCache;
+import android.view.View;
+import android.webkit.WebView;
+import android.widget.ListAdapter;
+import android.widget.ListView;
+import android.widget.ScrollView;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * ================================================
+ * 作    者:杨充
+ * 版    本:1.0
+ * 创建日期:2018/1/9
+ * 描    述:截屏工具类
+ * 修订历史:
+ * ================================================
+ */
+public class ScreenCaptureUtils {
+
+    /**
+     * 用状态是可转换的方式拍摄当前屏幕
+     * @param activity              上下文
+     * @return                      返回bitmap对象
+     */
+    public static Bitmap shotActivity(Activity activity) {
+        View view = activity.getWindow().getDecorView();
+        view.setDrawingCacheEnabled(true);
+        view.buildDrawingCache();
+        Bitmap bp = Bitmap.createBitmap(view.getDrawingCache(), 0, 0,
+                view.getMeasuredWidth(), view.getMeasuredHeight());
+        view.setDrawingCacheEnabled(false);
+        view.destroyDrawingCache();    return bp;
+    }
+
+
+    /**
+     * 获取当前View的DrawingCache
+     * @param v                     当前view对象
+     * @return                      返回bitmap对象
+     */
+    @SuppressLint("ObsoleteSdkInt")
+    public static Bitmap getViewBp(View v) {
+        if (null == v) {
+            return null;
+        }
+        v.setDrawingCacheEnabled(true);
+        v.buildDrawingCache();
+        if (Build.VERSION.SDK_INT >= 11) {
+            v.measure(View.MeasureSpec.makeMeasureSpec(v.getWidth(),
+                    View.MeasureSpec.EXACTLY), View.MeasureSpec.makeMeasureSpec(
+                    v.getHeight(), View.MeasureSpec.EXACTLY));
+            v.layout((int) v.getX(), (int) v.getY(),
+                    (int) v.getX() + v.getMeasuredWidth(),
+                    (int) v.getY() + v.getMeasuredHeight());
+        } else {
+            v.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
+                    View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
+            v.layout(0, 0, v.getMeasuredWidth(), v.getMeasuredHeight());
+        }
+        Bitmap b = Bitmap.createBitmap(v.getDrawingCache(), 0, 0, v.getMeasuredWidth(), v.getMeasuredHeight());
+        v.setDrawingCacheEnabled(false);
+        v.destroyDrawingCache();
+        return b;
+    }
+
+    /**
+     * 在滚动视图中,如果当前View并没有在视图中全部绘制出来,我们可以利用View的ScrollTo()和ScrollBy()方法
+     * 来移动画布,同时获取当前View的可视部分的DrawingCache,最后进行拼接得到其Bitmap。
+     * 参考demo:https://github.com/PGSSoft/scrollscreenshot
+     */
+
+    /**
+     * ScrollView截屏
+     * ScrollView最简单,因为ScrollView只有一个childView,虽然没有全部显示在界面上,但是已经全部渲染绘制,
+     * 因此可以直接调用scrollView.draw(canvas)`来完成截图
+     * @param scrollView            scrollView对象
+     * @return                      返回bitmap对象
+     */
+    public static Bitmap shotScrollView(ScrollView scrollView) {
+        int h = 0;
+        Bitmap bitmap = null;
+        for (int i = 0; i < scrollView.getChildCount(); i++) {
+            h += scrollView.getChildAt(i).getHeight();
+            scrollView.getChildAt(i).setBackgroundColor(Color.parseColor("#ffffff"));
+        }
+        bitmap = Bitmap.createBitmap(scrollView.getWidth(), h, Bitmap.Config.RGB_565);
+        final Canvas canvas = new Canvas(bitmap);
+        scrollView.draw(canvas);
+        return bitmap;
+    }
+
+
+    /**
+     * ListView截屏
+     * 而ListView就是会回收与重用Item,并且只会绘制在屏幕上显示的ItemView,根据stackoverflow上大神的建议,
+     * 采用一个List来存储Item的视图,这种方案依然不够好,当Item足够多的时候,可能会发生oom。
+     * @param listView              ListView对象
+     * @return                      返回bitmap对象
+     */
+    public static Bitmap shotListView(ListView listView) {
+        ListAdapter adapter = listView.getAdapter();
+        int itemsCount = adapter.getCount();
+        int itemHeight = 0;
+        List<Bitmap> bmp = new ArrayList<>();
+        for (int i = 0; i < itemsCount; i++) {
+            View childView = adapter.getView(i, null, listView);
+            childView.measure(
+                    View.MeasureSpec.makeMeasureSpec(listView.getWidth(), View.MeasureSpec.EXACTLY),
+                    View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
+            childView.layout(0, 0, childView.getMeasuredWidth(), childView.getMeasuredHeight());
+            childView.setDrawingCacheEnabled(true);
+            childView.buildDrawingCache();
+            bmp.add(childView.getDrawingCache());
+            itemHeight += childView.getMeasuredHeight();
+        }
+        Bitmap bigBitmap =
+                Bitmap.createBitmap(listView.getMeasuredWidth(), itemHeight, Bitmap.Config.ARGB_8888);
+        Canvas bigCanvas = new Canvas(bigBitmap);
+        Paint paint = new Paint();
+        int iHeight = 0;
+        for (int i = 0; i < bmp.size(); i++) {
+            Bitmap bp = bmp.get(i);
+            bigCanvas.drawBitmap(bp, 0, iHeight, paint);
+            iHeight += bp.getHeight();
+            bp.recycle();
+            bp = null;
+        }
+        return bigBitmap;
+    }
+
+
+    /**
+     * RecyclerView截屏
+     * 在新的Android版本中,已经可以用RecyclerView来代替使用ListView的场景,相比较ListView,
+     * RecyclerView对Item View的缓存支持的更好。可以采用和ListView相同的方案,
+     * 这里也是在stackoverflow上看到的方案。
+     * @param view                  RecyclerView对象
+     * @return                      返回bitmap对象
+     */
+    public static Bitmap shotRecyclerView(RecyclerView view) {
+        RecyclerView.Adapter adapter = view.getAdapter();
+        Bitmap bigBitmap = null;
+        if (adapter != null) {
+            int size = adapter.getItemCount();
+            int height = 0;
+            Paint paint = new Paint();
+            int iHeight = 0;
+            final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
+            // Use 1/8th of the available memory for this memory cache.
+            final int cacheSize = maxMemory / 8;
+            LruCache<String, Bitmap> bitmaCache = new LruCache<>(cacheSize);
+            for (int i = 0; i < size; i++) {
+                RecyclerView.ViewHolder holder = adapter.createViewHolder(view, adapter.getItemViewType(i));
+                //noinspection unchecked
+                adapter.onBindViewHolder(holder, i);
+                holder.itemView.measure(
+                        View.MeasureSpec.makeMeasureSpec(view.getWidth(), View.MeasureSpec.EXACTLY),
+                        View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
+                holder.itemView.layout(0, 0, holder.itemView.getMeasuredWidth(),
+                        holder.itemView.getMeasuredHeight());
+                holder.itemView.setDrawingCacheEnabled(true);
+                holder.itemView.buildDrawingCache();
+                Bitmap drawingCache = holder.itemView.getDrawingCache();
+                if (drawingCache != null) {
+                    bitmaCache.put(String.valueOf(i), drawingCache);
+                }
+                height += holder.itemView.getMeasuredHeight();
+            }
+            bigBitmap = Bitmap.createBitmap(view.getMeasuredWidth(), height, Bitmap.Config.ARGB_8888);
+            Canvas bigCanvas = new Canvas(bigBitmap);
+            Drawable lBackground = view.getBackground();
+            if (lBackground instanceof ColorDrawable) {
+                ColorDrawable lColorDrawable = (ColorDrawable) lBackground;
+                int lColor = lColorDrawable.getColor();
+                bigCanvas.drawColor(lColor);
+            }
+            for (int i = 0; i < size; i++) {
+                Bitmap bitmap = bitmaCache.get(String.valueOf(i));
+                bigCanvas.drawBitmap(bitmap, 0f, iHeight, paint);
+                iHeight += bitmap.getHeight();
+                bitmap.recycle();
+            }
+        }
+        return bigBitmap;
+    }
+
+
+    /**
+     * Android5.0以下版本
+     * 对WebView进行截屏,虽然使用过期方法,
+     * 但在当前Android版本中测试可行
+     * @param webView               WebView控件
+     * @return                      返回bitmap对象
+     */
+    private static Bitmap captureWebViewKitKat(WebView webView) {
+        Picture picture = webView.capturePicture();
+        int width = picture.getWidth();
+        int height = picture.getHeight();
+        if (width > 0 && height > 0) {
+            Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
+            Canvas canvas = new Canvas(bitmap);
+            picture.draw(canvas);
+            return bitmap;
+        }
+        return null;
+    }
+
+
+}

BIN
app/src/main/res/drawable-xhdpi/ic_write_normal.png


BIN
app/src/main/res/drawable-xhdpi/ic_write_pressed.png


BIN
app/src/main/res/drawable-xhdpi/icon_video_collection.png


BIN
app/src/main/res/drawable-xhdpi/icon_video_download_core.png


BIN
app/src/main/res/drawable-xhdpi/icon_video_share.png


BIN
app/src/main/res/drawable-xhdpi/icon_zan_details_normal.png


BIN
app/src/main/res/drawable-xhdpi/icon_zan_details_pressed.png


+ 8 - 0
app/src/main/res/drawable/selector_video_player_detail.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:state_pressed="true"
+        android:drawable="@drawable/ic_write_pressed"/>
+    <item android:state_checked="true"
+        android:drawable="@drawable/ic_write_pressed"/>
+    <item android:drawable="@drawable/ic_write_normal"/>
+</selector>

+ 39 - 0
app/src/main/res/layout/activity_video_player_jz_detail.xml

@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    xmlns:app="http://schemas.android.com/apk/res-auto">
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:orientation="vertical">
+
+        <!--视频播放器-->
+        <cn.jzvd.CustomView.MyJZVideoPlayerStandard
+            android:id="@+id/jz_video"
+            android:layout_width="match_parent"
+            android:layout_height="200dp" />
+
+        <!--视频播放器下面内容-->
+        <org.yczbj.ycrefreshviewlib.YCRefreshView
+            android:id="@+id/recyclerView"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"/>
+    </LinearLayout>
+
+    <android.support.design.widget.FloatingActionButton
+        android:id="@+id/fab"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_margin="15dp"
+        android:layout_alignParentBottom="true"
+        android:layout_alignParentEnd="true"
+        android:backgroundTint="@color/colorWhite"
+        app:fabSize="mini"
+        android:src="@drawable/selector_video_player_detail"
+        tools:ignore="UnusedAttribute" />
+
+</RelativeLayout>

+ 39 - 0
app/src/main/res/layout/activity_video_player_me_detail.xml

@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    xmlns:app="http://schemas.android.com/apk/res-auto">
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:orientation="vertical">
+
+        <!--视频播放器-->
+        <org.yczbj.ycvideoplayerlib.VideoPlayer
+            android:id="@+id/video_player"
+            android:layout_width="match_parent"
+            android:layout_height="200dp" />
+
+        <!--视频播放器下面内容-->
+        <org.yczbj.ycrefreshviewlib.YCRefreshView
+            android:id="@+id/recyclerView"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"/>
+    </LinearLayout>
+
+    <android.support.design.widget.FloatingActionButton
+        android:id="@+id/fab"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_margin="15dp"
+        android:layout_alignParentBottom="true"
+        android:layout_alignParentEnd="true"
+        android:backgroundTint="@color/colorWhite"
+        app:fabSize="mini"
+        android:src="@drawable/selector_video_player_detail"
+        tools:ignore="UnusedAttribute" />
+
+</RelativeLayout>

+ 63 - 0
app/src/main/res/layout/head_video_player.xml

@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:padding="10dp">
+
+    <TextView
+        android:id="@+id/tv_player_title"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:textSize="16sp"
+        android:textColor="@color/blackText"
+        android:text="高仿优酷视频播放页UI"/>
+
+    <TextView
+        android:id="@+id/tv_player_name"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_below="@+id/tv_player_title"
+        android:layout_marginTop="10dp"
+        android:textSize="12sp"
+        android:textColor="@color/blackText1"
+        android:text="高仿优酷视频播放页UI"/>
+
+    <TextView
+        android:id="@+id/tv_player_duty"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="10dp"
+        android:layout_below="@+id/tv_player_name"
+        android:textSize="12sp"
+        android:textColor="@color/blackText2"
+        android:text="高仿优酷视频播放页UI"/>
+
+    <LinearLayout
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:orientation="horizontal"
+        android:layout_alignParentEnd="true"
+        android:layout_alignParentRight="true"
+        android:layout_below="@id/tv_player_name">
+        <ImageView
+            android:id="@+id/iv_player_collection"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginStart="8dp"
+            android:background="@drawable/icon_video_collection"/>
+        <ImageView
+            android:id="@+id/iv_player_download"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginStart="8dp"
+            android:background="@drawable/icon_video_download_core"/>
+        <ImageView
+            android:id="@+id/iv_player_share"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginStart="8dp"
+            android:background="@drawable/icon_video_share"/>
+    </LinearLayout>
+
+</RelativeLayout>

+ 29 - 0
app/src/main/res/layout/head_video_player_content.xml

@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content">
+
+    <TextView
+        android:id="@+id/tv_player_title"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:padding="10dp"
+        android:background="@color/whiteBg"
+        android:textSize="16sp"
+        android:textColor="@color/blackText"
+        android:text="视频内容介绍"/>
+
+    <TextView
+        android:id="@+id/tv_player_curriculum"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:paddingLeft="10dp"
+        android:paddingRight="10dp"
+        android:paddingBottom="5dp"
+        android:paddingTop="5dp"
+        android:textSize="12sp"
+        android:text="综合案例训练,包含新闻,视频,图片,音乐,记事本等等模块。采用MVP+Rx+Retrofit+Desgin+Dagger2+阿里VLayout+腾讯X5等架构模式。安装阿里编码规约插件,不断修正不合理代码和最大程度去除黄色警告!!!"/>
+
+</LinearLayout>

+ 17 - 0
app/src/main/res/layout/head_video_player_title.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content">
+
+    <TextView
+        android:id="@+id/tv_player_title"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:padding="10dp"
+        android:background="@color/whiteBg"
+        android:textSize="16sp"
+        android:textColor="@color/blackText"
+        android:text="课程内容介绍"/>
+
+</LinearLayout>

+ 48 - 0
app/src/main/res/layout/item_video_player_com.xml

@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="horizontal"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:padding="10dp">
+
+    <ImageView
+        android:id="@+id/iv_user_logo"
+        android:layout_width="60dp"
+        android:layout_height="60dp"
+        android:scaleType="fitCenter"
+        android:background="@drawable/bg_small_solda_min"/>
+
+    <RelativeLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginLeft="15dp">
+        <TextView
+            android:id="@+id/tv_user_name"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:textSize="14sp"
+            android:text="潇湘剑雨"
+            android:textColor="@color/blackText3"/>
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_alignParentEnd="true"
+            android:layout_alignTop="@id/tv_user_name"
+            android:text="3"
+            android:textSize="14sp"
+            android:textColor="@color/blackText"
+            android:drawablePadding="5dp"
+            android:drawableEnd="@drawable/icon_zan_details_normal"/>
+
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_below="@+id/tv_user_name"
+            android:layout_marginTop="15dp"
+            android:textSize="14sp"
+            android:textColor="@color/blackText3"
+            android:text="这个视频播放器做的十分不错,很好,不过还是有些地方需要改进。持续更新中"/>
+    </RelativeLayout>
+
+</LinearLayout>

+ 19 - 0
app/src/main/res/layout/view_video_more_horizontal.xml

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical"
+    android:layout_width="50dp"
+    android:layout_height="wrap_content"
+    android:gravity="center"
+    android:background="@color/whiteBg"
+    >
+    <ProgressBar
+        android:layout_width="30dp"
+        android:layout_height="30dp"
+        android:indeterminate="false"/>
+    <TextView
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:ems="1"
+        android:textSize="14sp"
+        android:text="更多加载中"/>
+</LinearLayout>

+ 27 - 0
app/src/main/res/layout/view_video_player_favorite.xml

@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:paddingBottom="3dp"
+    android:paddingTop="3dp"
+    android:paddingLeft="5dp"
+    android:paddingRight="5dp">
+
+    <ImageView
+        android:layout_width="120dp"
+        android:layout_height="75dp"
+        android:background="@drawable/bg_small_solda_min"
+        android:scaleType="fitCenter" />
+
+    <TextView
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="8dp"
+        android:textColor="@color/blackText3"
+        android:textSize="12sp"
+        android:maxLines="2"
+        android:text="这个是猜你喜欢的视频标题"/>
+
+</LinearLayout>

+ 2 - 2
app/src/main/res/layout/view_vlayout_button.xml

@@ -29,13 +29,13 @@
             style="@style/WeightAttr"
             android:drawablePadding="8dp"
             android:drawableTop="@drawable/ic_home_third"
-            android:text="天行热点" />
+            android:text="仿优酷[Vp]" />
         <TextView
             android:id="@+id/tv_home_four"
             style="@style/WeightAttr"
             android:drawablePadding="8dp"
             android:drawableTop="@drawable/ic_home_four"
-            android:text="干货定制" />
+            android:text="仿优酷[Jz]" />
         <TextView
             android:id="@+id/tv_home_five"
             style="@style/WeightAttr"

+ 1 - 0
app/src/main/res/values/colors.xml

@@ -3,6 +3,7 @@
     <color name="colorPrimary">#3F51B5</color>
     <color name="colorPrimaryDark">#303F9F</color>
     <color name="colorAccent">#FF4081</color>
+    <!--<color name="colorAccent">#ffffff</color>-->
 
     <!--主题颜色-->
     <color name="colorTheme">#252525</color>