diff --git a/.idea/misc.xml b/.idea/misc.xml index fbb6828..635999d 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,8 +1,5 @@ - - - - - - - - - - - - - - + diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/README.md b/README.md index 4bc9ae4..cc002b8 100644 --- a/README.md +++ b/README.md @@ -109,7 +109,7 @@ NoHttp —— 一个有情怀的网络框架 ,让你的网络请求更简单 #### - [Gson](https://github.com/google/gson) 比较常用的 JSON 解析序列化库 -**`compile 'com.google.code.gson:gson:2.7'`** +**`compile 'com.google.code.gson:gson:2.8.2'`** #### - [Glide](https://github.com/bumptech/glide) 图片加载库 @@ -121,7 +121,7 @@ An image loading and caching library for Android focused on smooth scrolling #### - [Bottom Navigation Bar](https://github.com/Ashok-Varma/BottomNavigation) This Library helps users to use Bottom Navigation Bar (A new pattern from google) with ease and allows ton of customizations -**`compile 'com.ashokvarma.android:bottom-navigation-bar:1.4.1'`** +**`compile 'com.ashokvarma.android:bottom-navigation-bar:2.0.2'`** #### - [SVProgressHUD](https://github.com/saiwu-bigkoo/Android-SVProgressHUD) 精仿 iOS 的提示库 SVProgressHUD @@ -171,7 +171,7 @@ A circular ImageView for Android #### - [GSYVideoPlayer 视频播放器](https://github.com/CarGuo/GSYVideoPlayer) 视频播放器(IJKplayer),HTTPS支持,支持弹幕,支持基本的拖动,声音、亮度调节,支持边播边缓存,支持视频本身自带rotation的旋转(90,270之类),重力旋转与手动旋转的同步支持,支持列表播放 ,直接添加控件为封面,列表全屏动画,视频加载速度,列表小窗口支持拖动,5.0的过场效果,调整比例,多分辨率切换,支持切换播放器,进度条小窗口预览,其他一些小动画效果。 -**`compile 'com.github.CarGuo:GSYVideoPlayer:v1.6.1'`** +**`compile 'com.shuyu:GSYVideoPlayer:2.0.8'`** #### - [AndroidVideoCache](https://github.com/danikula/AndroidVideoCache) Cache support for any video player with help of single line @@ -196,7 +196,7 @@ Android实现Http标准协议框架,支持缓存(提供五种缓存模式) #### - [AndPermission](https://github.com/yanzhenjie/AndPermission) Android 6.0运行时权限管理 -**`compile 'com.yanzhenjie:permission:1.0.7'`** +**`compile 'com.yanzhenjie:permission:1.1.0'`** #### - [Butter Knife](https://github.com/JakeWharton/butterknife) Bind Android views and callbacks to fields and methods. @@ -204,7 +204,7 @@ Bind Android views and callbacks to fields and methods. #### - [NoHttpConnecter](https://github.com/lishide/NoHttpConnecter) 小编简单封装的 NoHttp -**`compile 'com.github.lishide:NoHttpConnecter:v1.0.2'`** +**`compile 'com.github.lishide:NoHttpConnecter:v1.0.3'`** #### - [ImgCoverFlow](https://github.com/lishide/ImgCoverFlow) CoverFlow 列表 @@ -221,6 +221,16 @@ CoverFlow 列表 **`compile 'org.greenrobot:eventbus:3.0.0'`** +#### - [Album](https://github.com/yanzhenjie/Album) +Album是一个MD风格的开源相册,支持国际化,支持国际化扩展;主要功能模块:选择图片与视频、拍照、录视频、画廊(支持本地和网络)。 + +**`compile 'com.yanzhenjie:album:2.0.0'`** + +#### - [Durban](https://github.com/yanzhenjie/Durban) +Durban是一个MD风格的图片裁剪工具 + +**`compile 'com.yanzhenjie:durban:1.0.1'`** + **Ps:以上开源库版本可能不是最新的,建议使用时查看原作 GitHub 使用最新版。** ## 六、Material Design diff --git a/app/src/main/java/com/example/dev/activity/GSYPlayerActivity.java b/app/src/main/java/com/example/dev/activity/GSYPlayerActivity.java index 60f07b3..d726f81 100644 --- a/app/src/main/java/com/example/dev/activity/GSYPlayerActivity.java +++ b/app/src/main/java/com/example/dev/activity/GSYPlayerActivity.java @@ -4,6 +4,7 @@ import android.content.pm.ActivityInfo; import android.os.Build; import android.os.Bundle; +import android.os.Handler; import android.support.v4.view.ViewCompat; import android.transition.Transition; import android.view.View; @@ -14,7 +15,7 @@ import com.example.dev.bean.SwitchVideoModel; import com.example.dev.listener.OnTransitionListener; import com.example.dev.video.SampleVideo; -import com.shuyu.gsyvideoplayer.GSYVideoPlayer; +import com.shuyu.gsyvideoplayer.video.base.GSYVideoPlayer; import com.shuyu.gsyvideoplayer.utils.OrientationUtils; import java.util.ArrayList; @@ -59,7 +60,7 @@ protected void initView() { videoPlayer = (SampleVideo) findViewById(R.id.video_player); - videoPlayer.setUp(list, true, ""); + videoPlayer.setUp(list, true, "测试视频"); //增加封面 ImageView imageView = new ImageView(this); @@ -69,7 +70,11 @@ protected void initView() { //增加title videoPlayer.getTitleTextView().setVisibility(View.VISIBLE); - videoPlayer.getTitleTextView().setText("测试视频"); + //videoPlayer.getTitleTextView().setText("测试视频"); + + //videoPlayer.setShowPauseCover(false); + + //videoPlayer.setSpeed(2f); //设置返回键 videoPlayer.getBackButton().setVisibility(View.VISIBLE); @@ -77,7 +82,7 @@ protected void initView() { //设置旋转 orientationUtils = new OrientationUtils(this, videoPlayer); - //设置全屏按键功能 + //设置全屏按键功能,这是使用的是选择屏幕,而不是全屏 videoPlayer.getFullscreenButton().setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -126,6 +131,7 @@ protected void onPause() { @Override protected void onResume() { super.onResume(); + videoPlayer.onVideoResume(); } @TargetApi(Build.VERSION_CODES.KITKAT) @@ -149,8 +155,13 @@ public void onBackPressed() { if (isTransition && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { super.onBackPressed(); } else { - finish(); - overridePendingTransition(R.anim.abc_fade_in, R.anim.abc_fade_out); + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + finish(); + overridePendingTransition(R.anim.abc_fade_in, R.anim.abc_fade_out); + } + }, 500); } } diff --git a/app/src/main/java/com/example/dev/activity/GSYPlayerRVDisActivity.java b/app/src/main/java/com/example/dev/activity/GSYPlayerRVDisActivity.java index 4e1e1a5..8a58bb2 100644 --- a/app/src/main/java/com/example/dev/activity/GSYPlayerRVDisActivity.java +++ b/app/src/main/java/com/example/dev/activity/GSYPlayerRVDisActivity.java @@ -14,7 +14,7 @@ import com.example.dev.adapter.RvVideoDisAdapter; import com.example.dev.bean.VideoModel; import com.shuyu.gsyvideoplayer.GSYVideoManager; -import com.shuyu.gsyvideoplayer.GSYVideoPlayer; +import com.shuyu.gsyvideoplayer.video.base.GSYVideoPlayer; import com.shuyu.gsyvideoplayer.video.StandardGSYVideoPlayer; import java.util.ArrayList; diff --git a/app/src/main/java/com/example/dev/activity/GSYPlayerRVMiniActivity.java b/app/src/main/java/com/example/dev/activity/GSYPlayerRVMiniActivity.java index a3fe4b6..31c21bc 100644 --- a/app/src/main/java/com/example/dev/activity/GSYPlayerRVMiniActivity.java +++ b/app/src/main/java/com/example/dev/activity/GSYPlayerRVMiniActivity.java @@ -15,7 +15,7 @@ import com.example.dev.bean.VideoModel; import com.example.dev.listener.SampleVideoListener; import com.shuyu.gsyvideoplayer.GSYVideoManager; -import com.shuyu.gsyvideoplayer.GSYVideoPlayer; +import com.shuyu.gsyvideoplayer.video.base.GSYVideoPlayer; import com.shuyu.gsyvideoplayer.utils.CommonUtil; import com.shuyu.gsyvideoplayer.utils.Debuger; import com.shuyu.gsyvideoplayer.utils.ListVideoUtil; diff --git a/app/src/main/java/com/example/dev/video/SampleVideo.java b/app/src/main/java/com/example/dev/video/SampleVideo.java index 9afe5d5..88057fd 100644 --- a/app/src/main/java/com/example/dev/video/SampleVideo.java +++ b/app/src/main/java/com/example/dev/video/SampleVideo.java @@ -1,9 +1,12 @@ package com.example.dev.video; import android.content.Context; +import android.graphics.Matrix; +import android.graphics.SurfaceTexture; import android.os.Handler; import android.util.AttributeSet; import android.view.View; +import android.view.ViewGroup; import android.widget.TextView; import android.widget.Toast; @@ -11,28 +14,43 @@ import com.example.dev.bean.SwitchVideoModel; import com.example.dev.view.SwitchVideoTypeDialog; import com.shuyu.gsyvideoplayer.GSYVideoManager; -import com.shuyu.gsyvideoplayer.GSYVideoPlayer; +import com.shuyu.gsyvideoplayer.video.base.GSYBaseVideoPlayer; import com.shuyu.gsyvideoplayer.utils.GSYVideoType; +import com.shuyu.gsyvideoplayer.video.base.GSYVideoPlayer; import com.shuyu.gsyvideoplayer.video.StandardGSYVideoPlayer; import java.io.File; import java.util.ArrayList; import java.util.List; +/** + * Created by shuyu on 2016/12/7. + * 注意 + * 这个播放器的demo配置切换到全屏播放器 + * 这只是单纯的作为全屏播放显示,如果需要做大小屏幕切换,请记得在这里也设置上视频全屏的需要的自定义配置 + */ public class SampleVideo extends StandardGSYVideoPlayer { private TextView mMoreScale; private TextView mSwitchSize; + private TextView mChangeRotate; + + private TextView mChangeTransform; + private List mUrlList = new ArrayList<>(); //记住切换数据源类型 private int mType = 0; + private int mTransformSize = 0; + //数据源 private int mSourcePosition = 0; + private String mTypeText = "标准"; + /** * 1.5.0开始加入,如果需要不同布局区分功能,需要重载 */ @@ -57,30 +75,28 @@ protected void init(Context context) { private void initView() { mMoreScale = (TextView) findViewById(R.id.moreScale); mSwitchSize = (TextView) findViewById(R.id.switchSize); + mChangeRotate = (TextView) findViewById(R.id.change_rotate); + mChangeTransform = (TextView) findViewById(R.id.change_transform); //切换清晰度 mMoreScale.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { + if (!mHadPlay) { + return; + } if (mType == 0) { mType = 1; - mMoreScale.setText("16:9"); - GSYVideoType.setShowType(GSYVideoType.SCREEN_TYPE_16_9); - if (mTextureView != null) - mTextureView.requestLayout(); } else if (mType == 1) { mType = 2; - mMoreScale.setText("4:3"); - GSYVideoType.setShowType(GSYVideoType.SCREEN_TYPE_4_3); - if (mTextureView != null) - mTextureView.requestLayout(); } else if (mType == 2) { + mType = 3; + } else if (mType == 3) { + mType = 4; + } else if (mType == 4) { mType = 0; - mMoreScale.setText("默认比例"); - GSYVideoType.setShowType(GSYVideoType.SCREEN_TYPE_DEFAULT); - if (mTextureView != null) - mTextureView.requestLayout(); } + resolveTypeUI(); } }); @@ -92,6 +108,84 @@ public void onClick(View v) { } }); + //旋转播放角度 + mChangeRotate.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + if (!mHadPlay) { + return; + } + if ((mTextureView.getRotation() - mRotate) == 270) { + mTextureView.setRotation(mRotate); + mTextureView.requestLayout(); + } else { + mTextureView.setRotation(mTextureView.getRotation() + 90); + mTextureView.requestLayout(); + } + } + }); + + //镜像旋转 + mChangeTransform.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + if (!mHadPlay) { + return; + } + if (mTransformSize == 0) { + mTransformSize = 1; + } else if (mTransformSize == 1) { + mTransformSize = 2; + } else if (mTransformSize == 2) { + mTransformSize = 0; + } + resolveTransform(); + } + }); + + } + + /** + * 需要在尺寸发生变化的时候重新处理 + */ + @Override + public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) { + super.onSurfaceTextureSizeChanged(surface, width, height); + resolveTransform(); + } + + + /** + * 处理镜像旋转 + * 注意,暂停时 + */ + protected void resolveTransform() { + switch (mTransformSize) { + case 1: { + Matrix transform = new Matrix(); + transform.setScale(-1, 1, mTextureView.getWidth() / 2, 0); + mTextureView.setTransform(transform); + mChangeTransform.setText("左右镜像"); + mTextureView.invalidate(); + } + break; + case 2: { + Matrix transform = new Matrix(); + transform.setScale(1, -1, 0, mTextureView.getHeight() / 2); + mTextureView.setTransform(transform); + mChangeTransform.setText("上下镜像"); + mTextureView.invalidate(); + } + break; + case 0: { + Matrix transform = new Matrix(); + transform.setScale(1, 1, mTextureView.getWidth() / 2, 0); + mTextureView.setTransform(transform); + mChangeTransform.setText("旋转镜像"); + mTextureView.invalidate(); + } + break; + } } /** @@ -99,12 +193,12 @@ public void onClick(View v) { * * @param url 播放url * @param cacheWithPlay 是否边播边缓存 - * @param objects object[0]目前为title + * @param title title * @return */ - public boolean setUp(List url, boolean cacheWithPlay, Object... objects) { + public boolean setUp(List url, boolean cacheWithPlay, String title) { mUrlList = url; - return setUp(url.get(0).getUrl(), cacheWithPlay, objects); + return setUp(url.get(mSourcePosition).getUrl(), cacheWithPlay, title); } /** @@ -113,12 +207,12 @@ public boolean setUp(List url, boolean cacheWithPlay, Object.. * @param url 播放url * @param cacheWithPlay 是否边播边缓存 * @param cachePath 缓存路径,如果是M3U8或者HLS,请设置为false - * @param objects object[0]目前为title + * @param title title * @return */ - public boolean setUp(List url, boolean cacheWithPlay, File cachePath, Object... objects) { + public boolean setUp(List url, boolean cacheWithPlay, File cachePath, String title) { mUrlList = url; - return setUp(url.get(0).getUrl(), cacheWithPlay, cachePath, objects); + return setUp(url.get(mSourcePosition).getUrl(), cacheWithPlay, cachePath, title); } @Override @@ -126,10 +220,112 @@ public int getLayoutId() { return R.layout.sample_video; } + + /** + * 全屏时将对应处理参数逻辑赋给全屏播放器 + * + * @param context + * @param actionBar + * @param statusBar + * @return + */ + @Override + public GSYBaseVideoPlayer startWindowFullscreen(Context context, boolean actionBar, boolean statusBar) { + SampleVideo sampleVideo = (SampleVideo) super.startWindowFullscreen(context, actionBar, statusBar); + sampleVideo.mSourcePosition = mSourcePosition; + sampleVideo.mType = mType; + sampleVideo.mTransformSize = mTransformSize; + sampleVideo.mUrlList = mUrlList; + sampleVideo.mTypeText = mTypeText; + //sampleVideo.resolveTransform(); + sampleVideo.resolveTypeUI(); + //sampleVideo.resolveRotateUI(); + //这个播放器的demo配置切换到全屏播放器 + //这只是单纯的作为全屏播放显示,如果需要做大小屏幕切换,请记得在这里耶设置上视频全屏的需要的自定义配置 + //比如已旋转角度之类的等等 + //可参考super中的实现 + return sampleVideo; + } + + /** + * 推出全屏时将对应处理参数逻辑返回给非播放器 + * + * @param oldF + * @param vp + * @param gsyVideoPlayer + */ + @Override + protected void resolveNormalVideoShow(View oldF, ViewGroup vp, GSYVideoPlayer gsyVideoPlayer) { + super.resolveNormalVideoShow(oldF, vp, gsyVideoPlayer); + if (gsyVideoPlayer != null) { + SampleVideo sampleVideo = (SampleVideo) gsyVideoPlayer; + mSourcePosition = sampleVideo.mSourcePosition; + mType = sampleVideo.mType; + mTransformSize = sampleVideo.mTransformSize; + mTypeText = sampleVideo.mTypeText; + setUp(mUrlList, mCache, mCachePath, mTitle); + resolveTypeUI(); + } + } + + /** + * 处理显示逻辑 + */ + @Override + public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) { + super.onSurfaceTextureAvailable(surface, width, height); + resolveRotateUI(); + resolveTransform(); + } + + /** + * 旋转逻辑 + */ + private void resolveRotateUI() { + if (!mHadPlay) { + return; + } + mTextureView.setRotation(mRotate); + mTextureView.requestLayout(); + } + + /** + * 显示比例 + * 注意,GSYVideoType.setShowType是全局静态生效,除非重启APP。 + */ + private void resolveTypeUI() { + if (!mHadPlay) { + return; + } + if (mType == 1) { + mMoreScale.setText("16:9"); + GSYVideoType.setShowType(GSYVideoType.SCREEN_TYPE_16_9); + } else if (mType == 2) { + mMoreScale.setText("4:3"); + GSYVideoType.setShowType(GSYVideoType.SCREEN_TYPE_4_3); + } else if (mType == 3) { + mMoreScale.setText("全屏"); + GSYVideoType.setShowType(GSYVideoType.SCREEN_TYPE_FULL); + } else if (mType == 4) { + mMoreScale.setText("拉伸全屏"); + GSYVideoType.setShowType(GSYVideoType.SCREEN_MATCH_FULL); + } else if (mType == 0) { + mMoreScale.setText("默认比例"); + GSYVideoType.setShowType(GSYVideoType.SCREEN_TYPE_DEFAULT); + } + changeTextureViewShowType(); + if (mTextureView != null) + mTextureView.requestLayout(); + mSwitchSize.setText(mTypeText); + } + /** * 弹出切换清晰度 */ private void showSwitchDialog() { + if (!mHadPlay) { + return; + } SwitchVideoTypeDialog switchVideoTypeDialog = new SwitchVideoTypeDialog(getContext()); switchVideoTypeDialog.initList(mUrlList, new SwitchVideoTypeDialog.OnListItemClickListener() { @Override @@ -148,13 +344,14 @@ public void onItemClick(int position) { new Handler().postDelayed(new Runnable() { @Override public void run() { - setUp(url, mCache, mCachePath, mObjects); + setUp(url, mCache, mCachePath, mTitle); setSeekOnStart(currentPosition); startPlayLogic(); cancelProgressTimer(); hideAllWidget(); } }, 500); + mTypeText = name; mSwitchSize.setText(name); mSourcePosition = position; } diff --git a/app/src/main/res/layout/sample_video.xml b/app/src/main/res/layout/sample_video.xml index 18b2cf8..de9b10b 100644 --- a/app/src/main/res/layout/sample_video.xml +++ b/app/src/main/res/layout/sample_video.xml @@ -1,23 +1,18 @@ - - - + - + android:scaleType="fitCenter"/> + android:textColor="#ffffff"/> + android:thumb="@drawable/video_seek_thumb"/> + android:textColor="#ffffff"/> + android:textColor="#ffffff"/> + android:src="@drawable/video_enlarge"/> + android:progressDrawable="@drawable/video_progress"/> + android:visibility="gone"/> + android:visibility="invisible"/> + android:layout_gravity="center_vertical"/> + android:visibility="gone"/> + android:visibility="gone"/> + android:src="@drawable/video_back"/> + android:textSize="18sp"/> + + + + + android:textSize="13sp"/> + android:visibility="gone"/> - + \ No newline at end of file diff --git a/build.gradle b/build.gradle index 8490d34..4ba04b7 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:2.3.1' + classpath 'com.android.tools.build:gradle:3.0.0' classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files diff --git a/dependencies.gradle b/dependencies.gradle index 208f551..1747c56 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -1,6 +1,6 @@ ext { //Android - androidBuildToolsVersion = "25.0.2" + androidBuildToolsVersion = "26.0.2" androidMinSdkVersion = 16 androidTargetSdkVersion = 25 androidCompileSdkVersion = 25 @@ -23,14 +23,14 @@ ext { convenientbanner = '2.0.5' vptransforms = '1.2.32@aar' lsdImgCoverFlow = 'v1.0.0' - GSYVideoPlayer = 'v1.6.7' + GSYVideoPlayer = '2.0.8' baservadapter = '2.9.3' gwMarqueeLib = '1.0.4' //DataLibraries volley = '1.0.19' glide = '3.7.0' - gson = '2.7' + gson = '2.8.2' androidDependencies = [ appcompat_v7 : "com.android.support:appcompat-v7:${supportLibraryVersion}", @@ -74,7 +74,7 @@ ext { lsdImgCoverFlow : "com.github.lishide:ImgCoverFlow:${lsdImgCoverFlow}", //GSYVideoPlayer 视频播放器 - GSYVideoPlayer : "com.github.CarGuo:GSYVideoPlayer:${GSYVideoPlayer}", + GSYVideoPlayer : "com.shuyu:GSYVideoPlayer:${GSYVideoPlayer}", //RecyclerView 的强大的 BaseAdapter baservadapter : "com.github.CymChad:BaseRecyclerViewAdapterHelper:${baservadapter}", diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 9a778d6..65a7da8 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Mon Dec 28 10:00:20 PST 2015 +#Fri Oct 27 19:56:07 CST 2017 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip