Browse Source

YCVideoPlayer

yangchong 7 năm trước cách đây
mục cha
commit
d8d51f322f
32 tập tin đã thay đổi với 1051 bổ sung24 xóa
  1. 7 2
      YCVideoPlayerLib/build.gradle
  2. 7 0
      YCVideoPlayerLib/src/main/java/org/yczbj/ycvideoplayerlib/ConstantKeys.java
  3. 23 0
      YCVideoPlayerLib/src/main/java/org/yczbj/ycvideoplayerlib/InterVideoPlayer.java
  4. 16 0
      YCVideoPlayerLib/src/main/java/org/yczbj/ycvideoplayerlib/OnVideoControlListener.java
  5. 40 0
      YCVideoPlayerLib/src/main/java/org/yczbj/ycvideoplayerlib/VideoPlayer.java
  6. 55 2
      YCVideoPlayerLib/src/main/java/org/yczbj/ycvideoplayerlib/VideoPlayerController.java
  7. BIN
      YCVideoPlayerLib/src/main/res/drawable-xxhdpi/ic_player_audio.png
  8. BIN
      YCVideoPlayerLib/src/main/res/drawable-xxhdpi/ic_player_download.png
  9. BIN
      YCVideoPlayerLib/src/main/res/drawable-xxhdpi/ic_player_share.png
  10. BIN
      YCVideoPlayerLib/src/main/res/drawable-xxhdpi/note_btn_next_white.png
  11. BIN
      YCVideoPlayerLib/src/main/res/drawable-xxhdpi/note_btn_pause_white.png
  12. BIN
      YCVideoPlayerLib/src/main/res/drawable-xxhdpi/note_btn_play_white.png
  13. BIN
      YCVideoPlayerLib/src/main/res/drawable-xxhdpi/note_btn_pre_white.png
  14. 34 2
      YCVideoPlayerLib/src/main/res/layout/custom_video_player_top.xml
  15. 8 1
      app/build.gradle
  16. 2 0
      app/src/main/java/org/yczbj/ycvideoplayer/api/constant/Constant.java
  17. 1 1
      app/src/main/java/org/yczbj/ycvideoplayer/base/BaseDelegateAdapter.java
  18. 28 0
      app/src/main/java/org/yczbj/ycvideoplayer/base/BaseDialog.java
  19. 250 0
      app/src/main/java/org/yczbj/ycvideoplayer/db/RealmHelper.java
  20. 66 0
      app/src/main/java/org/yczbj/ycvideoplayer/model/realm/Collection.java
  21. 49 0
      app/src/main/java/org/yczbj/ycvideoplayer/model/realm/Record.java
  22. 21 0
      app/src/main/java/org/yczbj/ycvideoplayer/model/realm/SearchKey.java
  23. 34 11
      app/src/main/java/org/yczbj/ycvideoplayer/ui/home/view/activity/VideoPlayerMeActivity.java
  24. 1 1
      app/src/main/java/org/yczbj/ycvideoplayer/ui/home/view/fragment/HomeFragment.java
  25. 36 1
      app/src/main/java/org/yczbj/ycvideoplayer/ui/movie/presenter/MoviePresenter.java
  26. 30 2
      app/src/main/java/org/yczbj/ycvideoplayer/ui/person/MeFragment.java
  27. 42 0
      app/src/main/java/org/yczbj/ycvideoplayer/ui/test/test2/TestMyActivity.java
  28. 110 0
      app/src/main/java/org/yczbj/ycvideoplayer/weight/AboutMeDialog.java
  29. 171 0
      app/src/main/res/layout/dialog_about_me.xml
  30. 10 0
      app/src/main/res/layout/fragment_me.xml
  31. 9 0
      app/src/main/res/values/styles.xml
  32. 1 1
      build.gradle

+ 7 - 2
YCVideoPlayerLib/build.gradle

