Commit 342d51290cc38d7a7786d9b6b4563b1d2e401b0f

Authored by 韩亚云
1 parent bc7a1017

图库添加视频全屏预览

core/imageload/build.gradle
@@ -33,4 +33,5 @@ dependencies { @@ -33,4 +33,5 @@ dependencies {
33 implementation project(path: ':cloud:user') 33 implementation project(path: ':cloud:user')
34 implementation project(path: ':core:app_qr') 34 implementation project(path: ':core:app_qr')
35 implementation project(path: ':core:network') 35 implementation project(path: ':core:network')
  36 + implementation project(path: ':cloud:video')
36 } 37 }
core/imageload/src/main/java/com/cnlive/core/imagepreview/ImageDrawee.java
@@ -13,6 +13,12 @@ import com.bumptech.glide.request.target.Target; @@ -13,6 +13,12 @@ import com.bumptech.glide.request.target.Target;
13 import com.cnlive.core.imageload.R; 13 import com.cnlive.core.imageload.R;
14 import com.cnlive.core.imagepreview.indexui.ProgressUI; 14 import com.cnlive.core.imagepreview.indexui.ProgressUI;
15 import com.github.chrisbanes.photoview.PhotoView; 15 import com.github.chrisbanes.photoview.PhotoView;
  16 +import com.libs.video.util.cache.PreloadManager;
  17 +import com.libs.video.video.exoplayer.component.DefaultErrorView;
  18 +import com.libs.video.video.exoplayer.component.DefaultYoukuPrepareView;
  19 +import com.libs.video.video.exoplayer.controller.StandardVideoController;
  20 +import com.libs.video.video.exoplayer.controller.TikTokController;
  21 +import com.libs.video.video.exoplayer.play.CNVideoView;
