BuWanVideo/build.gradle
@@ -12,6 +12,7 @@ api project(':GuangDianTongSDK') api project(':MDownloadProvider') implementation 'com.android.support:recyclerview-v7:27.1.1' implementation project(path: ':library-Funshion') //穿山甲广告 compile(name: 'open_ad_sdk', ext: 'aar') //阿里百川 BuWanVideo/res/layout/fragment_player_funshion.xml
New file @@ -0,0 +1,31 @@ <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <com.lcjian.library.widget.RatioLayout android:layout_width="wrap_content" android:layout_height="wrap_content" app:ratio="0.5625"> <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent"> <SurfaceView android:id="@+id/video_view" android:layout_width="match_parent" android:layout_height="match_parent" /> <com.lcjian.library.video.VideoPlayerController android:id="@+id/vpc_funshion" android:layout_width="match_parent" android:layout_height="match_parent"></com.lcjian.library.video.VideoPlayerController> </FrameLayout> </com.lcjian.library.widget.RatioLayout> </LinearLayout> BuWanVideo/res/layout/item_video_detail_ad.xml
@@ -2,12 +2,11 @@ <LinearLayout 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="match_parent" android:gravity="center"> android:layout_height="wrap_content"> <com.lcjian.library.widget.RatioLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_height="wrap_content" app:ratio="0.5625"> @@ -21,10 +20,10 @@ android:layout_height="match_parent" android:orientation="vertical"> <FrameLayout android:id="@+id/custom_container" android:layout_width="match_parent" android:background="@color/red" android:layout_height="match_parent" android:layout_centerInParent="true"> @@ -32,7 +31,7 @@ <com.qq.e.ads.nativ.MediaView android:id="@+id/gdt_media_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_height="match_parent" android:layout_gravity="center" android:background="#000" /> BuWanVideo/res/values/strings.xml
@@ -1,5 +1,5 @@ <resources> <string name="app_name">影视大全</string> <string name="app_name">影视大全布丸</string> <string name="recommend">推荐</string> <string name="category">分类</string> <string name="discover">发现</string> BuWanVideo/src/com/weikou/beibeivideo/BeibeiVideoApplication.java
@@ -11,6 +11,7 @@ import com.bytedance.sdk.openadsdk.TTAdConfig; import com.bytedance.sdk.openadsdk.TTAdConstant; import com.bytedance.sdk.openadsdk.TTAdSdk; import com.fun.xm.FSPlayer; import com.lcjian.library.util.ManifestDataUtil; import com.nostra13.universalimageloader.cache.disc.naming.Md5FileNameGenerator; import com.nostra13.universalimageloader.core.ImageLoader; @@ -25,6 +26,7 @@ import com.umeng.commonsdk.UMConfigure; import com.umeng.socialize.PlatformConfig; import com.umeng.socialize.UMShareAPI; import com.weikou.beibeivideo.ui.video.FunshionPlayerFragment; import com.weikou.beibeivideo.util.BeibeiConstant; import com.weikou.beibeivideo.util.CrashHandler; import com.weikou.beibeivideo.util.ad.TTAdManagerHolder; @@ -71,7 +73,8 @@ initCSJAd(); GDTADManager.getInstance().initWith(this, BeibeiConstant.GDT_ID); initWX(); //初始化播放插件 FSPlayer.init(this, FunshionPlayerFragment.APICODE); } BuWanVideo/src/com/weikou/beibeivideo/ui/ad/VideoDetailVideoAdFragment.java
@@ -30,12 +30,17 @@ import com.weikou.beibeivideo.util.BeibeiConstant; import com.weikou.beibeivideo.util.ad.AdUtil; import com.weikou.beibeivideo.util.ad.GDTConstant; import com.weikou.beibeivideo.util.ui.IPageEventListener; import java.util.ArrayList; import java.util.Calendar; import java.util.List; public class VideoDetailVideoAdFragment extends Fragment implements View.OnClickListener { private final static String TAG = "VideoDetailVideoAdFragment"; private MediaView mediaView; @@ -46,6 +51,12 @@ private TextView tv_skip; private ProgressBar pb_progress; private IPageEventListener pageEventListener; public void setPageEventListener(IPageEventListener pageEventListener) { this.pageEventListener = pageEventListener; } @Override public void onCreate(@Nullable Bundle savedInstanceState) { @@ -68,6 +79,8 @@ View root = LayoutInflater.from(getContext()).inflate(R.layout.item_video_detail_ad, null); initView(root); tv_skip.setOnClickListener(this); if (pageEventListener != null) pageEventListener.onCreateView(); return root; } @@ -345,6 +358,7 @@ @Override public void onResume() { Log.i(TAG, "onResume"); super.onResume(); if (mAdData != null) { // 必须要在Activity.onResume()时通知到广告数据,以便重置广告恢复状态 @@ -375,6 +389,10 @@ } @Override public void onAttach(Context context) { super.onAttach(context); } public interface IVideoAdListener { @@ -385,4 +403,6 @@ public void startPlay(); } } BuWanVideo/src/com/weikou/beibeivideo/ui/login/ForgetPwdActivity.java
@@ -44,6 +44,9 @@ @Override protected void onCreate(Bundle arg0) { super.onCreate(arg0); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); setContentView(R.layout.activity_forget_pwd); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { int result = 0; int resourceId = getResources().getIdentifier("status_bar_height", @@ -57,8 +60,7 @@ } else { findViewById(R.id.v_status_bar).setVisibility(View.GONE); } setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); setContentView(R.layout.activity_forget_pwd); et_email = (EditText) findViewById(R.id.et_email); et_verfication_code = (EditText) findViewById(R.id.et_verfication_code); tv_obtain_verfication_code = (TextView) findViewById(R.id.tv_obtain_verfication_code); BuWanVideo/src/com/weikou/beibeivideo/ui/main/MainActivity.java
@@ -285,7 +285,7 @@ preferences = getSharedPreferences("user", Context.MODE_PRIVATE); String topIcon = preferences.getString("top_icon", ""); if (StringUtils.isBlank(topIcon)) { if (!StringUtils.isBlank(topIcon)) { fl_right_ad.setVisibility(View.VISIBLE); try { Glide.with(getApplicationContext()).load(topIcon).into(target); BuWanVideo/src/com/weikou/beibeivideo/ui/media/VideoDetailActivity.java
@@ -42,6 +42,8 @@ import com.lcjian.library.util.SystemCommon; import com.lcjian.library.util.common.DimenUtils; import com.lcjian.library.util.common.StringUtils; import com.lcjian.library.video.VideoDataNotifyDialog; import com.lcjian.library.video.VideoLoadingDialog; import com.loopj.android.http.JsonHttpResponseHandler; import com.umeng.analytics.MobclickAgent; import com.weikou.beibeivideo.BasicTextHttpResponseHandler; @@ -61,10 +63,12 @@ import com.weikou.beibeivideo.ui.common.ShareActivity; import com.weikou.beibeivideo.ui.mine.BrowserActivity; import com.weikou.beibeivideo.ui.mine.FXBrowserActivity; import com.weikou.beibeivideo.ui.video.FunshionPlayerFragment; import com.weikou.beibeivideo.ui.video.VideoPlayerActivity; import com.weikou.beibeivideo.util.BeibeiConstant; import com.weikou.beibeivideo.util.ad.FullVideoAdManager; import com.weikou.beibeivideo.R; import com.weikou.beibeivideo.util.ui.IPageEventListener; import org.apache.http.Header; import org.json.JSONArray; @@ -105,6 +109,9 @@ private VideoDetailVideoAdFragment mVideoDetailVideoAdFragment; //风行播放器 private FunshionPlayerFragment mFunshionPlayerFragment; private ImageView iv_select_play; private FrameLayout fl_ad; @@ -130,6 +137,8 @@ super.onCreate(savedInstanceState); setContentView(R.layout.video_detail_activity); new VideoDataNotifyDialog.Builder().build(this).show(); /* * 计算状态栏高度并设置 */ @@ -147,12 +156,12 @@ findViewById(R.id.v_status_bar).setVisibility(View.GONE); } /** * 广告 */ //广告 mVideoDetailVideoAdFragment = new VideoDetailVideoAdFragment(); getSupportFragmentManager().beginTransaction().replace(R.id.fl_ad, mVideoDetailVideoAdFragment).commit(); //播放器 mFunshionPlayerFragment = new FunshionPlayerFragment(); getSupportFragmentManager().beginTransaction().replace(R.id.fl_ad, mVideoDetailVideoAdFragment).commit(); initView(); @@ -169,7 +178,7 @@ if (getIntent().getSerializableExtra("video_info") != null) { videoInfo = (VideoInfo) getIntent().getSerializableExtra( "video_info"); if(videoInfo!=null) if (videoInfo != null) videoInfo.setVideoDetailList(null); if (getIntent().getBooleanExtra("isFromWatchHistory", false)) { Cursor cursor = getContentResolver().query( @@ -248,8 +257,8 @@ .findFragmentByTag("VideoDetailFragment"); if (videoDetailFragment == null) { videoDetailFragment = new VideoDetailFragment(); Bundle bundle=new Bundle(); bundle.putInt("playing_position",getIntent().getIntExtra("playing_position",0)); Bundle bundle = new Bundle(); bundle.putInt("playing_position", getIntent().getIntExtra("playing_position", 0)); videoDetailFragment.setArguments(bundle); fm.beginTransaction() @@ -292,26 +301,46 @@ private boolean isFirst = true; private void startPlay() { private synchronized void startPlay() { //移除所有的fragment if (mVideoDetailVideoAdFragment.isAdded()) { getSupportFragmentManager().beginTransaction().remove(mVideoDetailVideoAdFragment).commit(); } if (mFunshionPlayerFragment.isAdded()) { getSupportFragmentManager().beginTransaction().remove(mFunshionPlayerFragment).commit(); } iv_select_play.setVisibility(View.GONE); if (fl_ad.getVisibility() == View.VISIBLE && BeibeiConstant.AD_TYPE != null && BeibeiConstant.AD_TYPE.isPlayerAd()) { mVideoDetailVideoAdFragment.loadVideoAD(new VideoDetailVideoAdFragment.IVideoAdListener() { //需要加载广告 if (BeibeiConstant.AD_TYPE != null && BeibeiConstant.AD_TYPE.isPlayerAd()) { mVideoDetailVideoAdFragment = new VideoDetailVideoAdFragment(); mVideoDetailVideoAdFragment.setPageEventListener(new IPageEventListener() { @Override public void finishPlay() { clickPlay(); fl_ad.setVisibility(View.GONE); } public void onCreateView() { mVideoDetailVideoAdFragment.loadVideoAD(new VideoDetailVideoAdFragment.IVideoAdListener() { @Override public void finishPlay() { getSupportFragmentManager().beginTransaction().remove(mVideoDetailVideoAdFragment); clickPlay();//进入播放事件 } @Override public void startPlay() { @Override public void startPlay() { } }); } }); } else { if (!mVideoDetailVideoAdFragment.isAdded()) { getSupportFragmentManager().beginTransaction().replace(R.id.fl_ad, mVideoDetailVideoAdFragment).commit(); } } else {//进入播放视频事件 clickPlay(); } } @@ -367,12 +396,23 @@ Toast.LENGTH_LONG).show(); return; } else if (playUrl.getPlayType() == 1) { Intent intent = new Intent(VideoDetailActivity.this, FXBrowserActivity.class); intent.putExtra("url", playUrl.getUrl()); startActivity(intent); // Intent intent = new Intent(VideoDetailActivity.this, // FXBrowserActivity.class); // intent.putExtra("url", playUrl.getUrl()); // startActivity(intent); saveWatchHistory("风行"); } fl_video_play_background.setVisibility(View.GONE); //播放风行视频 //添加风行播放页 mFunshionPlayerFragment = new FunshionPlayerFragment(); Bundle bundle = new Bundle(); bundle.putString("vid", "83693903"); mFunshionPlayerFragment.setArguments(bundle); if (!mFunshionPlayerFragment.isAdded()) { getSupportFragmentManager().beginTransaction().replace(R.id.fragment_video_play_container, mFunshionPlayerFragment).commit(); } //开始播放视频 } else { if (playUrl.getPlayType() == 0) { Toast.makeText(VideoDetailActivity.this, "此节目不可播!", @@ -507,7 +547,7 @@ private void checkConfiguration(Configuration newConfig) { if (newConfig == null) return; if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {//横屏 // Hide the status bar隐藏状态栏 WindowManager.LayoutParams attrs = getWindow().getAttributes(); attrs.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN; @@ -532,6 +572,8 @@ R.id.fragment_video_play_container).getLayoutParams(); layoutParams.height = android.view.ViewGroup.LayoutParams.MATCH_PARENT; findViewById(R.id.fragment_video_play_container).requestLayout(); } else { // Show the status bar显示状态栏 WindowManager.LayoutParams attrs = getWindow().getAttributes(); @@ -717,7 +759,7 @@ .getBooleanExtra("isFromWatchHistory", false);// 是否从观看记录点击过来 Log.i("mResult", "是否是从观看记录点击进来的:" + isFromWatchHistory); if (isFromWatchHistory||position>0) { if (isFromWatchHistory || position > 0) { mPosition = getIntent().getIntExtra("playing_position", 0); EventBus.getDefault().post(videoInfo); getUrl(videoInfo.getVideoDetailList().get(mPosition), isSetup); BuWanVideo/src/com/weikou/beibeivideo/ui/video/FunshionPlayerFragment.java
New file @@ -0,0 +1,278 @@ package com.weikou.beibeivideo.ui.video; import android.content.res.Configuration; import android.media.MediaPlayer; import android.os.Bundle; import android.text.TextUtils; import android.util.Log; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.view.View.OnClickListener; import android.widget.Toast; import com.fun.xm.Definition; import com.fun.xm.FSCallback; import com.fun.xm.FSIVideoPlayer; import com.fun.xm.FSPlayer; import com.fun.xm.FSVideoReqData; import com.funshion.video.logger.FSLogcat; import com.funshion.video.util.FSError; import com.lcjian.library.RetainViewFragment; import com.lcjian.library.video.VideoPlayerController; import com.weikou.beibeivideo.BeibeiVideoApplication; import com.weikou.beibeivideo.R; import com.weikou.beibeivideo.util.downutil.StringUtils; import com.weikou.beibeivideo.util.ui.IPageEventListener; import java.io.IOException; import java.util.List; public class FunshionPlayerFragment extends RetainViewFragment implements OnClickListener { private final static String TAG = FunshionPlayerFragment.class.getName(); private final static String ACCESS_TOKEN = "Zms4NHZseSwxNjAwNDE4MDQ0LDU0MmQyNDI5ZjY5MGQwODM1OTcyYTM3MDMwOTg3MzNj"; public final static String APICODE = "fk84vly"; //媒体视频播放器 private MediaPlayer mVideoPlayer = new MediaPlayer(); //视频用 surfaceView private SurfaceView mVideoSurfView; //播放逻辑调度 private FSIVideoPlayer mFunshionIVideoPlayer; //清晰度列表 FSVideoReqData mFSVideoReqData; private List<Definition> mDefinitions; private Definition mCurrDefinition; private IPageEventListener pageEventListener; private VideoPlayerController vpc_funshion; public void setPageEventListener(IPageEventListener pageEventListener) { this.pageEventListener = pageEventListener; } @Override public int getContentResource() { return R.layout.fragment_player_funshion; } private void initPlayer() { mVideoSurfView.getHolder().addCallback(mVideoSurfaceViewCallBack); mVideoPlayer.setOnPreparedListener(mOnPreparedListener); mVideoPlayer.setOnErrorListener(mOnErrorListener); initAccessToken(); if (getArguments() != null) { String mediaId = getArguments().getString("mediaId"); String ep = getArguments().getString("ep"); String vid = getArguments().getString("vid"); mVideoSurfView.postDelayed(new Runnable() { @Override public void run() { if (StringUtils.isNullOrEmpty(vid)) playMedia(mediaId, ep); else playVideo(vid); } }, 1000); } vpc_funshion.setContentView(mVideoSurfView); vpc_funshion.build(getActivity()); } private void initView(View view) { mVideoSurfView = view.findViewById(R.id.video_view); vpc_funshion = view.findViewById(R.id.vpc_funshion); } @Override public void onCreateView(View contentView, Bundle savedInstanceState) { initView(contentView); initPlayer(); } @Override public void onClick(View v) { } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); } /** * 播放视频 */ public synchronized void playVideo(String videoID) { createPlayer(); if (mVideoPlayer.isPlaying()) { FSLogcat.e(TAG, "Call player to stop"); mVideoPlayer.stop(); mVideoPlayer.reset(); } //!!!注意播放长短视频构建的FSVideoReqData有区别。短视频没有epso分集ID。长视频有。填写错误将无法正常播放 //FSVideoReqData构建需要的数据需要从服务器获取。主要是媒体资源videoID:“VIDEO_ID” 默认 清晰度:new Definition(Definition.CLARITY_LOW) 以及Accesstoken:Accesstoken mFSVideoReqData = new FSVideoReqData(videoID, new Definition(Definition.CLARITY_LOW), ACCESS_TOKEN); try { Log.d(TAG, "request"); mFunshionIVideoPlayer.requestAndPrepare(mFSVideoReqData, APICODE); } catch (Exception e) { e.printStackTrace(); } } /** * 播放媒体 */ public synchronized void playMedia(String mediaID, String epso) { createPlayer(); if (mVideoPlayer.isPlaying()) { FSLogcat.e(TAG, "Call player to stop"); mVideoPlayer.stop(); mVideoPlayer.reset(); } //!!!注意播放长短视频构建的FSVideoReqData有区别。短视频没有epso分集ID。长视频有。填写错误将无法正常播放 //FSVideoReqData构建需要的数据需要从服务器获取。主要是媒体资源videoID:“VIDEO_ID”epso 媒体分集ID 默认 清晰度:new Definition(Definition.CLARITY_LOW) 以及Accesstoken:Accesstoken mFSVideoReqData = new FSVideoReqData(mediaID, epso, new Definition(Definition.CLARITY_LOW), ACCESS_TOKEN); try { Log.d(TAG, "request"); mFunshionIVideoPlayer.requestAndPrepare(mFSVideoReqData, APICODE); } catch (Exception e) { e.printStackTrace(); } } public synchronized void stopPlay() { if (mVideoPlayer != null && mVideoPlayer.isPlaying()) { FSLogcat.e(TAG, "Call player to stop"); mVideoPlayer.stop(); mVideoPlayer.reset(); } } private void createPlayer() { if (mFunshionIVideoPlayer != null) { return; } try { //APICODE 为风行派申请的APICODE值 mFunshionIVideoPlayer = FSPlayer.create(getContext(), mFSCall); //可以打开调试信息方便查询问题 mFunshionIVideoPlayer.setDebug(true); } catch (Exception e) { e.printStackTrace(); } } FSCallback mFSCall = new FSCallback() { @Override public void onDefinition(List<Definition> definitions, Definition currDefinition) { for (Definition definition : definitions) { Log.e("FE", "get Definition " + definition); } FunshionPlayerFragment.this.mDefinitions = definitions; FunshionPlayerFragment.this.mCurrDefinition = currDefinition; Toast.makeText(BeibeiVideoApplication.application, "当前清晰度:" + currDefinition.getStringDefinition(), Toast.LENGTH_LONG).show(); } @Override public void onFailed(FSError arg0) { Log.d(TAG, "onFailed" + arg0); } public void onReceiveUrl(String url) { Log.d(TAG, "onReceiveUrl" + url); try { mVideoPlayer.reset(); mVideoPlayer.setDataSource(url); mVideoPlayer.prepareAsync(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalStateException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }; SurfaceHolder.Callback mVideoSurfaceViewCallBack = new SurfaceHolder.Callback() { @Override public void surfaceDestroyed(SurfaceHolder holder) { } @Override public void surfaceCreated(SurfaceHolder holder) { mVideoPlayer.setDisplay(holder); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } }; MediaPlayer.OnPreparedListener mOnPreparedListener = new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { mFunshionIVideoPlayer.onMediaPlayerPrepared(); mp.start(); } }; MediaPlayer.OnErrorListener mOnErrorListener = new MediaPlayer.OnErrorListener() { @Override public boolean onError(MediaPlayer mp, int what, int extra) { mFunshionIVideoPlayer.onMediaPlayerError(what, extra); return false; } }; //TODO 获取AcessToken private void initAccessToken() { } @Override public void onDestroy() { super.onDestroy(); stopPlay(); if (mFunshionIVideoPlayer != null) { mFunshionIVideoPlayer.onActivityDestroy(); mFunshionIVideoPlayer.release(); } } @Override public void onDetach() { super.onDetach(); } @Override public void onStop() { super.onStop(); if (mVideoPlayer != null && mVideoPlayer.isPlaying()) mVideoPlayer.pause(); } } BuWanVideo/src/com/weikou/beibeivideo/util/ui/IPageEventListener.java
New file @@ -0,0 +1,5 @@ package com.weikou.beibeivideo.util.ui; public interface IPageEventListener { public void onCreateView(); } library-Funshion/.gitignore
New file @@ -0,0 +1 @@ /build library-Funshion/build.gradle
New file @@ -0,0 +1,34 @@ apply plugin: 'com.android.library' android { compileSdkVersion 30 defaultConfig { minSdkVersion 17 targetSdkVersion 30 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" consumerProguardFiles "consumer-rules.pro" ndk { abiFilters 'armeabi' } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } } dependencies { implementation fileTree(dir: "libs", include: ["*.jar"]) testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' api files('libs/FunshionBase-1.0.5.aar') api files('libs/FunshionPlaySDK-1.6.1.aar') } library-Funshion/consumer-rules.pro
library-Funshion/libs/FunshionAD-1.0.0.aarBinary files differ
library-Funshion/libs/FunshionBase-1.0.5.aarBinary files differ
library-Funshion/libs/FunshionPlaySDK-1.6.1.aarBinary files differ
library-Funshion/libs/armeabi/libfsp2p.soBinary files differ
library-Funshion/proguard-rules.pro
New file @@ -0,0 +1,21 @@ # Add project specific ProGuard rules here. # You can control the set of applied configuration files using the # proguardFiles setting in build.gradle. # # For more details, see # http://developer.android.com/guide/developing/tools/proguard.html # If your project uses WebView with JS, uncomment the following # and specify the fully qualified class name to the JavaScript interface # class: #-keepclassmembers class fqcn.of.javascript.interface.for.webview { # public *; #} # Uncomment this to preserve the line number information for # debugging stack traces. #-keepattributes SourceFile,LineNumberTable # If you keep the line number information, uncomment this to # hide the original source file name. #-renamesourcefileattribute SourceFile library-Funshion/src/androidTest/java/com/yeshi/ec/library_funshion/ExampleInstrumentedTest.java
New file @@ -0,0 +1,25 @@ package com.yeshi.ec.library_funshion; import android.content.Context; import android.support.test.InstrumentationRegistry; import android.support.test.runner.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; import static org.junit.Assert.*; /** * Instrumented test, which will execute on an Android device. * * @see <a href="http://d.android.com/tools/testing">Testing documentation</a> */ @RunWith(AndroidJUnit4.class) public class ExampleInstrumentedTest { @Test public void useAppContext() { // Context of the app under test. Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); assertEquals("com.yeshi.ec.library_funshion.test", appContext.getPackageName()); } } library-Funshion/src/main/AndroidManifest.xml
New file @@ -0,0 +1,5 @@ <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.yeshi.ec.library_funshion"> / </manifest> library-Funshion/src/test/java/com/yeshi/ec/library_funshion/ExampleUnitTest.java
New file @@ -0,0 +1,17 @@ package com.yeshi.ec.library_funshion; import org.junit.Test; import static org.junit.Assert.*; /** * Example local unit test, which will execute on the development machine (host). * * @see <a href="http://d.android.com/tools/testing">Testing documentation</a> */ public class ExampleUnitTest { @Test public void addition_isCorrect() { assertEquals(4, 2 + 2); } } library-mine/res/anim/rotate_dialog_player_loading.xml
New file @@ -0,0 +1,12 @@ <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" > <rotate android:fromDegrees="0" android:toDegrees="359" android:duration="1000" android:repeatCount="-1" android:pivotX="50%" android:pivotY="50%" /> </set> library-mine/res/drawable-xhdpi/ic_battery_1.png
library-mine/res/drawable-xhdpi/ic_battery_10.png
library-mine/res/drawable-xhdpi/ic_battery_2.png
library-mine/res/drawable-xhdpi/ic_battery_3.png
library-mine/res/drawable-xhdpi/ic_battery_4.png
library-mine/res/drawable-xhdpi/ic_battery_5.png
library-mine/res/drawable-xhdpi/ic_battery_6.png
library-mine/res/drawable-xhdpi/ic_battery_7.png
library-mine/res/drawable-xhdpi/ic_battery_8.png
library-mine/res/drawable-xhdpi/ic_player_back.png
library-mine/res/drawable-xhdpi/ic_player_collecte.png
library-mine/res/drawable-xhdpi/ic_player_collected.png
library-mine/res/drawable-xhdpi/ic_player_definition_right.png
library-mine/res/drawable-xhdpi/ic_player_download.png
library-mine/res/drawable-xhdpi/ic_player_episode.png
library-mine/res/drawable-xhdpi/ic_player_full_screen.png
library-mine/res/drawable-xhdpi/ic_player_loading.png
library-mine/res/drawable-xhdpi/ic_player_lock.png
library-mine/res/drawable-xhdpi/ic_player_pause.png
library-mine/res/drawable-xhdpi/ic_player_pause_big.png
library-mine/res/drawable-xhdpi/ic_player_play.png
library-mine/res/drawable-xhdpi/ic_player_play_big.png
library-mine/res/drawable-xhdpi/ic_player_share.png
library-mine/res/drawable-xhdpi/ic_player_unlock.png
library-mine/res/drawable/layer_player_progressbar.xml
New file @@ -0,0 +1,27 @@ <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@android:id/background"> <shape> <corners android:radius="5dp" /> <solid android:color="#F0F0F0" /> </shape> </item> <item android:id="@android:id/secondaryProgress"> <clip> <shape> <corners android:radius="5dp" /> <solid android:color="#F0F0F0" /> </shape> </clip> </item> <item android:id="@android:id/progress"> <clip> <shape> <corners android:radius="5dp" /> <solid android:color="#FF078D" /> </shape> </clip> </item> </layer-list> library-mine/res/drawable/shape_player_definition_bg.xml
New file @@ -0,0 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="#7D7D7D"></solid> <corners android:radius="50dp"></corners> </shape> library-mine/res/drawable/shape_player_dialog_bg_gray.xml
New file @@ -0,0 +1,9 @@ <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="#80000000" /> <corners android:bottomLeftRadius="6dp" android:bottomRightRadius="6dp" android:topLeftRadius="6dp" android:topRightRadius="6dp" /> </shape> library-mine/res/drawable/shape_player_dialog_bg_white.xml
New file @@ -0,0 +1,9 @@ <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="#fffafafa" /> <corners android:bottomLeftRadius="17dp" android:bottomRightRadius="17dp" android:topLeftRadius="17dp" android:topRightRadius="17dp" /> </shape> library-mine/res/drawable/shape_player_thumb.xml
New file @@ -0,0 +1,9 @@ <?xml version="1.0" encoding="UTF-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="#FFFFFF"></solid> <corners android:radius="50dp"></corners> <size android:width="11dp" android:height="11dp"></size> </shape> library-mine/res/layout-land/video_player_controller.xml
New file @@ -0,0 +1,275 @@ <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <!--顶部控件 --> <LinearLayout android:id="@+id/ll_top" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#b3000000" android:orientation="vertical"> <FrameLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingLeft="10dp" android:paddingTop="6dp" android:paddingRight="10dp" android:paddingBottom="6dp"> <ImageView android:id="@+id/iv_network" android:layout_width="wrap_content" android:layout_height="11dp" android:layout_gravity="left|center_vertical"></ImageView> <TextView android:id="@+id/tv_time" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="11:54" android:textColor="#ffffffff" android:textSize="11sp" /> <ImageView android:id="@+id/iv_electric" android:layout_width="wrap_content" android:layout_height="12dp" android:layout_gravity="right|center_vertical" android:src="@drawable/ic_battery_1"></ImageView> </FrameLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_vertical" android:paddingLeft="10dp" android:paddingRight="20dp"> <ImageView android:id="@+id/iv_back" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="12dp" android:src="@drawable/ic_player_back"></ImageView> <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:orientation="vertical"> <TextView android:id="@+id/tv_title" android:layout_width="match_parent" android:layout_height="wrap_content" android:ellipsize="end" android:lines="1" android:text="致青春·原来你还在这里" android:textColor="#FFFFFF" android:textSize="18sp"></TextView> <TextView android:id="@+id/tv_link" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="" android:textColor="#ffffffff" android:textSize="7sp" /> </LinearLayout> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content"> <ImageView android:id="@+id/iv_collection" android:layout_width="21dp" android:layout_height="wrap_content" android:src="@drawable/ic_player_collecte"></ImageView> <ImageView android:id="@+id/iv_download" android:layout_width="21dp" android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:src="@drawable/ic_player_download"></ImageView> <ImageView android:id="@+id/iv_share" android:layout_width="21dp" android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:src="@drawable/ic_player_share"></ImageView> <ImageView android:id="@+id/iv_episode" android:layout_width="21dp" android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:src="@drawable/ic_player_episode"></ImageView> </LinearLayout> </LinearLayout> </LinearLayout> <!-- 中间 --> <!--锁屏 --> <ImageView android:id="@+id/iv_lock" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="right|center_vertical" android:layout_marginRight="20dp" android:src="@drawable/ic_player_unlock"> </ImageView> <ImageView android:id="@+id/iv_play_center" android:layout_width="50dp" android:visibility="gone" android:layout_height="50dp" android:layout_gravity="center" android:src="@drawable/ic_player_play_big"></ImageView> <!--底部 --> <FrameLayout android:id="@+id/fl_bottom" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="bottom" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:background="#b3000000" android:gravity="center_vertical" android:orientation="horizontal" android:paddingLeft="20dp" android:paddingTop="5dp" android:paddingRight="15dp" android:paddingBottom="5dp"> <ImageView android:id="@+id/iv_play" android:layout_width="38dp" android:layout_height="38dp" android:layout_gravity="left|center_vertical" android:src="@drawable/ic_player_play"></ImageView> <!--下一集 --> <ImageView android:id="@+id/iv_next" android:layout_width="wrap_content" android:layout_height="wrap_content"></ImageView> <!--播放进度 --> <TextView android:id="@+id/tv_progress" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="35dp" android:text="09:54" android:textColor="#ffffff" android:textSize="14sp"></TextView> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="11.5dp" android:text="|" android:textColor="#ffffff" android:textSize="14sp"></TextView> <!--视频总时长 --> <TextView android:id="@+id/tv_duration" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="11.5dp" android:text="18:04" android:textColor="#ffffff" android:textSize="14sp"></TextView> <View android:layout_width="0dp" android:layout_height="1dp" android:layout_weight="1"></View> <!--清晰度 --> <TextView android:id="@+id/tv_definition" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/shape_player_definition_bg" android:drawableRight="@drawable/ic_player_definition_right" android:drawablePadding="6dp" android:padding="8dp" android:text="清晰度:高清" android:textColor="#ffeeeeee" android:textSize="9sp" /> <!-- 来源 --> <TextView android:id="@+id/tv_resource" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="12.5dp" android:layout_marginRight="12dp" android:background="@drawable/shape_player_definition_bg" android:drawablePadding="6dp" android:padding="8dp" android:text="来源:爱奇艺" android:textColor="#ffeeeeee" android:textSize="9sp" /> <ImageView android:id="@+id/iv_full_screen" android:layout_width="wrap_content" android:layout_height="35dp" android:padding="10dp" android:src="@drawable/ic_player_full_screen" android:visibility="gone"></ImageView> </LinearLayout> <!-- 进度 --> <SeekBar android:id="@+id/seekBar" android:layout_width="match_parent" android:layout_height="20dp" android:max="100" android:maxHeight="3dp" android:minHeight="3dp" android:paddingLeft="0dp" android:paddingRight="0dp" android:progress="10" android:progressDrawable="@drawable/layer_player_progressbar" android:splitTrack="false" android:thumb="@drawable/shape_player_thumb" android:thumbOffset="5dp" /> </FrameLayout> </FrameLayout> library-mine/res/layout/item_player_loading.xml
New file @@ -0,0 +1,15 @@ <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/shape_player_dialog_bg_gray"> <ImageView android:id="@+id/iv_loading" android:layout_width="51dp" android:layout_height="51dp" android:layout_gravity="center" android:src="@drawable/ic_player_loading"> </ImageView> </FrameLayout> library-mine/res/layout/item_player_notify.xml
New file @@ -0,0 +1,68 @@ <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/shape_player_dialog_bg_white" android:gravity="center_horizontal" android:orientation="vertical"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="18dp" android:text="网络提醒" android:textColor="#333333" android:textSize="18sp" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="8dp" android:layout_marginBottom="8dp" android:gravity="center" android:padding="20dp" android:text="您现在正在使用移动数据观看" android:textColor="#99232323" android:textSize="16sp" /> <View android:layout_width="match_parent" android:layout_height="1dp" android:background="#E1E1E1"></View> <LinearLayout android:layout_width="match_parent" android:layout_height="50dp"> <TextView android:id="@+id/tv_contiue" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:gravity="center" android:text="土豪请随意" android:textColor="#ff999999" android:textSize="17sp" /> <View android:layout_width="1dp" android:layout_height="match_parent" android:layout_marginTop="5dp" android:layout_marginBottom="5dp" android:background="#E1E1E1"></View> <TextView android:id="@+id/tv_close" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:gravity="center" android:text="关闭视频" android:textColor="#ff333333" android:textSize="17sp" /> </LinearLayout> </LinearLayout> library-mine/res/layout/media_controller.xml
@@ -1,23 +1,7 @@ <?xml version="1.0" encoding="utf-8"?> <!-- Copyright (C) 2007 The Android Open Source Project Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#CC000000" android:orientation="vertical" android:layoutDirection="ltr"> library-mine/res/layout/video_player_controller.xml
New file @@ -0,0 +1,271 @@ <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <!--顶部控件 --> <LinearLayout android:id="@+id/ll_top" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#b3000000" android:orientation="vertical"> <FrameLayout android:visibility="gone" android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingLeft="10dp" android:paddingTop="6dp" android:paddingRight="10dp" android:paddingBottom="6dp"> <ImageView android:id="@+id/iv_network" android:layout_width="wrap_content" android:layout_height="11dp" android:layout_gravity="left|center_vertical"></ImageView> <TextView android:id="@+id/tv_time" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="11:54" android:textColor="#ffffffff" android:textSize="11sp" /> <ImageView android:id="@+id/iv_electric" android:layout_width="wrap_content" android:layout_height="12dp" android:layout_gravity="right|center_vertical" android:src="@drawable/ic_battery_1"></ImageView> </FrameLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_vertical" android:paddingLeft="10dp" android:paddingTop="7.5dp" android:paddingRight="20dp" android:paddingBottom="7.5dp"> <ImageView android:id="@+id/iv_back" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="12dp" android:src="@drawable/ic_player_back"></ImageView> <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:orientation="vertical"> <TextView android:id="@+id/tv_title" android:layout_width="match_parent" android:layout_height="wrap_content" android:ellipsize="end" android:lines="1" android:text="致青春·原来你还在这里" android:textColor="#FFFFFF" android:textSize="18sp"></TextView> <TextView android:id="@+id/tv_link" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="" android:textColor="#ffffffff" android:textSize="7sp" /> </LinearLayout> <LinearLayout android:visibility="gone" android:layout_width="wrap_content" android:layout_height="wrap_content"> <ImageView android:id="@+id/iv_collection" android:layout_width="21dp" android:layout_height="wrap_content" android:src="@drawable/ic_player_collecte"></ImageView> <ImageView android:id="@+id/iv_download" android:layout_width="21dp" android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:src="@drawable/ic_player_download"></ImageView> <ImageView android:id="@+id/iv_share" android:layout_width="21dp" android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:src="@drawable/ic_player_share"></ImageView> <ImageView android:id="@+id/iv_episode" android:layout_width="21dp" android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:src="@drawable/ic_player_episode"></ImageView> </LinearLayout> </LinearLayout> </LinearLayout> <!-- 中间 --> <!--锁屏 --> <ImageView android:id="@+id/iv_lock" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="right|center_vertical" android:layout_marginRight="20dp" android:visibility="gone" android:src="@drawable/ic_player_unlock"> </ImageView> <ImageView android:id="@+id/iv_play_center" android:layout_width="50dp" android:visibility="gone" android:layout_height="50dp" android:layout_gravity="center" android:src="@drawable/ic_player_play_big"></ImageView> <!--底部 --> <FrameLayout android:id="@+id/ll_bottom" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="bottom" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:background="#b3000000" android:gravity="center_vertical" android:orientation="horizontal" android:paddingLeft="10dp" android:paddingTop="5dp" android:paddingBottom="5dp"> <ImageView android:id="@+id/iv_play" android:layout_width="38dp" android:layout_height="38dp" android:layout_gravity="left|center_vertical" android:src="@drawable/ic_player_play"></ImageView> <!--下一集 --> <ImageView android:id="@+id/iv_next" android:layout_width="wrap_content" android:layout_height="wrap_content"></ImageView> <!--播放进度 --> <TextView android:id="@+id/tv_progress" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="15dp" android:text="09:54" android:textColor="#ffffff" android:textSize="14sp"></TextView> <SeekBar android:layout_marginLeft="4dp" android:layout_marginRight="4dp" android:id="@+id/seekBar" android:layout_width="0dp" android:layout_weight="1" android:layout_height="20dp" android:max="100" android:maxHeight="3dp" android:minHeight="3dp" android:paddingLeft="0dp" android:paddingRight="0dp" android:progress="10" android:progressDrawable="@drawable/layer_player_progressbar" android:splitTrack="false" android:thumb="@drawable/shape_player_thumb" android:thumbOffset="5dp" /> <!--视频总时长 --> <TextView android:id="@+id/tv_duration" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="18:04" android:textColor="#ffffff" android:textSize="14sp"></TextView> <!--清晰度 --> <TextView android:visibility="gone" android:id="@+id/tv_definition" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/shape_player_definition_bg" android:drawableRight="@drawable/ic_player_definition_right" android:drawablePadding="6dp" android:padding="8dp" android:text="清晰度:高清" android:textColor="#ffeeeeee" android:textSize="9sp" /> <!-- 来源 --> <TextView android:visibility="gone" android:id="@+id/tv_resource" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="12.5dp" android:layout_marginRight="12dp" android:background="@drawable/shape_player_definition_bg" android:drawablePadding="6dp" android:padding="8dp" android:text="来源:爱奇艺" android:textColor="#ffeeeeee" android:textSize="9sp" /> <ImageView android:id="@+id/iv_full_screen" android:layout_width="wrap_content" android:layout_height="35dp" android:padding="10dp" android:src="@drawable/ic_player_full_screen" android:visibility="visible"></ImageView> </LinearLayout> <!-- 进度 --> </FrameLayout> </FrameLayout> library-mine/res/values/styles.xml
@@ -38,4 +38,13 @@ <item name="android:windowCloseOnTouchOutside">true</item> </style> <style name="Dialog" parent="android:style/Theme.Dialog"> <item name="android:windowFrame">@null</item> <item name="android:background">#00000000</item> <item name="android:windowBackground">@android:color/transparent</item> <item name="android:windowNoTitle">true</item> <item name="android:backgroundDimEnabled">false</item> <item name="android:windowIsFloating">true</item> </style> </resources> library-mine/src/com/lcjian/library/video/VideoDataNotifyDialog.java
New file @@ -0,0 +1,86 @@ package com.lcjian.library.video; import android.app.Activity; import android.app.Dialog; import android.content.Context; import android.support.annotation.NonNull; import android.view.LayoutInflater; import android.view.View; import android.view.WindowManager; import com.lcjian.lcjianlibrary.R; import com.lcjian.library.util.common.DimenUtils; public class VideoDataNotifyDialog extends Dialog { private IDialogClick dialogClick; public VideoDataNotifyDialog(@NonNull Context context) { super(context); } public VideoDataNotifyDialog(@NonNull Context context, int themeResId) { super(context, themeResId); } public static class Builder { private IDialogClick dialogClick; public Builder setDialogClick(IDialogClick dialogClick) { this.dialogClick = dialogClick; return this; } public VideoDataNotifyDialog build(Activity context) { final VideoDataNotifyDialog videoLoadingDialog = new VideoDataNotifyDialog(context, R.style.Dialog); View view = LayoutInflater.from(context).inflate(R.layout.item_player_notify, null); view.findViewById(R.id.tv_contiue).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (dialogClick != null) dialogClick.continuePlay(); if (videoLoadingDialog.isShowing()) videoLoadingDialog.dismiss(); } }); view.findViewById(R.id.tv_close).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (dialogClick != null) dialogClick.close(); if (videoLoadingDialog.isShowing()) videoLoadingDialog.dismiss(); } }); videoLoadingDialog.setContentView(view); WindowManager.LayoutParams params = videoLoadingDialog.getWindow() .getAttributes(); params.width = DimenUtils.getScreenWidth(context) * 5 / 6; params.height = WindowManager.LayoutParams.WRAP_CONTENT; videoLoadingDialog.getWindow().setAttributes(params); videoLoadingDialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent); //去除半透明阴影 WindowManager.LayoutParams layoutParams = videoLoadingDialog.getWindow().getAttributes(); layoutParams.dimAmount = 0.0f; videoLoadingDialog.getWindow().setAttributes(layoutParams); videoLoadingDialog.setCanceledOnTouchOutside(false); return videoLoadingDialog; } } interface IDialogClick { public void continuePlay(); public void close(); } } library-mine/src/com/lcjian/library/video/VideoLoadingDialog.java
New file @@ -0,0 +1,56 @@ package com.lcjian.library.video; import android.app.Dialog; import android.content.Context; import android.support.annotation.NonNull; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.view.animation.LinearInterpolator; import android.widget.ImageView; import com.lcjian.lcjianlibrary.R; import com.lcjian.library.util.common.DimenUtils; public class VideoLoadingDialog extends Dialog { public VideoLoadingDialog(@NonNull Context context) { super(context); } public VideoLoadingDialog(@NonNull Context context, int themeResId) { super(context, themeResId); } public static VideoLoadingDialog build(Context context) { VideoLoadingDialog videoLoadingDialog = new VideoLoadingDialog(context, R.style.Dialog); View view = LayoutInflater.from(context).inflate(R.layout.item_player_loading, null); ImageView imageView = view.findViewById(R.id.iv_loading); Animation operatingAnim = AnimationUtils.loadAnimation(context, R.anim.rotate_dialog_player_loading); LinearInterpolator lin = new LinearInterpolator(); operatingAnim.setInterpolator(lin); imageView.setAnimation(operatingAnim); operatingAnim.start(); videoLoadingDialog.setContentView(view); android.view.WindowManager.LayoutParams params = videoLoadingDialog.getWindow() .getAttributes(); params.width = DimenUtils.dip2px(context, 95); params.height = DimenUtils.dip2px(context, 95); videoLoadingDialog.getWindow().setAttributes(params); videoLoadingDialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent); //去除半透明阴影 WindowManager.LayoutParams layoutParams = videoLoadingDialog.getWindow().getAttributes(); layoutParams.dimAmount = 0.0f; videoLoadingDialog.getWindow().setAttributes(layoutParams); videoLoadingDialog.setCanceledOnTouchOutside(false); return videoLoadingDialog; } } library-mine/src/com/lcjian/library/video/VideoPlayerController.java
New file @@ -0,0 +1,227 @@ package com.lcjian.library.video; import android.app.Activity; import android.content.Context; import android.content.pm.ActivityInfo; import android.media.MediaPlayer; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.util.AttributeSet; import android.util.Log; import android.view.GestureDetector; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.SeekBar; import android.widget.TextView; import com.lcjian.lcjianlibrary.R; public class VideoPlayerController extends FrameLayout { private Activity mActivity; private final static String TAG = "VideoPlayerController"; private MediaPlayer mediaPlayer; private IVideoPlayerListener videoPlayerListener; //容器 private FrameLayout fl_bottom; private LinearLayout ll_top; private View contentView; private ImageView iv_back;//返回 private TextView tv_title;//标题 private ImageView iv_electric;//电量 private TextView tv_time;//当前时间 private ImageView iv_lock;//锁屏 private ImageView iv_play;//播放 private SeekBar seekBar;//进度 private ImageView iv_next;//下一级 private TextView tv_progress;//现在的播放进度 private TextView tv_duration;//视频总时长 private TextView tv_definition;//清晰度 private ImageView iv_episode;//选集 private ImageView iv_full_screen; public VideoPlayerController setMediaPlayer(MediaPlayer mediaPlayer) { this.mediaPlayer = mediaPlayer; return this; } public VideoPlayerController setVideoPlayerListener(IVideoPlayerListener videoPlayerListener) { this.videoPlayerListener = videoPlayerListener; return this; } public VideoPlayerController setContentView(View contentView) { this.contentView = contentView; return this; } public VideoPlayerController(@NonNull Context context) { super(context); } public VideoPlayerController(@NonNull Context context, @Nullable AttributeSet attrs) { super(context, attrs); LayoutInflater.from(context).inflate(R.layout.video_player_controller, this); fl_bottom = findViewById(R.id.fl_bottom); ll_top = findViewById(R.id.ll_top); iv_back = findViewById(R.id.iv_back); tv_title = findViewById(R.id.tv_title); iv_electric = findViewById(R.id.iv_electric); tv_time = findViewById(R.id.tv_time); iv_lock = findViewById(R.id.iv_lock); iv_play = findViewById(R.id.iv_play); seekBar = findViewById(R.id.seekBar); iv_next = findViewById(R.id.iv_next); tv_progress = findViewById(R.id.tv_progress); tv_duration = findViewById(R.id.tv_duration); tv_definition = findViewById(R.id.tv_definition); iv_episode = findViewById(R.id.iv_episode); iv_full_screen = findViewById(R.id.iv_full_screen); iv_full_screen.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); } }); } private void showController() { if (!isLock()) { fl_bottom.setVisibility(View.VISIBLE); ll_top.setVisibility(View.VISIBLE); } iv_lock.setVisibility(View.VISIBLE); } private void hiddenController() { fl_bottom.setVisibility(View.GONE); ll_top.setVisibility(View.GONE); iv_lock.setVisibility(View.GONE); } private GestureDetector mGesde = new GestureDetector(new MSimpleGestureDectListener()); /** * 初始化 */ public void build(Activity mActivity) { this.mActivity = mActivity; contentView.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { mGesde.onTouchEvent(event); return true; } }); seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { boolean isTouch = false; @Override public void onProgressChanged(SeekBar seekBar, int precent, boolean b) { if (isTouch) { //计算 拖拉后的 时间长度: int positionLong = mediaPlayer.getDuration() * seekBar.getProgress() / 100; mediaPlayer.seekTo(positionLong); } } @Override public void onStartTrackingTouch(SeekBar seekBar) { // mHandler.removeMessages(0); // isTouch = true; // mediaPlayer.pause(); // stop$play.setImageResource(R.mipmap.play_small); } @Override public void onStopTrackingTouch(SeekBar seekBar) { // if (controllerView.getVisibility() == View.VISIBLE) { // if (mHandler != null) { // mHandler.sendEmptyMessageDelayed(0, 4000); // } // } isTouch = false; mediaPlayer.start(); // stop$play.setImageResource(R.mipmap.stop_small); } }); } public void changeOrien(Activity activity) { // boolean tag = requestOrien.getTag() == null ? false : (boolean) requestOrien.getTag(); // activity.setRequestedOrientation(!tag ? ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE : ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); // requestOrien.setTag(!tag); } //锁屏 private void lock() { hiddenController(); } //解锁屏 private void unLock() { if (isLock()) showController(); } interface IVideoPlayerListener { //点击了暂停按钮 public void onPause(); //下一集 public void onNext(); //返回 public void onBack(); } private boolean isLock() { return false; } private boolean isControllerShow() { return ll_top.getVisibility() == View.VISIBLE; } //手势处理 private class MSimpleGestureDectListener extends GestureDetector.SimpleOnGestureListener { @Override public boolean onSingleTapConfirmed(MotionEvent e) { if (isControllerShow()) { hiddenController(); } else { showController(); } return true; } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { Log.i(TAG, String.format("onScroll:distanceX=%s distanceY=%s", distanceX, distanceY)); if (distanceX != 0) { } return true; } } } settings.gradle
@@ -1,3 +1,4 @@ include ':library-Funshion' include ':social_sdk_library_project', ':YoukuPlayerOpenSDK' include ':MyselfSuperAd' include ':GuangDianTongSDK'