@@ -2,11 +2,11 @@ apply plugin: 'com.android.library'
 
 android {
     compileSdkVersion 25
-    buildToolsVersion '25.0.3'
+    buildToolsVersion '27.0.3'
 
 
     defaultConfig {
-        minSdkVersion 17
+        minSdkVersion 16
         targetSdkVersion 25
         versionCode 1
         versionName "1.0"
@@ -30,6 +30,11 @@ dependencies {
     //这两个是必须要加的,其它的可供选择
     compile 'tv.danmaku.ijk.media:ijkplayer-java:0.8.4'
     compile 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.8.4'
+    //其他库文件
+    //compile 'tv.danmaku.ijk.media:ijkplayer-armv5:0.8.8'
+    //compile 'tv.danmaku.ijk.media:ijkplayer-arm64:0.8.8'
+    //compile 'tv.danmaku.ijk.media:ijkplayer-x86:0.8.8'
+    //compile 'tv.danmaku.ijk.media:ijkplayer-x86_64:0.8.8'
 }
 
 /** 以下开始是将Android Library上传到jcenter的相关配置**/

+ 7 - 0
YCVideoPlayerLib/src/main/java/org/yczbj/ycvideoplayerlib/ConstantKeys.java

@@ -19,5 +19,12 @@ public class ConstantKeys {
         int MEMBER = 1002;
     }
 
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface VideoControl {
+        int DOWNLOAD = 1005;
+        int AUDIO = 1006;
+        int SHARE = 1007;
+    }
+
 
 }

+ 23 - 0
YCVideoPlayerLib/src/main/java/org/yczbj/ycvideoplayerlib/InterVideoPlayer.java

@@ -1,5 +1,6 @@
 package org.yczbj.ycvideoplayerlib;
 
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -15,6 +16,14 @@ public interface InterVideoPlayer {
      */
     void setUp(String url, Map<String, String> headers);
 
+    /**
+     * 设置视频集合链接
+     * @param listUrl       视频集合链接
+     * @param position      位置
+     * @param headers       请求header集合
+     */
+    void setUp(List<String> listUrl , int position , List<Map<String, String>> headers);
+
     /**
      * 开始播放
      */
@@ -27,6 +36,20 @@ public interface InterVideoPlayer {
      */
     void start(long position);
 
+    /**
+     * 注意:播放上一首和下一首只是针对设置视频集合链接后才有效
+     *      如果只是设置播放单个视频,该方法是无效的
+     * 播放下一首
+     */
+    void next();
+
+    /**
+     * 注意:播放上一首和下一首只是针对设置视频集合链接后才有效
+     *      如果只是设置播放单个视频,该方法是无效的
+     * 播放上一首
+     */
+    void prev();
+
     /**
      * 重新播放,播放器被暂停、播放错误、播放完成后,需要调用此方法重新播放
      */

+ 16 - 0
YCVideoPlayerLib/src/main/java/org/yczbj/ycvideoplayerlib/OnVideoControlListener.java

@@ -0,0 +1,16 @@
+package org.yczbj.ycvideoplayerlib;
+
+/**
+ * 视频顶部点击事件
+ */
+
+public interface OnVideoControlListener {
+
+    /**
+     * 视频顶部点击事件【下载,切换音频,分享等】
+     *
+     * @param type      切换到的清晰度的索引值
+     */
+    void onVideoControlClick(int type);
+    
+}

+ 40 - 0
YCVideoPlayerLib/src/main/java/org/yczbj/ycvideoplayerlib/VideoPlayer.java

@@ -7,6 +7,8 @@ import android.graphics.SurfaceTexture;
 import android.media.AudioManager;
 import android.media.MediaPlayer;
 import android.net.Uri;
+import android.os.Build;
+import android.support.annotation.RequiresApi;
 import android.util.AttributeSet;
 import android.view.Gravity;
 import android.view.Surface;
@@ -15,6 +17,7 @@ import android.view.ViewGroup;
 import android.widget.FrameLayout;
 
 import java.io.IOException;
+import java.util.List;
 import java.util.Map;
 
 import tv.danmaku.ijk.media.player.AndroidMediaPlayer;
@@ -159,6 +162,7 @@ public class VideoPlayer extends FrameLayout implements InterVideoPlayer{
         this.addView(mContainer, params);
     }
 
+    /*--------------setUp为必须设置的方法,二选其一--------------------------------------*/
     /**
      * 设置,必须设置
      * @param url               视频地址,可以是本地,也可以是网络视频
@@ -170,6 +174,21 @@ public class VideoPlayer extends FrameLayout implements InterVideoPlayer{
         mHeaders = headers;
     }
 
+    /**
+     * 设置,必须设置
+     * @param listUrl       视频集合链接
+     * @param position      位置
+     */
+    @Override
+    public void setUp(List<String> listUrl, int position , List<Map<String, String>> headers) {
+        /*添加判断,避免使用者传值不严谨导致崩溃*/
+        if(listUrl!=null && listUrl.size()>0 && headers!=null && headers.size()>0){
+            mUrl = listUrl.get(position);
+            mHeaders = headers.get(position);
+        }
+    }
+
+
     /**
      * 设置视频控制器,必须设置
      * @param controller        AbsVideoPlayerController子类对象,可用VideoPlayerController,也可自定义
@@ -186,6 +205,7 @@ public class VideoPlayer extends FrameLayout implements InterVideoPlayer{
         mContainer.addView(mController, params);
     }
 
+
     /**
      * 设置播放器类型,必须设置
      * @param playerType IjkPlayer or MediaPlayer.
@@ -194,6 +214,7 @@ public class VideoPlayer extends FrameLayout implements InterVideoPlayer{
         mPlayerType = playerType;
     }
 
+
     /**
      * 是否从上一次的位置继续播放,不必须
      *
@@ -204,6 +225,7 @@ public class VideoPlayer extends FrameLayout implements InterVideoPlayer{
         this.continueFromLastPosition = continueFromLastPosition;
     }
 
+
     /**
      * 注意:MediaPlayer没有这个方法
      * 设置播放速度,不必须
@@ -221,6 +243,7 @@ public class VideoPlayer extends FrameLayout implements InterVideoPlayer{
         }
     }
 
+
     /**
      * 开始播放
      */
@@ -237,6 +260,7 @@ public class VideoPlayer extends FrameLayout implements InterVideoPlayer{
         }
     }
 
+
     /**
      * 开始播放
      * @param position                 播放位置
@@ -247,6 +271,17 @@ public class VideoPlayer extends FrameLayout implements InterVideoPlayer{
         start();
     }
 
+    @Override
+    public void next() {
+
+    }
+
+    @Override
+    public void prev() {
+
+    }
+
+
     /**
      * 重新播放
      */
@@ -273,6 +308,7 @@ public class VideoPlayer extends FrameLayout implements InterVideoPlayer{
         }
     }
 
+
     /**
      * 暂停播放
      */
@@ -546,7 +582,9 @@ public class VideoPlayer extends FrameLayout implements InterVideoPlayer{
                 //IjkMediaPlayer    基于Ijk
                 case TYPE_IJK:
                 default:
+                    //创建IjkMediaPlayer对象
                     mMediaPlayer = new IjkMediaPlayer();
+                    //设置ijkplayer播放器的硬件解码相关参数
                     ((IjkMediaPlayer)mMediaPlayer).setOption(1, "analyzemaxduration", 100L);
                     ((IjkMediaPlayer)mMediaPlayer).setOption(1, "probesize", 10240L);
                     ((IjkMediaPlayer)mMediaPlayer).setOption(1, "flush_packets", 1L);
@@ -554,6 +592,7 @@ public class VideoPlayer extends FrameLayout implements InterVideoPlayer{
                     ((IjkMediaPlayer)mMediaPlayer).setOption(4, "framedrop", 1L);
                     break;
             }
+            //设置音频流类型
             mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
         }
     }