16 22
17 import androidx.annotation.NonNull; 23 import androidx.annotation.NonNull;
18 import androidx.annotation.Nullable; 24 import androidx.annotation.Nullable;
@@ -24,16 +30,20 @@ import androidx.annotation.Nullable; @@ -24,16 +30,20 @@ import androidx.annotation.Nullable;
24 public class ImageDrawee extends FrameLayout { 30 public class ImageDrawee extends FrameLayout {
25 private PhotoView imageView; 31 private PhotoView imageView;
26 private ProgressUI progressUI; 32 private ProgressUI progressUI;
  33 + private ViewData viewData;
27 34
28 - public ImageDrawee(@NonNull Context context) { 35 + public ImageDrawee(@NonNull Context context,ViewData viewData) {
29 super(context); 36 super(context);
  37 + this.viewData = viewData;
30 init(); 38 init();
31 } 39 }
32 40
33 private void init() { 41 private void init() {
34 // 添加 imageView 42 // 添加 imageView
35 - imageView = new PhotoView(getContext());  
36 - addView(imageView); 43 + if(viewData.getType() == 1){
  44 + imageView = new PhotoView(getContext());
  45 + addView(imageView);
  46 + }
37 } 47 }
38 48
39 public void setProgressUI(ProgressUI progressUI) { 49 public void setProgressUI(ProgressUI progressUI) {
@@ -87,7 +97,7 @@ public class ImageDrawee extends FrameLayout { @@ -87,7 +97,7 @@ public class ImageDrawee extends FrameLayout {
87 // } 97 // }
88 // } 98 // }
89 // 调用 setImageDrawable(null) 方法,然后 GC 会完成图片的回收 99 // 调用 setImageDrawable(null) 方法,然后 GC 会完成图片的回收
90 - imageView.setImageDrawable(null); 100 + if(imageView != null)imageView.setImageDrawable(null);
91 // 手动调用 GC(但是 GC 并不一定是马上执行的,只能说是加速 GC 回收) 101 // 手动调用 GC(但是 GC 并不一定是马上执行的,只能说是加速 GC 回收)
92 // System.gc(); 102 // System.gc();
93 } 103 }
@@ -100,38 +110,32 @@ public class ImageDrawee extends FrameLayout { @@ -100,38 +110,32 @@ public class ImageDrawee extends FrameLayout {
100 if (obj == null) { 110 if (obj == null) {
101 return; 111 return;
102 } 112 }
  113 + if(viewData.getType() == 1){
  114 + Glide.with(getContext())
  115 + .load(obj)
  116 + .listener(new RequestListener<Drawable>() {
  117 + @Override
  118 + public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
  119 + callback.onLoadFailed();
  120 + return false;
  121 + }
  122 +
  123 + @Override
  124 + public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
  125 + callback.onLoadSucceed(resource);
  126 + return false;
  127 + }
  128 + })
  129 + .error(R.drawable.preview_zwtp)
  130 + .into(imageView);
  131 + }else if(viewData.getType() == 2){
  132 +
  133 + }
103 134
104 - Glide.with(getContext())  
105 - .load(obj)  
106 - .listener(new RequestListener<Drawable>() {  
107 - @Override  
108 - public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {  
109 - callback.onLoadFailed();  
110 - return false;  
111 - }  
112 -  
113 - @Override  
114 - public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {  
115 - callback.onLoadSucceed(resource);  
116 - return false;  
117 - }  
118 - })  
119 - .error(R.drawable.preview_zwtp)  
120 - .into(imageView);  
121 -// if (obj instanceof Drawable) {  
122 -// Glide.with(getContext()).load(obj).into(imageView);  
123 -//// imageView.setImageDrawable((Drawable) obj);  
124 -// } else if (obj instanceof Bitmap) {  
125 -// imageView.setImageBitmap((Bitmap) obj);  
126 -// } else if (obj instanceof Integer) {  
127 -// imageView.setImageResource((Integer) obj);  
128 -// } else {  
129 -// Log.e("ImageDrawee", "Unable to identify picture resources.");  
130 -// }  
131 } 135 }
132 136
133 public float getScale() { 137 public float getScale() {
134 - return imageView.getScale(); 138 + return imageView == null?1f:imageView.getScale();
135 } 139 }
136 140
137 public void setScale(float scale) { 141 public void setScale(float scale) {
core/imageload/src/main/java/com/cnlive/core/imagepreview/ImagePreView.java
@@ -27,6 +27,10 @@ import com.cnlive.core.imagepreview.listener.OnItemClickListener; @@ -27,6 +27,10 @@ import com.cnlive.core.imagepreview.listener.OnItemClickListener;
27 import com.cnlive.core.imagepreview.listener.OnItemLongPressListener; 27 import com.cnlive.core.imagepreview.listener.OnItemLongPressListener;
28 import com.cnlive.core.imagepreview.viewpager.ImagePagerAdapter; 28 import com.cnlive.core.imagepreview.viewpager.ImagePagerAdapter;
29 import com.cnlive.core.imagepreview.viewpager.ImageViewPager; 29 import com.cnlive.core.imagepreview.viewpager.ImageViewPager;
  30 +import com.libs.video.video.exoplayer.controller.StandardVideoController;
  31 +import com.libs.video.video.exoplayer.play.CNVideoView;
  32 +import com.libs.video.video.exoplayer.util.L;
  33 +import com.libs.video.video.exoplayer.util.PlayerUtils;
30 34
31 import java.util.ArrayList; 35 import java.util.ArrayList;
32 import java.util.List; 36 import java.util.List;
@@ -88,6 +92,9 @@ public class ImagePreView extends FrameLayout implements ViewPager.OnPageChangeL @@ -88,6 +92,9 @@ public class ImagePreView extends FrameLayout implements ViewPager.OnPageChangeL
88 private OnItemChangedListener mItemChangedListener; 92 private OnItemChangedListener mItemChangedListener;
89 private OnDragStatusListener mDragStatusListener; 93 private OnDragStatusListener mDragStatusListener;
90 private OnBrowseStatusListener mBrowseStatusListener; 94 private OnBrowseStatusListener mBrowseStatusListener;
  95 + private CNVideoView videoView;
  96 + private StandardVideoController mController;
  97 +
91 98
92 public ImagePreView(@NonNull Context context) { 99 public ImagePreView(@NonNull Context context) {
93 super(context); 100 super(context);
@@ -117,6 +124,10 @@ public class ImagePreView extends FrameLayout implements ViewPager.OnPageChangeL @@ -117,6 +124,10 @@ public class ImagePreView extends FrameLayout implements ViewPager.OnPageChangeL
117 a.recycle(); 124 a.recycle();
118 } 125 }
119 } 126 }
  127 + videoView = new CNVideoView(context);
  128 + mController = new StandardVideoController(getContext());
  129 + mController.addDefaultControlComponent("", false);
  130 + videoView.setVideoController(mController);
120 initView(); 131 initView();
121 } 132 }
122 133
@@ -146,6 +157,7 @@ public class ImagePreView extends FrameLayout implements ViewPager.OnPageChangeL @@ -146,6 +157,7 @@ public class ImagePreView extends FrameLayout implements ViewPager.OnPageChangeL
146 157
147 @Override 158 @Override
148 public void onPageSelected(int position) { 159 public void onPageSelected(int position) {
  160 + startPlay(position);
149 if (showIndex && indexUI != null && mSourceList != null) { 161 if (showIndex && indexUI != null && mSourceList != null) {
150 indexUI.handleItemChanged(position, mSourceList.size()); 162 indexUI.handleItemChanged(position, mSourceList.size());
151 } 163 }
@@ -159,6 +171,19 @@ public class ImagePreView extends FrameLayout implements ViewPager.OnPageChangeL @@ -159,6 +171,19 @@ public class ImagePreView extends FrameLayout implements ViewPager.OnPageChangeL
159 171
160 } 172 }
161 173
  174 + private void startPlay(int position) {
  175 + videoView.release();
  176 + PlayerUtils.removeViewFormParent(videoView);
  177 + if(mSourceList.get(position).getType() == 1){
  178 +
  179 + }else if(mSourceList.get(position).getType() == 2){
  180 + getCurrentItem().removeAllViews();
  181 + getCurrentItem().addView(videoView);
  182 + videoView.setUrl("http://ffyl.vods2.cnlive.com/223/vod/2018/1120/223_88c98ab1395f4762b703fbdd9d59d2e5/ff80808166c2a45201672f14a9933131_800.m3u8");
  183 + videoView.start();
  184 + }
  185 + }
  186 +
