From fe9af2dd348a0b2dabfa036a666ca2a4716e648d Mon Sep 17 00:00:00 2001 From: JessYan Date: Thu, 30 Jul 2020 14:25:05 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E8=A7=86=E9=A2=91=E8=A3=81?= =?UTF-8?q?=E5=89=AA=E6=97=B6=E7=9A=84=E8=BF=9B=E5=BA=A6=E6=9D=A1=E6=98=BE?= =?UTF-8?q?=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../process/InstagramLoadingDialog.java | 36 ++++++++++ .../process/InstagramLoadingView.java | 70 +++++++++++++++++++ .../lib/instagram/process/TrimContainer.java | 41 +++++++++-- 3 files changed, 141 insertions(+), 6 deletions(-) create mode 100644 picture_library/src/main/java/com/luck/picture/lib/instagram/process/InstagramLoadingDialog.java create mode 100644 picture_library/src/main/java/com/luck/picture/lib/instagram/process/InstagramLoadingView.java diff --git a/picture_library/src/main/java/com/luck/picture/lib/instagram/process/InstagramLoadingDialog.java b/picture_library/src/main/java/com/luck/picture/lib/instagram/process/InstagramLoadingDialog.java new file mode 100644 index 00000000..e44203d9 --- /dev/null +++ b/picture_library/src/main/java/com/luck/picture/lib/instagram/process/InstagramLoadingDialog.java @@ -0,0 +1,36 @@ +package com.luck.picture.lib.instagram.process; + + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.view.Window; + +import com.luck.picture.lib.R; + +public class InstagramLoadingDialog extends Dialog { + + private InstagramLoadingView mContentView; + + public InstagramLoadingDialog(Context context) { + super(context, R.style.Picture_Theme_AlertDialog); + setCancelable(true); + setCanceledOnTouchOutside(false); + Window window = getWindow(); + window.setWindowAnimations(R.style.PictureThemeDialogWindowStyle); + } + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + mContentView = new InstagramLoadingView(getContext()); + setContentView(mContentView); + } + + public void updateProgress(double progress) { + if (mContentView != null) { + mContentView.updateProgress(progress); + } + } +} \ No newline at end of file diff --git a/picture_library/src/main/java/com/luck/picture/lib/instagram/process/InstagramLoadingView.java b/picture_library/src/main/java/com/luck/picture/lib/instagram/process/InstagramLoadingView.java new file mode 100644 index 00000000..39024f95 --- /dev/null +++ b/picture_library/src/main/java/com/luck/picture/lib/instagram/process/InstagramLoadingView.java @@ -0,0 +1,70 @@ +package com.luck.picture.lib.instagram.process; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.RectF; +import android.view.View; + +import com.luck.picture.lib.R; +import com.luck.picture.lib.tools.ScreenUtils; + +import androidx.core.content.ContextCompat; + +/** + * ================================================ + * Created by JessYan on 2020/7/30 10:35 + * Contact me + * Follow me + * ================================================ + */ +public class InstagramLoadingView extends View { + private Paint mPaint; + private RectF mBackRect; + private int mHeight; + private int mWidth; + private final int mProgressWidth; + private final RectF mProgressRect; + private float mProgress; + + public InstagramLoadingView(Context context) { + super(context); + mWidth = ScreenUtils.dip2px(getContext(), 45); + mHeight = ScreenUtils.dip2px(getContext(), 45); + mProgressWidth = ScreenUtils.dip2px(getContext(), 25); + mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + + mBackRect = new RectF(0, 0, mWidth, mHeight); + + float progressLeft = (mWidth - mProgressWidth) / 2F; + float progressTop = (mHeight - mProgressWidth) / 2F; + mProgressRect = new RectF(progressLeft, progressTop, progressLeft + mProgressWidth, progressTop + mProgressWidth); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + setMeasuredDimension(mWidth, mHeight); + } + + public void updateProgress(double progress) { + mProgress = Math.round(360 * progress); + invalidate(); + } + + @Override + protected void onDraw(Canvas canvas) { + mPaint.setStyle(Paint.Style.FILL); + mPaint.setColor(ContextCompat.getColor(getContext(), R.color.picture_color_a83)); + canvas.drawRoundRect(mBackRect, ScreenUtils.dip2px(getContext(), 5), ScreenUtils.dip2px(getContext(), 5), mPaint); + + mPaint.setStyle(Paint.Style.STROKE); + mPaint.setStrokeWidth(ScreenUtils.dip2px(getContext(), 2)); + mPaint.setColor(0xFF444444); + canvas.drawCircle(getMeasuredWidth() / 2F, getMeasuredHeight() / 2F, mProgressWidth / 2F, mPaint); + + + mPaint.setColor(Color.WHITE); + canvas.drawArc(mProgressRect, -90, mProgress, false, mPaint); + } +} diff --git a/picture_library/src/main/java/com/luck/picture/lib/instagram/process/TrimContainer.java b/picture_library/src/main/java/com/luck/picture/lib/instagram/process/TrimContainer.java index 949d6d34..45af85a0 100644 --- a/picture_library/src/main/java/com/luck/picture/lib/instagram/process/TrimContainer.java +++ b/picture_library/src/main/java/com/luck/picture/lib/instagram/process/TrimContainer.java @@ -58,6 +58,7 @@ import java.util.ArrayList; import java.util.List; import java.util.concurrent.CountDownLatch; +import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import androidx.annotation.NonNull; @@ -92,6 +93,8 @@ public class TrimContainer extends FrameLayout { private LinearInterpolator mInterpolator; private boolean isRangeChange = true; private boolean mIsPreviewStart = true; + private InstagramLoadingDialog mLoadingDialog; + private Future mTranscodeFuture; public TrimContainer(@NonNull Context context, PictureSelectionConfig config, LocalMedia media, VideoView videoView, VideoPauseListener videoPauseListener) { super(context); @@ -262,7 +265,7 @@ public long getEndTime() { } public void cropVideo(InstagramMediaProcessActivity activity, boolean isAspectRatio) { - activity.showLoadingView(true); + showLoadingView(true); long startTime = getStartTime(); long endTime = getEndTime(); @@ -313,10 +316,13 @@ public void cropVideo(InstagramMediaProcessActivity activity, boolean isAspectRa } else { builder.addDataSource(new ClipDataSource(new FilePathDataSource(mMedia.getPath()), startTimeUS, endTimeUS)); } - builder.setListener(new TranscoderListener() { + mTranscodeFuture = builder.setListener(new TranscoderListener() { @Override public void onTranscodeProgress(double progress) { - + if (mLoadingDialog != null + && mLoadingDialog.isShowing()) { + mLoadingDialog.updateProgress(progress); + } } @Override @@ -332,25 +338,48 @@ public void onTranscodeCompleted(int successCode) { } else if (successCode == Transcoder.SUCCESS_NOT_NEEDED) { } - activity.showLoadingView(false); + showLoadingView(false); } @Override public void onTranscodeCanceled() { - activity.showLoadingView(false); + showLoadingView(false); } @Override public void onTranscodeFailed(@NonNull Throwable exception) { exception.printStackTrace(); ToastUtils.s(getContext(), getContext().getString(R.string.video_clip_failed)); - activity.showLoadingView(false); + showLoadingView(false); } }) .setVideoTrackStrategy(videoStrategy) .transcode(); } + private void showLoadingView(boolean isShow) { + if (isShow) { + if (mLoadingDialog == null) { + mLoadingDialog = new InstagramLoadingDialog(getContext()); + mLoadingDialog.setOnCancelListener(dialog -> { + if (mTranscodeFuture != null) { + mTranscodeFuture.cancel(true); + } + }); + } + if (mLoadingDialog.isShowing()) { + mLoadingDialog.dismiss(); + } + mLoadingDialog.updateProgress(0); + mLoadingDialog.show(); + } else { + if (mLoadingDialog != null + && mLoadingDialog.isShowing()) { + mLoadingDialog.dismiss(); + } + } + } + public void trimVideo(InstagramMediaProcessActivity activity, CountDownLatch count) { activity.showLoadingView(true);