@@ -562,6 +601,7 @@ public class VideoPlayer extends FrameLayout implements InterVideoPlayer{
     /**
      * 初始化TextureView
      */
+    @RequiresApi(api = Build.VERSION_CODES.ICE_CREAM_SANDWICH)
     private void initTextureView() {
         if (mTextureView == null) {
             mTextureView = new VideoTextureView(mContext);

+ 55 - 2
YCVideoPlayerLib/src/main/java/org/yczbj/ycvideoplayerlib/VideoPlayerController.java

@@ -65,6 +65,10 @@ public class VideoPlayerController extends AbsVideoPlayerController implements V
     private LinearLayout mTop;
     private ImageView mBack;
     private TextView mTitle;
+    private LinearLayout mLlTopOther;
+    private ImageView mIvDownload;
+    private ImageView mIvAudio;
+    private ImageView mIvShare;
     private LinearLayout mBatteryTime;
     private ImageView mBattery;
     private TextView mTime;
@@ -145,6 +149,7 @@ public class VideoPlayerController extends AbsVideoPlayerController implements V
     private long mTrySeeTime;
 
 
+
     public VideoPlayerController(Context context) {
         super(context);
         mContext = context;
@@ -160,12 +165,18 @@ public class VideoPlayerController extends AbsVideoPlayerController implements V
     private void initFindViewById() {
         mCenterStart = (ImageView) findViewById(R.id.center_start);
         mImage = (ImageView) findViewById(R.id.image);
+
         mTop = (LinearLayout) findViewById(R.id.top);
         mBack = (ImageView) findViewById(R.id.back);
         mTitle = (TextView) findViewById(R.id.title);
+        mLlTopOther = (LinearLayout) findViewById(R.id.ll_top_other);
+        mIvDownload = (ImageView) findViewById(R.id.iv_download);
+        mIvAudio = (ImageView) findViewById(R.id.iv_audio);
+        mIvShare = (ImageView) findViewById(R.id.iv_share);
         mBatteryTime = (LinearLayout) findViewById(R.id.battery_time);
         mBattery = (ImageView) findViewById(R.id.battery);
         mTime = (TextView) findViewById(R.id.time);
+
         mBottom = (LinearLayout) findViewById(R.id.bottom);
         mRestartPause = (ImageView) findViewById(R.id.restart_or_pause);
         mPosition = (TextView) findViewById(R.id.position);
@@ -204,6 +215,10 @@ public class VideoPlayerController extends AbsVideoPlayerController implements V
     private void initListener() {
         mCenterStart.setOnClickListener(this);
         mBack.setOnClickListener(this);
+        mIvDownload.setOnClickListener(this);
+        mIvShare.setOnClickListener(this);
+        mIvAudio.setOnClickListener(this);
+
         mRestartPause.setOnClickListener(this);
         mFullScreen.setOnClickListener(this);
         mClarity.setOnClickListener(this);
@@ -298,6 +313,7 @@ public class VideoPlayerController extends AbsVideoPlayerController implements V
         this.mMemberContent = memberContent;
     }
 
+
     /**
      * 设置不操作后,多久自动隐藏头部和底部布局
      * @param time                  时间
@@ -317,6 +333,7 @@ public class VideoPlayerController extends AbsVideoPlayerController implements V
         mTitle.setText(title);
     }
 
+
     /**
      * 获取ImageView的对象
      * @return                  对象
@@ -326,6 +343,7 @@ public class VideoPlayerController extends AbsVideoPlayerController implements V
         return mImage;
     }
 
+
     /**
      * 设置图片
      * @param resId             视频底图资源
@@ -335,6 +353,7 @@ public class VideoPlayerController extends AbsVideoPlayerController implements V
         mImage.setImageResource(resId);
     }
 
+
     /**
      * 设置视频时长
      * @param length            时长,long类型
@@ -344,6 +363,7 @@ public class VideoPlayerController extends AbsVideoPlayerController implements V
         mLength.setText(VideoPlayerUtils.formatTime(length));
     }
 
+
     /**
      * 设置视频时长
      * @param length            时长,String类型
@@ -512,6 +532,7 @@ public class VideoPlayerController extends AbsVideoPlayerController implements V
                 mFullScreen.setImageResource(R.drawable.ic_player_enlarge);
                 mFullScreen.setVisibility(View.VISIBLE);
                 mClarity.setVisibility(View.GONE);
+                mLlTopOther.setVisibility(VISIBLE);
                 mBatteryTime.setVisibility(View.GONE);
                 if (hasRegisterBatteryReceiver) {
                     mContext.unregisterReceiver(mBatterReceiver);
@@ -527,6 +548,7 @@ public class VideoPlayerController extends AbsVideoPlayerController implements V
                 if (clarities != null && clarities.size() > 1) {
                     mClarity.setVisibility(View.VISIBLE);
                 }
+                mLlTopOther.setVisibility(GONE);
                 mBatteryTime.setVisibility(View.VISIBLE);
                 if (!hasRegisterBatteryReceiver) {
                     mContext.registerReceiver(mBatterReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
@@ -686,9 +708,15 @@ public class VideoPlayerController extends AbsVideoPlayerController implements V
             Toast.makeText(mContext, "分享", Toast.LENGTH_SHORT).show();
         } else if (v == mIvTrySee){
             //点击试看按钮,也是播放
-            mVideoPlayer.start();
+            if (mVideoPlayer.isIdle()) {
+                mVideoPlayer.start();
+            }
             mIvTrySee.setVisibility(GONE);
         } else if (v == mBtnVip){
+            if(mClickListener==null){
+                VideoLogUtil.d("请在初始化的时候设置监听事件");
+                return;
+            }
             //点击vip按钮,第一种情况是跳转登录,第二种情况是跳转购买会员页面
             if (mIsLogin) {
                 //试看结束,观看全部内容请开通会员
@@ -706,7 +734,28 @@ public class VideoPlayerController extends AbsVideoPlayerController implements V
         } else if(v == mFlLock){
             //点击锁屏按钮,则进入锁屏模式
             setLock(mIsLock);
-        }else if (v == this) {
+        } else if(v == mIvDownload){
+            if(mVideoControlListener==null){
+                VideoLogUtil.d("请在初始化的时候设置下载监听事件");
+                return;
+            }
+            //点击下载
+            mVideoControlListener.onVideoControlClick(ConstantKeys.VideoControl.DOWNLOAD);
+        } else if(v == mIvAudio){
+            if(mVideoControlListener==null){
+                VideoLogUtil.d("请在初始化的时候设置切换监听事件");
+                return;
+            }
+            //点击切换音频
+            mVideoControlListener.onVideoControlClick(ConstantKeys.VideoControl.AUDIO);
+        }else if(v == mIvShare){
+            if(mVideoControlListener==null){
+                VideoLogUtil.d("请在初始化的时候设置分享监听事件");
+                return;
+            }
+            //点击分享
+            mVideoControlListener.onVideoControlClick(ConstantKeys.VideoControl.SHARE);
+        } else if (v == this) {
             if (mVideoPlayer.isPlaying() || mVideoPlayer.isPaused()
                     || mVideoPlayer.isBufferingPlaying() || mVideoPlayer.isBufferingPaused()) {
                 if(mTrySeeTime==0){
@@ -988,5 +1037,9 @@ public class VideoPlayerController extends AbsVideoPlayerController implements V
         this.mBackListener = listener;
     }
 
+    private OnVideoControlListener mVideoControlListener;
+    public void setOnVideoControlListener(OnVideoControlListener listener){
+        this.mVideoControlListener = listener;
+    }
 
 }

BIN
YCVideoPlayerLib/src/main/res/drawable-xxhdpi/ic_player_audio.png


BIN
YCVideoPlayerLib/src/main/res/drawable-xxhdpi/ic_player_download.png


BIN
YCVideoPlayerLib/src/main/res/drawable-xxhdpi/ic_player_share.png


BIN
YCVideoPlayerLib/src/main/res/drawable-xxhdpi/note_btn_next_white.png


BIN
YCVideoPlayerLib/src/main/res/drawable-xxhdpi/note_btn_pause_white.png


BIN
YCVideoPlayerLib/src/main/res/drawable-xxhdpi/note_btn_play_white.png


BIN
YCVideoPlayerLib/src/main/res/drawable-xxhdpi/note_btn_pre_white.png


+ 34 - 2
YCVideoPlayerLib/src/main/res/layout/custom_video_player_top.xml

@@ -3,7 +3,7 @@
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:id="@+id/top"
     android:layout_width="match_parent"
-    android:layout_height="42dp"
+    android:layout_height="45dp"
     android:background="@drawable/player_mask_top"
     android:gravity="center_vertical"
     android:paddingTop="10dp"
@@ -21,10 +21,41 @@
         android:layout_height="wrap_content"
         android:layout_weight="1"
         android:ellipsize="end"
-        android:maxLines="2"
+        android:maxLines="1"
+        android:maxLength="10"
         android:text="真实死亡游戏“蓝鲸”疑似进入国内,家长们要注意了"
         android:textColor="@android:color/white"
         android:textSize="14sp"/>
+
+    <!--竖屏的时候需要展现的布局,定制的-->
+    <LinearLayout
+        android:id="@+id/ll_top_other"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:orientation="horizontal"
+        android:layout_marginEnd="8dp"
+        android:visibility="visible">
+        <ImageView
+            android:id="@+id/iv_download"
+            android:layout_width="20dp"
+            android:layout_height="20dp"
+            android:src="@drawable/ic_player_download"/>
+        <ImageView
+            android:id="@+id/iv_audio"
+            android:layout_width="20dp"
+            android:layout_height="20dp"
+            android:layout_marginStart="10dp"
+            android:layout_marginEnd="10dp"
+            android:src="@drawable/ic_player_audio"/>
+        <ImageView
+            android:id="@+id/iv_share"
+            android:layout_width="20dp"
+            android:layout_height="20dp"
+            android:src="@drawable/ic_player_share"/>
+    </LinearLayout>
+
+
+    <!--横屏的时候展现的布局-->
     <LinearLayout
         android:id="@+id/battery_time"
         android:layout_width="wrap_content"
@@ -45,4 +76,5 @@
             android:textColor="@android:color/white"
             android:textSize="10sp"/>
     </LinearLayout>
+
 </LinearLayout>

+ 8 - 1
app/build.gradle

@@ -1,5 +1,6 @@
 apply plugin: 'com.android.application'
 apply plugin: 'com.neenbedankt.android-apt'
+apply plugin: 'realm-android'
 
 android {
     compileSdkVersion 26
@@ -11,6 +12,12 @@ android {
         versionCode 11
         versionName "1.1.1"
         testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
+
+        ndk {
+            //设置支持的SO库架构
+            abiFilters 'armeabi', 'armeabi-v7a', 'x86'
+        }
+
     }
     buildTypes {
         release {
@@ -86,7 +93,7 @@ dependencies {
     compile 'cn.yc:YCStateLib:1.1'                                  //状态管理
     compile 'cn.yc:YCBannerLib:1.2'                                 //轮播图
     compile 'org.yczbj:YCRefreshViewLib:2.4'                        //RecyclerView封装
-    compile 'cn.yc:YCBaseAdapterLib:1.2'                            //adapter封装
+    compile 'cn.yc:YCBaseAdapterLib:1.3'                            //adapter封装
     compile 'cn.yc:YCDialogLib:3.5'                                 //弹窗
     compile 'cn.yc:YCProgressLib:1.2'                               //进度条
 //    compile 'cn.yc:YCVideoPlayerLib:2.3'                            //播放器

+ 2 - 0
app/src/main/java/org/yczbj/ycvideoplayer/api/constant/Constant.java

@@ -42,6 +42,8 @@ public class Constant {
     public static final String SP_NAME = "yc";
     public static final String KEY_IS_LOGIN = "is_login";
     public static final String KEY_NIGHT_STATE = "night_state";
+    public static final String LOCK_SCREEN_ACTION = "cn.ycbjie.lock";
+
 
 
 }

+ 1 - 1
app/src/main/java/org/yczbj/ycvideoplayer/base/BaseDelegateAdapter.java

@@ -6,7 +6,7 @@ import android.view.ViewGroup;
 
 import com.alibaba.android.vlayout.DelegateAdapter;
 import com.alibaba.android.vlayout.LayoutHelper;
-import com.yc.cn.ycbaseadapterlib.first.BaseViewHolder;
+import com.yc.cn.ycbaseadapterlib.BaseViewHolder;
 
 
 /**

+ 28 - 0
app/src/main/java/org/yczbj/ycvideoplayer/base/BaseDialog.java

@@ -0,0 +1,28 @@
+package org.yczbj.ycvideoplayer.base;
+
+import android.app.Dialog;
+import android.content.Context;
+import android.view.LayoutInflater;
+import android.view.View;
+import butterknife.ButterKnife;
+
+/**
+ * BaseDialog
+ * Created by yc on 2015/12/28.
+ */
+public abstract class BaseDialog extends Dialog {
+
+
+    public BaseDialog(Context context, int layoutId, int styleId) {
+        super(context, styleId);
+        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+        View view ;
+        if (inflater != null) {
+            view = inflater.inflate(layoutId, null);
+            this.setContentView(view);
+            ButterKnife.bind(this);
+        }
+    }
+
+
+}

+ 250 - 0
app/src/main/java/org/yczbj/ycvideoplayer/db/RealmHelper.java

@@ -0,0 +1,250 @@
+package org.yczbj.ycvideoplayer.db;
+
+
+import org.yczbj.ycvideoplayer.model.realm.Collection;
+import org.yczbj.ycvideoplayer.model.realm.Record;
+import org.yczbj.ycvideoplayer.model.realm.SearchKey;
+
+import java.util.List;
+
+import io.realm.Realm;
+import io.realm.RealmResults;
+import io.realm.Sort;
+
+public class RealmHelper {
+
+    public static final String DB_NAME = "ycMovie.realm";
+    private Realm mRealm;
+    private static RealmHelper instance;
+
+    private RealmHelper() {
+
+    }
+
+    public static RealmHelper getInstance() {
+        if (instance == null) {
+            synchronized (RealmHelper.class) {
+                if (instance == null) {
+                    instance = new RealmHelper();
+                }
+            }
+        }
+        return instance;
+    }
+
+
+    Realm getRealm() {
+        if (mRealm == null || mRealm.isClosed()) {
+            mRealm = Realm.getDefaultInstance();
+        }
+        return mRealm;
+    }
+    //--------------------------------------------------收藏相关----------------------------------------------------
+
+    /**
+     * 增加 收藏记录
+     *
+     * @param bean
+     */
+    public void insertCollection(Collection bean) {
+        getRealm().beginTransaction();
+        getRealm().copyToRealm(bean);
+        getRealm().commitTransaction();
+    }
+
+    /**
+     * 删除 收藏记录
+     *
+     * @param id
+     */
+    public void deleteCollection(String id) {
+        Collection data = getRealm()
+                .where(Collection.class)
+                .equalTo("id", id).findFirst();
+        getRealm().beginTransaction();
+        data.deleteFromRealm();
+        getRealm().commitTransaction();
+    }
+
+    /**
+     * 清空收藏
+     */
+    public void deleteAllCollection() {
+        getRealm().beginTransaction();
+        getRealm().delete(Collection.class);
+        getRealm().commitTransaction();
+    }
+
+    /**
+     * 查询 收藏记录
+     *
+     * @param id
+     * @return
+     */
+    public boolean queryCollectionId(String id) {
+        RealmResults<Collection> results = getRealm()
+                .where(Collection.class)
+                .findAll();
+        for (Collection item : results) {
+            if (item.getId().equals(id)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * 收藏列表
+     *
+     * @return
+     */
+    public List<Collection> getCollectionList() {
+        //使用findAllSort ,先findAll再result.sort排序
+        RealmResults<Collection> results = getRealm()
+                .where(Collection.class)
+                .findAllSorted("time", Sort.DESCENDING);
+        return getRealm().copyFromRealm(results);
+    }
+
+
+    //--------------------------------------------------播放记录相关----------------------------------------------------
+
+    /**
+     * 增加播放记录
+     *
+     * @param bean
+     * @param maxSize 保存最大数量
+     */
+    public void insertRecord(Record bean, int maxSize) {
+        if (maxSize != 0) {
+            RealmResults<Record> results = getRealm()
+                    .where(Record.class)
+                    .findAllSorted("time", Sort.DESCENDING);
+            if (results.size() >= maxSize) {
+                for (int i = maxSize - 1; i < results.size(); i++) {
+                    deleteRecord(results.get(i).getId());
+                }
+            }
+        }
+        getRealm().beginTransaction();
+        getRealm().copyToRealm(bean);
+        getRealm().commitTransaction();
+    }
+
+
+    /**
+     * 删除 播放记录
+     *
+     * @param id
+     */
+    public void deleteRecord(String id) {
+        Record data = getRealm()
+                .where(Record.class)
+                .equalTo("id", id).findFirst();
+        getRealm().beginTransaction();
+        data.deleteFromRealm();
+        getRealm().commitTransaction();
+    }
+
+    /**
+     * 查询 播放记录
+     *
+     * @param id
+     * @return
+     */
+    public boolean queryRecordId(String id) {
+        RealmResults<Record> results = getRealm()
+                .where(Record.class)
+                .findAll();
+        for (Record item : results) {
+            if (item.getId().equals(id)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    public List<Record> getRecordList() {
+        //使用findAllSort ,先findAll再result.sort排序
+        RealmResults<Record> results = getRealm()
+                .where(Record.class)
+                .findAllSorted("time", Sort.DESCENDING);
+        return getRealm().copyFromRealm(results);
+    }
+
+    /**
+     * 清空历史
+     */
+    public void deleteAllRecord() {
+        getRealm().beginTransaction();
+        getRealm().delete(Record.class);
+        getRealm().commitTransaction();
+    }
+
+    /**
+     * 增加 搜索记录
+     *
+     * @param bean
+     */
+    public void insertSearchHistory(SearchKey bean) {
+        //如果有不保存
+        List<SearchKey> list = getSearchHistoryList(bean.getSearchKey());
+        if (list == null || list.size() == 0) {
+            getRealm().beginTransaction();
+            getRealm().copyToRealm(bean);
+            getRealm().commitTransaction();
+        }
+        //如果保存记录超过20条,就删除一条。保存最多20条
+        List<SearchKey> listAll = getSearchHistoryListAll();
+        if (listAll != null && listAll.size() >= 10) {
+            deleteSearchHistoryList(listAll.get(listAll.size() - 1).getSearchKey());
+        }
+    }
+
+    /**
+     * 获取搜索历史记录列表
+     *
+     * @return
+     */
+    public List<SearchKey> getSearchHistoryList(String value) {
+        //使用findAllSort ,先findAll再result.sort排序
+        RealmResults<SearchKey> results = getRealm()
+                .where(SearchKey.class)
+                .contains("searchKey", value)
+                .findAllSorted("insertTime", Sort.DESCENDING);
+        return getRealm().copyFromRealm(results);
+    }
+
+    /**
+     * 删除指定搜索历史记录列表
+     *
+     * @return
+     */
+    public void deleteSearchHistoryList(String value) {
+        SearchKey data = getRealm()
+                .where(SearchKey.class)
+                .equalTo("searchKey", value).findFirst();
+        getRealm().beginTransaction();
+        data.deleteFromRealm();
+        getRealm().commitTransaction();
+    }
+
+    public void deleteSearchHistoryAll() {
+        getRealm().beginTransaction();
+        getRealm().delete(SearchKey.class);
+        getRealm().commitTransaction();
+    }
+
+    /**
+     * 获取搜索历史记录列表
+     *
+     * @return
+     */
+    public List<SearchKey> getSearchHistoryListAll() {
+        //使用findAllSort ,先findAll再result.sort排序
+        RealmResults<SearchKey> results = getRealm()
+                .where(SearchKey.class)
+                .findAllSorted("insertTime", Sort.DESCENDING);
+        return getRealm().copyFromRealm(results);
+    }
+}

+ 66 - 0
app/src/main/java/org/yczbj/ycvideoplayer/model/realm/Collection.java

@@ -0,0 +1,66 @@
+package org.yczbj.ycvideoplayer.model.realm;
+
+import java.io.Serializable;
+
+import io.realm.RealmObject;
+
+/**
+ * Description: 收藏
+ */
+public class Collection extends RealmObject implements Serializable {
+
+    String id;
+    long time;
+    public String title;
+    public String pic;
+    public String airTime;
+    public String score;
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public long getTime() {
+        return time;
+    }
+
+    public void setTime(long time) {
+        this.time = time;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public String getPic() {
+        return pic;
+    }
+
+    public void setPic(String pic) {
+        this.pic = pic;
+    }
+
+    public String getAirTime() {
+        return airTime;
+    }
+
+    public void setAirTime(String airTime) {
+        this.airTime = airTime;
+    }
+
+    public String getScore() {
+        return score;
+    }
+
+    public void setScore(String score) {
+        this.score = score;
+    }
+}

+ 49 - 0
app/src/main/java/org/yczbj/ycvideoplayer/model/realm/Record.java

@@ -0,0 +1,49 @@
+package org.yczbj.ycvideoplayer.model.realm;
+
+import java.io.Serializable;
+
+import io.realm.RealmObject;
+
+/**
+ * Description: 播放记录
+ */
+public class Record extends RealmObject implements Serializable {
+
+    public String title;
+    public String pic;
+    String id;
+    long time;
+
+    public long getTime() {
+        return time;
+    }
+
+    public void setTime(long time) {
+        this.time = time;
+    }
+
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public String getPic() {
+        return pic;
+    }
+
+    public void setPic(String pic) {
+        this.pic = pic;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+}

+ 21 - 0
app/src/main/java/org/yczbj/ycvideoplayer/model/realm/SearchKey.java

@@ -0,0 +1,21 @@
+package org.yczbj.ycvideoplayer.model.realm;
+
+import io.realm.RealmObject;
+
+public class SearchKey extends RealmObject {
+
+    public String searchKey;
+    //插入时间
+    public long insertTime;
+
+    public SearchKey() {}
+
+    public SearchKey(String suggestion, long insertTime) {
+        this.searchKey = suggestion;
+        this.insertTime = insertTime;
+    }
+
+    public String getSearchKey() {
+        return searchKey;
+    }
+}

+ 34 - 11
app/src/main/java/org/yczbj/ycvideoplayer/ui/home/view/activity/VideoPlayerMeActivity.java

@@ -44,6 +44,8 @@ import org.yczbj.ycvideoplayer.ui.test.test1.view.second.TestSecondActivity;
 import org.yczbj.ycvideoplayer.util.AppUtil;
 import org.yczbj.ycvideoplayerlib.ConstantKeys;
 import org.yczbj.ycvideoplayerlib.OnMemberClickListener;
+import org.yczbj.ycvideoplayerlib.OnVideoBackListener;
+import org.yczbj.ycvideoplayerlib.OnVideoControlListener;
 import org.yczbj.ycvideoplayerlib.VideoPlayer;
 import org.yczbj.ycvideoplayerlib.VideoPlayerController;
 
@@ -122,31 +124,56 @@ public class VideoPlayerMeActivity extends BaseActivity implements VideoPlayerMe
 
     private void initVideoPlayer() {
         //设置播放类型
-        // MediaPlayer
         //videoPlayer.setPlayerType(VideoPlayer.TYPE_NATIVE);
-        // IjkPlayer
         videoPlayer.setPlayerType(VideoPlayer.TYPE_IJK);
         //网络视频地址
-        String videoUrl = ConstantVideo.VideoPlayerList[1];
+        String videoUrl = ConstantVideo.VideoPlayerList[0];
         //设置视频地址和请求头部
         videoPlayer.setUp(videoUrl, null);
+        //是否从上一次的位置继续播放
+        videoPlayer.continueFromLastPosition(true);
+        //设置播放速度
+        videoPlayer.setSpeed(1.0f);
+
         //创建视频控制器
         VideoPlayerController controller = new VideoPlayerController(this);
         controller.setTitle("高仿优酷视频播放页面");
-        //controller.setLength(98000);
         controller.setLoadingType(2);
         controller.setMemberType(false,false,2,true);
         controller.imageView().setBackgroundResource(R.color.blackText);
-        //ImageUtil.loadImgByPicasso(this, R.color.blackText, R.drawable.image_default, controller.imageView());
+        controller.setOnVideoBackListener(new OnVideoBackListener() {
+            @Override
+            public void onBackClick() {
+                onBackPressed();
+            }
+        });
         controller.setOnMemberClickListener(new OnMemberClickListener() {
             @Override
             public void onClick(int type) {
                 switch (type){
                     case ConstantKeys.Gender.LOGIN:
-                        startActivity(MeLoginActivity.class);
+                        ToastUtil.showToast(VideoPlayerMeActivity.this,"登录");
                         break;
                     case ConstantKeys.Gender.MEMBER:
-                        startActivity(TestSecondActivity.class);
+                        ToastUtil.showToast(VideoPlayerMeActivity.this,"犊子");
+                        break;
+                    default:
+                        break;
+                }
+            }
+        });
+        controller.setOnVideoControlListener(new OnVideoControlListener() {
+            @Override
+            public void onVideoControlClick(int type) {
+                switch (type){
+                    case ConstantKeys.VideoControl.DOWNLOAD:
+                        ToastUtil.showToast(VideoPlayerMeActivity.this,"下载音视频");
+                        break;
+                    case ConstantKeys.VideoControl.AUDIO:
+                        ToastUtil.showToast(VideoPlayerMeActivity.this,"切换音频");
+                        break;
+                    case ConstantKeys.VideoControl.SHARE:
+                        ToastUtil.showToast(VideoPlayerMeActivity.this,"分享内容");
                         break;
                     default:
                         break;
@@ -155,10 +182,6 @@ public class VideoPlayerMeActivity extends BaseActivity implements VideoPlayerMe
         });
         //设置视频控制器
         videoPlayer.setController(controller);
-        //是否从上一次的位置继续播放
-        videoPlayer.continueFromLastPosition(true);
-        //设置播放速度
-        videoPlayer.setSpeed(1.0f);
     }
 
 

+ 1 - 1
app/src/main/java/org/yczbj/ycvideoplayer/ui/home/view/fragment/HomeFragment.java

@@ -16,7 +16,7 @@ import com.alibaba.android.vlayout.layout.LinearLayoutHelper;
 import com.pedaily.yc.ycdialoglib.customToast.ToastUtil;
 import com.yc.cn.ycbannerlib.first.BannerView;
 import com.yc.cn.ycbannerlib.first.util.SizeUtil;
-import com.yc.cn.ycbaseadapterlib.first.BaseViewHolder;
+import com.yc.cn.ycbaseadapterlib.BaseViewHolder;
 
 import org.yczbj.ycvideoplayer.R;
 import org.yczbj.ycvideoplayer.api.constant.Constant;

+ 36 - 1
app/src/main/java/org/yczbj/ycvideoplayer/ui/movie/presenter/MoviePresenter.java

@@ -7,11 +7,14 @@ import org.reactivestreams.Subscription;
 import org.yczbj.ycvideoplayer.api.http.movie.MovieModel;
 import org.yczbj.ycvideoplayer.ui.movie.contract.MovieContract;
 import org.yczbj.ycvideoplayer.ui.movie.model.MovieBean;
+import org.yczbj.ycvideoplayer.util.LogUtils;
 
 import io.reactivex.Observable;
+import io.reactivex.Scheduler;
 import io.reactivex.android.schedulers.AndroidSchedulers;
 import io.reactivex.disposables.CompositeDisposable;
 import io.reactivex.disposables.Disposable;
+import io.reactivex.functions.Action;
 import io.reactivex.functions.Consumer;
 import io.reactivex.schedulers.Schedulers;
 
@@ -25,6 +28,7 @@ import io.reactivex.schedulers.Schedulers;
 
 public class MoviePresenter implements MovieContract.Presenter {
 
+    private static final String TAG = "MoviePresenter";
     private MovieContract.View mView;
     private CompositeDisposable mSubscriptions;
     private Activity activity;
@@ -52,15 +56,46 @@ public class MoviePresenter implements MovieContract.Presenter {
     public void getData() {
         MovieModel model = MovieModel.getInstance();
         Disposable subscribe = model.getHomePage()
+                //线程控制(也称为调度 / 切换),即讲解功能性操作符中的:subscribeOn() & observeOn()
+                //功能性操作符subscribeOn() & observeOn()作用
+                //线程控制,即指定 被观察者 (Observable) / 观察者(Observer) 的工作线程类型
+                // 1. 指定被观察者 生产事件的线程
                 .subscribeOn(Schedulers.io())
+                // 2. 指定观察者 接收 & 响应事件的线程
+                // 第一次指定观察者线程 = 主线程
                 .observeOn(AndroidSchedulers.mainThread())
+                .doOnNext(new Consumer<MovieBean>() {
+                    @Override
+                    public void accept(MovieBean movieBean) throws Exception {
+                        LogUtils.e(TAG+"----"+"doOnNext accept(MovieBean movieBean)");
+                    }
+                })
+                // 第二次指定观察者线程 = 新的工作线程
+                .observeOn(Schedulers.newThread())
+                // 3. 最后再通过订阅(subscribe)连接观察者和被观察者
                 .subscribe(new Consumer<MovieBean>() {
                     @Override
                     public void accept(MovieBean movieBean) throws Exception {
-                        if(movieBean!=null && movieBean.getRet()!=null){
+                        LogUtils.e(TAG+"----"+"accept(MovieBean movieBean)");
+                        if (movieBean != null && movieBean.getRet() != null) {
                             mView.setAdapterData(movieBean);
                         }
                     }
+                }, new Consumer<Throwable>() {
+                    @Override
+                    public void accept(Throwable throwable) throws Exception {
+                        LogUtils.e(TAG+"----"+"accept(Throwable throwable)");
+                    }
+                }, new Action() {
+                    @Override
+                    public void run() throws Exception {
+                        LogUtils.e(TAG+"----"+"run()");
+                    }
+                }, new Consumer<Disposable>() {
+                    @Override
+                    public void accept(Disposable disposable) throws Exception {
+                        LogUtils.e(TAG+"----"+"accept(Disposable disposable)");
+                    }
                 });
         mSubscriptions.add(subscribe);
     }

+ 30 - 2
app/src/main/java/org/yczbj/ycvideoplayer/ui/person/MeFragment.java

@@ -1,12 +1,19 @@
 package org.yczbj.ycvideoplayer.ui.person;
 
+import android.content.Context;
+import android.os.Bundle;
+import android.view.LayoutInflater;
 import android.view.View;
+import android.view.ViewGroup;
 import android.widget.TextView;
 
 import org.yczbj.ycvideoplayer.R;
 import org.yczbj.ycvideoplayer.base.mvp1.BaseFragment;
+import org.yczbj.ycvideoplayer.ui.main.view.activity.MainActivity;
+import org.yczbj.ycvideoplayer.weight.AboutMeDialog;
 
 import butterknife.Bind;
+import butterknife.ButterKnife;
 
 /**
  * Description:
@@ -17,6 +24,22 @@ import butterknife.Bind;
 
 public class MeFragment extends BaseFragment implements View.OnClickListener {
 
+    @Bind(R.id.tv_3)
+    TextView tv3;
+    private MainActivity activity;
+
+    @Override
+    public void onAttach(Context context) {
+        super.onAttach(context);
+        activity = (MainActivity) context;
+    }
+
+    @Override
+    public void onDetach() {
+        super.onDetach();
+        activity = null;
+    }
+
     @Override
     public int getContentView() {
         return R.layout.fragment_me;
@@ -29,7 +52,7 @@ public class MeFragment extends BaseFragment implements View.OnClickListener {
 
     @Override
     public void initListener() {
-
+        tv3.setOnClickListener(this);
     }
 
     @Override
@@ -39,9 +62,14 @@ public class MeFragment extends BaseFragment implements View.OnClickListener {
 
     @Override
     public void onClick(View v) {
-        switch (v.getId()){
+        switch (v.getId()) {
+            case R.id.tv_3:
+                new AboutMeDialog(activity, R.color.colorTheme).show();
+                break;
             default:
                 break;
         }
     }
+
+
 }

+ 42 - 0
app/src/main/java/org/yczbj/ycvideoplayer/ui/test/test2/TestMyActivity.java

@@ -3,6 +3,8 @@ package org.yczbj.ycvideoplayer.ui.test.test2;
 import android.view.View;
 import android.widget.Button;
 
+import com.pedaily.yc.ycdialoglib.customToast.ToastUtil;
+
 import org.yczbj.ycvideoplayer.R;
 import org.yczbj.ycvideoplayer.api.constant.ConstantVideo;
 import org.yczbj.ycvideoplayer.base.mvp1.BaseActivity;
@@ -19,6 +21,7 @@ import org.yczbj.ycvideoplayer.util.LogUtils;
 import org.yczbj.ycvideoplayerlib.ConstantKeys;
 import org.yczbj.ycvideoplayerlib.OnMemberClickListener;
 import org.yczbj.ycvideoplayerlib.OnVideoBackListener;
+import org.yczbj.ycvideoplayerlib.OnVideoControlListener;
 import org.yczbj.ycvideoplayerlib.VideoLogUtil;
 import org.yczbj.ycvideoplayerlib.VideoPlayer;
 import org.yczbj.ycvideoplayerlib.VideoPlayerController;
@@ -125,6 +128,45 @@ public class TestMyActivity extends BaseActivity implements View.OnClickListener
         videoPlayer1.setSpeed(1.0f);
         //创建视频控制器
         VideoPlayerController controller = new VideoPlayerController(this);
+        controller.setOnVideoBackListener(new OnVideoBackListener() {
+            @Override
+            public void onBackClick() {
+                onBackPressed();
+            }
+        });
+        controller.setOnMemberClickListener(new OnMemberClickListener() {
+            @Override
+            public void onClick(int type) {
+                switch (type){
+                    case ConstantKeys.Gender.LOGIN:
+                        ToastUtil.showToast(TestMyActivity.this,"登录");
+                        break;
+                    case ConstantKeys.Gender.MEMBER:
+                        ToastUtil.showToast(TestMyActivity.this,"犊子");
+                        break;
+                    default:
+                        break;
+                }
+            }
+        });
+        controller.setOnVideoControlListener(new OnVideoControlListener() {
+            @Override
+            public void onVideoControlClick(int type) {
+                switch (type){
+                    case ConstantKeys.VideoControl.DOWNLOAD:
+                        ToastUtil.showToast(TestMyActivity.this,"下载音视频");
+                        break;
+                    case ConstantKeys.VideoControl.AUDIO:
+                        ToastUtil.showToast(TestMyActivity.this,"切换音频");
+                        break;
+                    case ConstantKeys.VideoControl.SHARE:
+                        ToastUtil.showToast(TestMyActivity.this,"分享内容");
+                        break;
+                    default:
+                        break;
+                }
+            }
+        });
         controller.setTitle("办快来围观拉,自定义视频播放器可以播放视频拉");
         //设置视频时长
         controller.setLength(98000);

+ 110 - 0
app/src/main/java/org/yczbj/ycvideoplayer/weight/AboutMeDialog.java

@@ -0,0 +1,110 @@
+package org.yczbj.ycvideoplayer.weight;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.graphics.Paint;
+import android.net.Uri;
+import android.widget.TextView;
+
+import org.yczbj.ycvideoplayer.R;
+import org.yczbj.ycvideoplayer.base.BaseDialog;
+import org.yczbj.ycvideoplayer.util.binding.BindView;
+
+import butterknife.OnClick;
+
+
+/**
+ * AboutMeDialog
+ * Created by yc on 2016/12/29.
+ */
+
+public class AboutMeDialog extends BaseDialog {
+
+
+    @BindView(R.id.tv_affirm)
+    TextView mTvAffirm;
+    @BindView(R.id.tv_author_github)
+    TextView mTvAuthorGithub;
+    @BindView(R.id.tv_author_weibo)
+    TextView getmTvAuthorWeibo;
+    @BindView(R.id.tv_open_address)
+    TextView mTvOpenAddress;
+    @BindView(R.id.tv_thanks)
+    TextView mTvThanks;
+    @BindView(R.id.tv_gankio)
+    TextView mTvGankio;
+
+    private int mThemeColor;
+    private Activity mContext;
+
+
+    public AboutMeDialog(Activity context) {
+        super(context, R.layout.dialog_about_me, R.style.BaseDialog);
+    }
+
+    public AboutMeDialog(Activity context, int color) {
+        this(context);
+        mContext = context;
+        mThemeColor = color;
+        initView();
+    }
+
+
+    private void initView() {
+        mTvAffirm.setTextColor(mThemeColor);
+        mTvAuthorGithub.setTextColor(mThemeColor);
+        getmTvAuthorWeibo.setTextColor(mThemeColor);
+        mTvOpenAddress.setTextColor(mThemeColor);
+        mTvThanks.setTextColor(mThemeColor);
+        mTvGankio.setTextColor(mThemeColor);
+
+        setUnderline(mTvOpenAddress);
+        setUnderline(mTvGankio);
+        setUnderline(mTvAuthorGithub);
+        setUnderline(getmTvAuthorWeibo);
+    }
+
+    private void setUnderline(TextView textView) {
+        //下划线
+        textView.getPaint().setFlags(Paint.UNDERLINE_TEXT_FLAG);
+        //抗锯齿
+        textView.getPaint().setAntiAlias(true);
+    }
+
+    @OnClick(R.id.tv_affirm)
+    void affirm() {
+        cancel();
+    }
+
+    @OnClick(R.id.tv_thanks)
+    void thanks() {
+        viewIntent("https://github.com/yangchong211");
+    }
+
+    @OnClick(R.id.tv_open_address)
+    void openAddress() {
+        viewIntent("https://github.com/yangchong211");
+    }
+
+    @OnClick(R.id.tv_gankio)
+    void gankio() {
+        viewIntent("https://github.com/yangchong211");
+    }
+
+    @OnClick(R.id.tv_author_github)
+    public void github() {
+        viewIntent("https://github.com/yangchong211");
+    }
+
+    @OnClick(R.id.tv_author_weibo)
+    public void weibo() {
+        viewIntent("https://github.com/yangchong211");
+    }
+
+    private void viewIntent(String url) {
+        Uri uri = Uri.parse(url);
+        Intent intent = new Intent(Intent.ACTION_VIEW, uri);
+        mContext.startActivity(intent);
+    }
+
+}

+ 171 - 0
app/src/main/res/layout/dialog_about_me.xml

@@ -0,0 +1,171 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout 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"
+    android:background="@drawable/shape_title_bg">
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="vertical">
+
+
+        <LinearLayout
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="5dp"
+            android:orientation="horizontal">
+
+            <android.support.v7.widget.AppCompatImageView
+                android:layout_width="45dp"
+                android:layout_height="45dp"
+                android:layout_marginLeft="13dp"
+                android:layout_marginTop="5dp"
+                app:srcCompat="@mipmap/ic_launcher" />
+
+            <android.support.v7.widget.AppCompatTextView
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:gravity="center"
+                android:paddingBottom="10dp"
+                android:paddingRight="20dp"
+                android:paddingTop="15dp"
+                android:text="关于该视频播放器"
+                android:textColor="@color/blackText"
+                android:textSize="18sp"
+                android:textStyle="bold" />
+        </LinearLayout>
+
+        <android.support.v7.widget.AppCompatTextView
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:paddingBottom="10dp"
+            android:paddingLeft="20dp"
+            android:paddingRight="20dp"
+            android:paddingTop="10dp"
+            android:text="体验别具一格的视频播放器封装库"
+            android:textColor="@color/blackText1"
+            android:textStyle="bold" />
+
+        <android.support.v7.widget.AppCompatTextView
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:paddingLeft="20dp"
+            android:paddingRight="20dp"
+            android:paddingTop="15dp"
+            android:text="作者:潇湘剑雨"
+            android:textColor="@color/blackText1"
+            android:textStyle="bold" />
+
+        <LinearLayout
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal">
+
+            <android.support.v7.widget.AppCompatTextView
+                android:id="@+id/tv_author_github"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:paddingBottom="15dp"
+                android:paddingLeft="20dp"
+                android:paddingRight="10dp"
+                android:paddingTop="2dp"
+                android:text="Github"
+                android:textColor="@color/colorPrimary" />
+
+            <android.support.v7.widget.AppCompatTextView
+                android:id="@+id/tv_author_weibo"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:paddingBottom="15dp"
+                android:paddingRight="20dp"
+                android:paddingTop="2dp"
+                android:text="微博"
+                android:textColor="@color/colorPrimary" />
+        </LinearLayout>
+
+        <android.support.v7.widget.AppCompatTextView
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:paddingLeft="20dp"
+            android:paddingRight="20dp"
+            android:text="项目开源地址:"
+            android:textColor="@color/blackText1"
+            android:textStyle="bold" />
+
+        <android.support.v7.widget.AppCompatTextView
+            android:id="@+id/tv_open_address"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:paddingBottom="15dp"
+            android:paddingLeft="20dp"
+            android:paddingRight="20dp"
+            android:paddingTop="2dp"
+            android:text="https://github.com/yangchong211"
+            android:textColor="@color/colorPrimary" />
+
+        <android.support.v7.widget.AppCompatTextView
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:paddingLeft="20dp"
+            android:paddingRight="20dp"
+            android:text="致谢:"
+            android:textColor="@color/blackText1"
+            android:textStyle="bold" />
+
+        <android.support.v7.widget.AppCompatTextView
+            android:id="@+id/tv_thanks"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:paddingBottom="15dp"
+            android:paddingLeft="20dp"
+            android:paddingRight="20dp"
+            android:paddingTop="2dp"
+            android:text="饺子播放器"
+            android:textColor="@color/colorPrimary" />
+
+        <LinearLayout
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal">
+
+            <android.support.v7.widget.AppCompatTextView
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginRight="3dp"
+                android:autoLink="all"
+                android:paddingLeft="20dp"
+                android:paddingTop="2dp"
+                android:text="此应用数据均来自于" />
+
+            <android.support.v7.widget.AppCompatTextView
+                android:id="@+id/tv_gankio"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:paddingLeft="0dp"
+                android:paddingRight="20dp"
+                android:paddingTop="2dp"
+                android:textColor="@color/colorPrimary"
+                android:text="来自网络,请勿商用!" />
+        </LinearLayout>
+
+        <android.support.v7.widget.AppCompatTextView
+            android:id="@+id/tv_affirm"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="end"
+            android:layout_marginBottom="8dp"
+            android:layout_marginRight="10dp"
+            android:layout_marginTop="5dp"
+            android:background="?attr/selectableItemBackground"
+            android:clickable="true"
+            android:paddingBottom="10dp"
+            android:paddingLeft="15dp"
+            android:paddingRight="15dp"
+            android:paddingTop="10dp"
+            android:text="确认"
+            android:textColor="@color/colorPrimary" />
+    </LinearLayout>
+
+</RelativeLayout>

+ 10 - 0
app/src/main/res/layout/fragment_me.xml

@@ -46,4 +46,14 @@
         android:background="@color/gray3"
         android:text="我的音频缓存"/>
 
+
+    <TextView
+        android:id="@+id/tv_3"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:padding="10dp"
+        android:layout_margin="10dp"
+        android:background="@color/gray3"
+        android:text="关于我的说明"/>
+
 </LinearLayout>

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

@@ -22,6 +22,15 @@
     </style>
 
 
+    <style name="BaseDialog" parent="@android:style/Theme.Dialog">
+        <item name="android:windowFrame">@null</item>
+        <item name="android:windowNoTitle">true</item>
+        <item name="android:windowBackground">@android:color/transparent</item>
+        <item name="android:windowIsFloating">true</item>
+        <item name="android:windowContentOverlay">@null</item>
+        <item name="dialogPreferredPadding">120dp</item>
+    </style>
+
     <style name="WeightAttr">
         <item name="android:layout_width">0dp</item>
         <item name="android:layout_height">match_parent</item>

+ 1 - 1
build.gradle

@@ -13,7 +13,7 @@ buildscript {
     dependencies {
         classpath 'com.android.tools.build:gradle:2.3.2'
         classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
-
+        classpath "io.realm:realm-gradle-plugin:3.1.1"
         // NOTE: Do not place your application dependencies here; they belong
         // in the individual module build.gradle files
         //添加下面两句,进行配置