162 public ImagePreView imageData(@NonNull List list) { 187 public ImagePreView imageData(@NonNull List list) {
163 if (mSourceList == null) { 188 if (mSourceList == null) {
164 mSourceList = new ArrayList<ViewData>(); 189 mSourceList = new ArrayList<ViewData>();
@@ -167,6 +192,11 @@ public class ImagePreView extends FrameLayout implements ViewPager.OnPageChangeL @@ -167,6 +192,11 @@ public class ImagePreView extends FrameLayout implements ViewPager.OnPageChangeL
167 } 192 }
168 for (int i = 0, len = list.size(); i < len; i++) { 193 for (int i = 0, len = list.size(); i < len; i++) {
169 ViewData vd = new ViewData(list.get(i)); 194 ViewData vd = new ViewData(list.get(i));
  195 + if (i == 0){
  196 + vd.setType(2);
  197 + }else {
  198 + vd.setType(1);
  199 + }
170 mSourceList.add(vd); 200 mSourceList.add(vd);
171 } 201 }
172 return this; 202 return this;
@@ -346,6 +376,7 @@ public class ImagePreView extends FrameLayout implements ViewPager.OnPageChangeL @@ -346,6 +376,7 @@ public class ImagePreView extends FrameLayout implements ViewPager.OnPageChangeL
346 * 取消浏览 376 * 取消浏览
347 */ 377 */
348 public void cancel() { 378 public void cancel() {
  379 + videoView.onDestroy();
349 cancel(null); 380 cancel(null);
350 } 381 }
351 382
@@ -412,8 +443,9 @@ public class ImagePreView extends FrameLayout implements ViewPager.OnPageChangeL @@ -412,8 +443,9 @@ public class ImagePreView extends FrameLayout implements ViewPager.OnPageChangeL
412 } 443 }
413 } 444 }
414 if (drawee == null) { 445 if (drawee == null) {
415 - drawee = new ImageDrawee(container.getContext()); 446 + drawee = new ImageDrawee(container.getContext(),mSourceList.get(position));
416 drawee.setProgressUI(progressUI); 447 drawee.setProgressUI(progressUI);
  448 + if(mSourceList.get(position).getType() == 2)drawee.addView(videoView);
417 mViewBox.add(drawee); 449 mViewBox.add(drawee);
418 } 450 }
419 container.addView(drawee); 451 container.addView(drawee);
@@ -461,101 +493,79 @@ public class ImagePreView extends FrameLayout implements ViewPager.OnPageChangeL @@ -461,101 +493,79 @@ public class ImagePreView extends FrameLayout implements ViewPager.OnPageChangeL
461 */ 493 */
462 private void configureItem(final int position, final ImageDrawee drawee) { 494 private void configureItem(final int position, final ImageDrawee drawee) {
463 drawee.setTag(position); 495 drawee.setTag(position);
464 - if (mMaxScale > 0) {  
465 - drawee.setMaxScale(mMaxScale);  
466 - }  
467 - if (mMinScale > 0) {  
468 - drawee.setMinScale(mMinScale);  
469 - }  
470 -  
471 -  
472 - drawee.setImage(mSourceList.get(position).getImageSrc(),new LoadImage.LoadCallback(){  
473 -  
474 - @Override  
475 - public void onLoadStarted(Object placeholder) {  
476 - 496 + if(mSourceList.get(position).getType() == 1){
  497 + playEnterAnim = true;
  498 + playExitAnim = true;
  499 + draggable = true;
  500 + if (mMaxScale > 0) {
  501 + drawee.setMaxScale(mMaxScale);
477 } 502 }
478 -  
479 - @Override  
480 - public void onLoading(float progress) {  
481 - drawee.handleProgress(progress); 503 + if (mMinScale > 0) {
  504 + drawee.setMinScale(mMinScale);
482 } 505 }
483 -  
484 - @Override  
485 - public void onLoadSucceed(Object source) {  
486 - drawee.hideProgressUI();  
487 - if (mSourceList.get(position).getImageWidth() == 0 ||  
488 - mSourceList.get(position).getImageHeight() == 0) {  
489 - Drawable drawable = drawee.getImageView().getDrawable();  
490 - if (drawable != null) {  
491 - mSourceList.get(position).setImageWidth(drawable.getIntrinsicWidth());  
492 - mSourceList.get(position).setImageHeight(drawable.getIntrinsicHeight()); 506 + if(drawee.getImageView() != null){
  507 + // 单击事件
  508 + drawee.getImageView().setOnClickListener(new OnClickListener() {
  509 + @Override
  510 + public void onClick(View v) {
  511 + if (!hasAnimRunning && mItemClickListener != null) {
  512 + final boolean result = mItemClickListener.onItemClick(position, drawee.getImageView());
  513 + // 判断是否消费了单击事件,如果消费了,则单击事件的后续方法不执行
  514 + if (result) {
  515 + return;
  516 + }
  517 + }
  518 + cancel();
493 } 519 }
494 - } 520 + });
  521 + // 长按事件
  522 + drawee.getImageView().setOnLongClickListener(new OnLongClickListener() {
  523 + @Override
  524 + public boolean onLongClick(View v) {
  525 + if (!hasAnimRunning && mItemLongPressListener != null) {
  526 + return mItemLongPressListener.onItemLongPress(position, drawee.getImageView());
  527 + }
  528 + return false;
  529 + }
  530 + });
495 } 531 }
  532 + drawee.setImage(mSourceList.get(position).getImageSrc(),new LoadImage.LoadCallback(){
496 533
497 - @Override  
498 - public void onLoadFailed() {  
499 - drawee.hideProgressUI();  
500 - }  
501 - });  
502 -  
503 -  
504 -// mLoader.displayImage(mSourceList.get(position).getImageSrc(), drawee.getImageView(), new LoadImage.LoadCallback() {  
505 -// @Override  
506 -// public void onLoadStarted(Object placeholder) {  
507 -// drawee.setImage(placeholder);  
508 -// }  
509 -//  
510 -// @Override  
511 -// public void onLoading(float progress) {  
512 -// drawee.handleProgress(progress);  
513 -// }  
514 -//  
515 -// @Override  
516 -// public void onLoadSucceed(Object source) {  
517 -// drawee.hideProgressUI();  
518 -// drawee.setImage(source);  
519 -// if (mSourceList.get(position).getImageWidth() == 0 ||  
520 -// mSourceList.get(position).getImageHeight() == 0) {  
521 -// Drawable drawable = drawee.getImageView().getDrawable();  
522 -// if (drawable != null) {  
523 -// mSourceList.get(position).setImageWidth(drawable.getIntrinsicWidth());  
524 -// mSourceList.get(position).setImageHeight(drawable.getIntrinsicHeight());  
525 -// }  
526 -// }  
527 -// }  
528 -//  
529 -// @Override  
530 -// public void onLoadFailed(Object error) {  
531 -// drawee.hideProgressUI();  
532 -//// drawee.setImage(error);  
533 -// }  
534 -// });  
535 - // 单击事件  
536 - drawee.getImageView().setOnClickListener(new OnClickListener() {  
537 - @Override  
538 - public void onClick(View v) {  
539 - if (!hasAnimRunning && mItemClickListener != null) {  
540 - final boolean result = mItemClickListener.onItemClick(position, drawee.getImageView());  
541 - // 判断是否消费了单击事件,如果消费了,则单击事件的后续方法不执行  
542 - if (result) {  
543 - return; 534 + @Override
  535 + public void onLoadStarted(Object placeholder) {
  536 +
  537 + }
  538 +
  539 + @Override
  540 + public void onLoading(float progress) {
  541 + drawee.handleProgress(progress);
  542 + }
  543 +
  544 + @Override
  545 + public void onLoadSucceed(Object source) {
  546 + drawee.hideProgressUI();
  547 + if (mSourceList.get(position).getImageWidth() == 0 ||
  548 + mSourceList.get(position).getImageHeight() == 0) {
  549 + Drawable drawable = drawee.getImageView().getDrawable();
  550 + if (drawable != null) {
  551 + mSourceList.get(position).setImageWidth(drawable.getIntrinsicWidth());
  552 + mSourceList.get(position).setImageHeight(drawable.getIntrinsicHeight());
  553 + }
544 } 554 }
545 } 555 }
546 - cancel();  
547 - }  
548 - });  
549 - // 长按事件  
550 - drawee.getImageView().setOnLongClickListener(new OnLongClickListener() {  
551 - @Override  
552 - public boolean onLongClick(View v) {  
553 - if (!hasAnimRunning && mItemLongPressListener != null) {  
554 - return mItemLongPressListener.onItemLongPress(position, drawee.getImageView()); 556 +
  557 + @Override
  558 + public void onLoadFailed() {
  559 + drawee.hideProgressUI();
555 } 560 }
556 - return false;  
557 - }  
558 - }); 561 + });
  562 + }else if(mSourceList.get(position).getType() == 2){
  563 + playEnterAnim = false;
  564 + playExitAnim = false;
  565 + draggable = false;
  566 + videoView.setUrl("http://ffyl.vods2.cnlive.com/223/vod/2018/1120/223_88c98ab1395f4762b703fbdd9d59d2e5/ff80808166c2a45201672f14a9933131_800.m3u8");
  567 + videoView.start();
  568 + }
559 } 569 }
560 570
561 private void noteDragStatus(int status) { 571 private void noteDragStatus(int status) {
@@ -677,7 +687,7 @@ public class ImagePreView extends FrameLayout implements ViewPager.OnPageChangeL @@ -677,7 +687,7 @@ public class ImagePreView extends FrameLayout implements ViewPager.OnPageChangeL
677 * 4.拖拽处理类不为空 687 * 4.拖拽处理类不为空
678 * 5.手势为上下滑动手势,左右滑动不触发 688 * 5.手势为上下滑动手势,左右滑动不触发
679 */ 689 */
680 - if (ev.getPointerCount() == 1 && getCurrentItem().getScale() <= 1f) { 690 + if (ev.getPointerCount() == 1 && getCurrentItem() != null && getCurrentItem().getScale() <= 1f) {
681 float disX = ev.getX() - mLastX; 691 float disX = ev.getX() - mLastX;
682 float disY = ev.getY() - mLastY; 692 float disY = ev.getY() - mLastY;
683 // 上下滑动手势 693 // 上下滑动手势
core/imageload/src/main/java/com/cnlive/core/imagepreview/ViewData.java
@@ -20,6 +20,8 @@ public class ViewData { @@ -20,6 +20,8 @@ public class ViewData {
20 // 目标 view 的高度 20 // 目标 view 的高度
21 private int targetHeight; 21 private int targetHeight;
22 22
  23 + private int type;
  24 +
23 public ViewData() { 25 public ViewData() {
24 26
25 } 27 }
@@ -28,22 +30,24 @@ public class ViewData { @@ -28,22 +30,24 @@ public class ViewData {
28 this.imageSrc = imageSrc; 30 this.imageSrc = imageSrc;
29 } 31 }
30 32
31 - public ViewData(float targetX, float targetY, int targetWidth, int targetHeight) { 33 + public ViewData(float targetX, float targetY, int targetWidth, int targetHeight,int type) {
32 this.targetX = targetX; 34 this.targetX = targetX;
33 this.targetY = targetY; 35 this.targetY = targetY;
34 this.targetWidth = targetWidth; 36 this.targetWidth = targetWidth;
35 this.targetHeight = targetHeight; 37 this.targetHeight = targetHeight;
  38 + this.type = type;
36 } 39 }
37 40
38 - public ViewData(Object imageSrc, float targetX, float targetY, int targetWidth, int targetHeight) { 41 + public ViewData(Object imageSrc, float targetX, float targetY, int targetWidth, int targetHeight,int type) {
39 this.imageSrc = imageSrc; 42 this.imageSrc = imageSrc;
40 this.targetX = targetX; 43 this.targetX = targetX;
41 this.targetY = targetY; 44 this.targetY = targetY;
42 this.targetWidth = targetWidth; 45 this.targetWidth = targetWidth;
43 this.targetHeight = targetHeight; 46 this.targetHeight = targetHeight;
  47 + this.type = type;
44 } 48 }
45 49
46 - public ViewData(Object imageSrc, int imageWidth, int imageHeight, float targetX, float targetY, int targetWidth, int targetHeight) { 50 + public ViewData(Object imageSrc, int imageWidth, int imageHeight, float targetX, float targetY, int targetWidth, int targetHeight,int type) {
47 this.imageSrc = imageSrc; 51 this.imageSrc = imageSrc;
48 this.imageWidth = imageWidth; 52 this.imageWidth = imageWidth;
49 this.imageHeight = imageHeight; 53 this.imageHeight = imageHeight;
@@ -51,6 +55,7 @@ public class ViewData { @@ -51,6 +55,7 @@ public class ViewData {
51 this.targetY = targetY; 55 this.targetY = targetY;
52 this.targetWidth = targetWidth; 56 this.targetWidth = targetWidth;
53 this.targetHeight = targetHeight; 57 this.targetHeight = targetHeight;
  58 + this.type = type;
54 } 59 }
55 60
56 public Object getImageSrc() { 61 public Object getImageSrc() {
@@ -108,4 +113,12 @@ public class ViewData { @@ -108,4 +113,12 @@ public class ViewData {
108 public void setTargetHeight(int targetHeight) { 113 public void setTargetHeight(int targetHeight) {
109 this.targetHeight = targetHeight; 114 this.targetHeight = targetHeight;
110 } 115 }
  116 +
  117 + public int getType() {
  118 + return type;
  119 + }
  120 +
  121 + public void setType(int type) {
  122 + this.type = type;
  123 + }
111 } 124 }