diff --git a/app/src/main/java/com/github/tvbox/osc/player/controller/VodController.java b/app/src/main/java/com/github/tvbox/osc/player/controller/VodController.java index 2c1ca73f..d2bc54dc 100644 --- a/app/src/main/java/com/github/tvbox/osc/player/controller/VodController.java +++ b/app/src/main/java/com/github/tvbox/osc/player/controller/VodController.java @@ -23,8 +23,10 @@ import com.github.tvbox.osc.subtitle.widget.SimpleSubtitleView; import com.github.tvbox.osc.ui.adapter.ParseAdapter; import com.github.tvbox.osc.ui.adapter.SelectDialogAdapter; import com.github.tvbox.osc.ui.dialog.SelectDialog; +import com.github.tvbox.osc.util.FastClickCheckUtil; import com.github.tvbox.osc.util.HawkConfig; import com.github.tvbox.osc.util.PlayerHelper; +import com.github.tvbox.osc.util.SubtitleHelper; import com.orhanobut.hawk.Hawk; import com.owen.tvrecyclerview.widget.TvRecyclerView; import com.owen.tvrecyclerview.widget.V7LinearLayoutManager; @@ -181,6 +183,9 @@ public class VodController extends BaseController { mSubtitleView = findViewById(R.id.subtitle_view); mZimuBtn = findViewById(R.id.zimu_select); + int subtitleTextSize = SubtitleHelper.getTextSize(mActivity); + mSubtitleView.setTextSize(subtitleTextSize); + myHandle=new Handler(); myRunnable = new Runnable() { @Override @@ -334,6 +339,7 @@ public class VodController extends BaseController { public void onClick(View view) { // myHandle.removeCallbacks(myRunnable); // myHandle.postDelayed(myRunnable, myHandleSeconds); + FastClickCheckUtil.check(view); try { int playerType = mPlayerConfig.getInt("pl"); int defaultPos = 0; @@ -518,6 +524,7 @@ public class VodController extends BaseController { mZimuBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { + FastClickCheckUtil.check(view); listener.selectSubtitle(); hideBottom(); } diff --git a/app/src/main/java/com/github/tvbox/osc/subtitle/DefaultSubtitleEngine.java b/app/src/main/java/com/github/tvbox/osc/subtitle/DefaultSubtitleEngine.java index b27f7f5c..79450642 100644 --- a/app/src/main/java/com/github/tvbox/osc/subtitle/DefaultSubtitleEngine.java +++ b/app/src/main/java/com/github/tvbox/osc/subtitle/DefaultSubtitleEngine.java @@ -34,7 +34,9 @@ import android.util.Log; import com.github.tvbox.osc.subtitle.cache.SubtitleCache; import com.github.tvbox.osc.subtitle.model.Subtitle; +import com.github.tvbox.osc.subtitle.model.Time; import com.github.tvbox.osc.subtitle.model.TimedTextObject; +import com.github.tvbox.osc.util.SubtitleHelper; import java.util.ArrayList; import java.util.List; @@ -84,6 +86,7 @@ public class DefaultSubtitleEngine implements SubtitleEngine { mSubtitles = mCache.get(path); if (mSubtitles != null && !mSubtitles.isEmpty()) { Log.d(TAG, "from cache."); + setSubtitleDelay(SubtitleHelper.getTimeDelay()); notifyPrepared(); return; } @@ -100,6 +103,7 @@ public class DefaultSubtitleEngine implements SubtitleEngine { return; } mSubtitles = new ArrayList<>(captions.values()); + setSubtitleDelay(SubtitleHelper.getTimeDelay()); notifyPrepared(); mCache.put(path, new ArrayList<>(captions.values())); } @@ -111,6 +115,34 @@ public class DefaultSubtitleEngine implements SubtitleEngine { }); } + @Override + public void setSubtitleDelay(Integer milliseconds) { + if (milliseconds == 0) { + return; + } + if (mSubtitles == null || mSubtitles.size() == 0) { + return; + } + List thisSubtitles = mSubtitles; + mSubtitles = null; + for (int i = 0; i < thisSubtitles.size(); i++) { + Subtitle subtitle = thisSubtitles.get(i); + Time start = subtitle.start; + Time end = subtitle.end; + start.mseconds += milliseconds; + end.mseconds += milliseconds; + if (start.mseconds <= 0) { + start.mseconds = 0; + } + if (end.mseconds <= 0) { + end.mseconds = 0; + } + subtitle.start = start; + subtitle.end = end; + } + mSubtitles = thisSubtitles; + } + @Override public void reset() { stop(); diff --git a/app/src/main/java/com/github/tvbox/osc/subtitle/SubtitleEngine.java b/app/src/main/java/com/github/tvbox/osc/subtitle/SubtitleEngine.java index e2fabe88..09de9351 100644 --- a/app/src/main/java/com/github/tvbox/osc/subtitle/SubtitleEngine.java +++ b/app/src/main/java/com/github/tvbox/osc/subtitle/SubtitleEngine.java @@ -46,6 +46,12 @@ public interface SubtitleEngine { */ void setSubtitlePath(String path); + /** + * 字幕延时 + * @param milliseconds + */ + void setSubtitleDelay(Integer milliseconds); + /** * 开启字幕刷新任务 */ diff --git a/app/src/main/java/com/github/tvbox/osc/subtitle/widget/SimpleSubtitleView.java b/app/src/main/java/com/github/tvbox/osc/subtitle/widget/SimpleSubtitleView.java index 837be08d..0452233d 100644 --- a/app/src/main/java/com/github/tvbox/osc/subtitle/widget/SimpleSubtitleView.java +++ b/app/src/main/java/com/github/tvbox/osc/subtitle/widget/SimpleSubtitleView.java @@ -94,6 +94,11 @@ public class SimpleSubtitleView extends TextView mSubtitleEngine.setSubtitlePath(path); } + @Override + public void setSubtitleDelay(Integer mseconds) { + mSubtitleEngine.setSubtitleDelay(mseconds); + } + @Override public void reset() { mSubtitleEngine.reset(); diff --git a/app/src/main/java/com/github/tvbox/osc/ui/activity/PlayActivity.java b/app/src/main/java/com/github/tvbox/osc/ui/activity/PlayActivity.java index 9b853a33..ca4efd3e 100644 --- a/app/src/main/java/com/github/tvbox/osc/ui/activity/PlayActivity.java +++ b/app/src/main/java/com/github/tvbox/osc/ui/activity/PlayActivity.java @@ -194,6 +194,16 @@ public class PlayActivity extends BaseActivity { @Override public void selectSubtitle() { SubtitleDialog subtitleDialog = new SubtitleDialog(PlayActivity.this); + subtitleDialog.setSubtitleViewListener(new SubtitleDialog.SubtitleViewListener() { + @Override + public void setTextSize(int size) { + mController.mSubtitleView.setTextSize(size); + } + @Override + public void setSubtitleDelay(int milliseconds) { + mController.mSubtitleView.setSubtitleDelay(milliseconds); + } + }); subtitleDialog.setSearchSubtitleListener(new SubtitleDialog.SearchSubtitleListener() { @Override public void openSearchSubtitleDialog() { diff --git a/app/src/main/java/com/github/tvbox/osc/ui/dialog/SubtitleDialog.java b/app/src/main/java/com/github/tvbox/osc/ui/dialog/SubtitleDialog.java index d1012a9f..719a7f5f 100644 --- a/app/src/main/java/com/github/tvbox/osc/ui/dialog/SubtitleDialog.java +++ b/app/src/main/java/com/github/tvbox/osc/ui/dialog/SubtitleDialog.java @@ -1,5 +1,6 @@ package com.github.tvbox.osc.ui.dialog; +import android.app.Activity; import android.content.Context; import android.view.View; import android.widget.TextView; @@ -8,6 +9,7 @@ import androidx.annotation.NonNull; import com.github.tvbox.osc.R; import com.github.tvbox.osc.util.FastClickCheckUtil; +import com.github.tvbox.osc.util.SubtitleHelper; import org.jetbrains.annotations.NotNull; @@ -15,21 +17,35 @@ public class SubtitleDialog extends BaseDialog { private TextView selectLocal; private TextView selectRemote; + private TextView subtitleSizeMinus; + private TextView subtitleSizeText; + private TextView subtitleSizePlus; + private TextView subtitleTimeMinus; + private TextView subtitleTimeText; + private TextView subtitleTimePlus; private SearchSubtitleListener mSearchSubtitleListener; private LocalFileChooserListener mLocalFileChooserListener; + private SubtitleViewListener mSubtitleViewListener; public SubtitleDialog(@NonNull @NotNull Context context) { - super(context, R.style.CustomDialogStyleDim); - setCanceledOnTouchOutside(false); - setCancelable(true); + super(context); + if (context instanceof Activity) { + setOwnerActivity((Activity) context); + } setContentView(R.layout.dialog_subtitle); - init(context); + initView(context); } - private void init(Context context) { + private void initView(Context context) { selectLocal = findViewById(R.id.selectLocal); selectRemote = findViewById(R.id.selectRemote); + subtitleSizeMinus = findViewById(R.id.subtitleSizeMinus); + subtitleSizeText = findViewById(R.id.subtitleSizeText); + subtitleSizePlus = findViewById(R.id.subtitleSizePlus); + subtitleTimeMinus = findViewById(R.id.subtitleTimeMinus); + subtitleTimeText = findViewById(R.id.subtitleTimeText); + subtitleTimePlus = findViewById(R.id.subtitleTimePlus); selectLocal.setOnClickListener(new View.OnClickListener() { @Override @@ -48,6 +64,85 @@ public class SubtitleDialog extends BaseDialog { mSearchSubtitleListener.openSearchSubtitleDialog(); } }); + + int size = SubtitleHelper.getTextSize(getOwnerActivity()); + subtitleSizeText.setText(Integer.toString(size)); + + subtitleSizeMinus.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + String sizeStr = subtitleSizeText.getText().toString(); + int curSize = Integer.parseInt(sizeStr); + curSize -= 2; + if (curSize <= 12) { + curSize = 12; + } + subtitleSizeText.setText(Integer.toString(curSize)); + SubtitleHelper.setTextSize(curSize); + mSubtitleViewListener.setTextSize(curSize); + } + }); + subtitleSizePlus.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + String sizeStr = subtitleSizeText.getText().toString(); + int curSize = Integer.parseInt(sizeStr); + curSize += 2; + if (curSize >= 60) { + curSize = 60; + } + subtitleSizeText.setText(Integer.toString(curSize)); + SubtitleHelper.setTextSize(curSize); + mSubtitleViewListener.setTextSize(curSize); + } + }); + + int timeDelay = SubtitleHelper.getTimeDelay(); + String timeStr = "0"; + if (timeDelay != 0) { + double dbTimeDelay = timeDelay/1000; + timeStr = Double.toString(dbTimeDelay); + } + subtitleTimeText.setText(timeStr); + + subtitleTimeMinus.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + FastClickCheckUtil.check(view); + String timeStr = subtitleTimeText.getText().toString(); + double time = Float.parseFloat(timeStr); + double oneceDelay = -0.5; + time += oneceDelay; + if (time == 0.0) { + timeStr = "0"; + } else { + timeStr = Double.toString(time); + } + subtitleTimeText.setText(timeStr); + int mseconds = (int)(oneceDelay*1000); + SubtitleHelper.setTimeDelay((int)(time*1000)); + mSubtitleViewListener.setSubtitleDelay(mseconds); + } + }); + subtitleTimePlus.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + FastClickCheckUtil.check(view); + String timeStr = subtitleTimeText.getText().toString(); + double time = Float.parseFloat(timeStr); + double oneceDelay = 0.5; + time += oneceDelay; + if (time == 0.0) { + timeStr = "0"; + } else { + timeStr = Double.toString(time); + } + subtitleTimeText.setText(timeStr); + int mseconds = (int)(oneceDelay*1000); + SubtitleHelper.setTimeDelay((int)(time*1000)); + mSubtitleViewListener.setSubtitleDelay(mseconds); + } + }); } public void setLocalFileChooserListener(LocalFileChooserListener localFileChooserListener) { @@ -65,4 +160,13 @@ public class SubtitleDialog extends BaseDialog { public interface SearchSubtitleListener { void openSearchSubtitleDialog(); } + + public void setSubtitleViewListener(SubtitleViewListener subtitleViewListener) { + mSubtitleViewListener = subtitleViewListener; + } + + public interface SubtitleViewListener { + void setTextSize(int size); + void setSubtitleDelay(int milliseconds); + } } diff --git a/app/src/main/java/com/github/tvbox/osc/ui/fragment/PlayFragment.java b/app/src/main/java/com/github/tvbox/osc/ui/fragment/PlayFragment.java index 2b12950b..10855411 100644 --- a/app/src/main/java/com/github/tvbox/osc/ui/fragment/PlayFragment.java +++ b/app/src/main/java/com/github/tvbox/osc/ui/fragment/PlayFragment.java @@ -192,7 +192,17 @@ public class PlayFragment extends BaseLazyFragment { @Override public void selectSubtitle() { - SubtitleDialog subtitleDialog = new SubtitleDialog(getContext()); + SubtitleDialog subtitleDialog = new SubtitleDialog(getActivity()); + subtitleDialog.setSubtitleViewListener(new SubtitleDialog.SubtitleViewListener() { + @Override + public void setTextSize(int size) { + mController.mSubtitleView.setTextSize(size); + } + @Override + public void setSubtitleDelay(int milliseconds) { + mController.mSubtitleView.setSubtitleDelay(milliseconds); + } + }); subtitleDialog.setSearchSubtitleListener(new SubtitleDialog.SearchSubtitleListener() { @Override public void openSearchSubtitleDialog() { diff --git a/app/src/main/java/com/github/tvbox/osc/util/HawkConfig.java b/app/src/main/java/com/github/tvbox/osc/util/HawkConfig.java index 10a93c8e..f44584b9 100644 --- a/app/src/main/java/com/github/tvbox/osc/util/HawkConfig.java +++ b/app/src/main/java/com/github/tvbox/osc/util/HawkConfig.java @@ -31,4 +31,6 @@ public class HawkConfig { public static final String LIVE_SHOW_NET_SPEED = "live_show_net_speed"; public static final String LIVE_SHOW_TIME = "live_show_time"; public static final String FAST_SEARCH_MODE = "fast_search_mode"; + public static final String SUBTITLE_TEXT_SIZE = "subtitle_text_size"; + public static final String SUBTITLE_TIME_DELAY = "subtitle_time_delay"; } \ No newline at end of file diff --git a/app/src/main/java/com/github/tvbox/osc/util/ScreenUtils.java b/app/src/main/java/com/github/tvbox/osc/util/ScreenUtils.java new file mode 100644 index 00000000..b8be2dca --- /dev/null +++ b/app/src/main/java/com/github/tvbox/osc/util/ScreenUtils.java @@ -0,0 +1,19 @@ +package com.github.tvbox.osc.util; + +import android.app.Activity; +import android.util.DisplayMetrics; +import android.view.WindowManager; + +public class ScreenUtils { + + public static double getSqrt(Activity activity) { + WindowManager wm = activity.getWindowManager(); + DisplayMetrics dm = new DisplayMetrics(); + wm.getDefaultDisplay().getMetrics(dm); + double x = Math.pow(dm.widthPixels / dm.xdpi, 2); + double y = Math.pow(dm.heightPixels / dm.ydpi, 2); + double screenInches = Math.sqrt(x + y);// 屏幕尺寸 + return screenInches; + } + +} diff --git a/app/src/main/java/com/github/tvbox/osc/util/SubtitleHelper.java b/app/src/main/java/com/github/tvbox/osc/util/SubtitleHelper.java new file mode 100644 index 00000000..0296194e --- /dev/null +++ b/app/src/main/java/com/github/tvbox/osc/util/SubtitleHelper.java @@ -0,0 +1,41 @@ +package com.github.tvbox.osc.util; + +import android.app.Activity; + +import com.orhanobut.hawk.Hawk; + +public class SubtitleHelper { + + public static int getSubtitleTextAutoSize(Activity activity) { + double screenSqrt = ScreenUtils.getSqrt(activity); + int subtitleTextSize = 16; + if (screenSqrt > 7.0 && screenSqrt <= 13.0) { + subtitleTextSize = 24; + } else if (screenSqrt > 13.0 && screenSqrt <= 50.0) { + subtitleTextSize = 36; + } else if (screenSqrt > 50.0) { + subtitleTextSize = 46; + } + return subtitleTextSize; + } + + public static int getTextSize(Activity activity) { + int autoSize = getSubtitleTextAutoSize(activity); + int subtitleConfigSize = Hawk.get(HawkConfig.SUBTITLE_TEXT_SIZE, autoSize); + return subtitleConfigSize; + } + + public static void setTextSize(int size) { + Hawk.put(HawkConfig.SUBTITLE_TEXT_SIZE, size); + } + + public static int getTimeDelay() { + int subtitleConfigTimeDelay = Hawk.get(HawkConfig.SUBTITLE_TIME_DELAY, 0); + return subtitleConfigTimeDelay; + } + + public static void setTimeDelay(int delay) { + Hawk.put(HawkConfig.SUBTITLE_TIME_DELAY, delay); + } + +} diff --git a/app/src/main/res/layout/dialog_subtitle.xml b/app/src/main/res/layout/dialog_subtitle.xml index eaec0e7f..380727cd 100644 --- a/app/src/main/res/layout/dialog_subtitle.xml +++ b/app/src/main/res/layout/dialog_subtitle.xml @@ -31,7 +31,7 @@ android:padding="@dimen/vs_10" android:text="选择本地字幕" android:textColor="@color/color_FFFFFF" - android:textSize="@dimen/ts_22" /> + android:textSize="@dimen/ts_24" /> + android:textSize="@dimen/ts_24" /> + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/player_vod_control_view.xml b/app/src/main/res/layout/player_vod_control_view.xml index 9511d6b6..d9c6c57b 100644 --- a/app/src/main/res/layout/player_vod_control_view.xml +++ b/app/src/main/res/layout/player_vod_control_view.xml @@ -29,7 +29,7 @@ android:paddingLeft="@dimen/vs_20" android:text="http://" android:textColor="@android:color/white" - android:textSize="@dimen/ts_22" /> + android:textSize="@dimen/ts_24" /> + android:textSize="@dimen/ts_24" /> @@ -71,7 +71,7 @@ android:tag="vod_control_pause_time" android:text="00:00:00" android:textColor="@android:color/white" - android:textSize="@dimen/ts_22" /> + android:textSize="@dimen/ts_24" /> + android:textSize="@dimen/ts_24" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + android:layout_marginBottom="@dimen/vs_10" + android:orientation="horizontal"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + android:textSize="@dimen/ts_24" /> + android:textSize="@dimen/ts_24" /> + android:textSize="@dimen/ts_24" /> @@ -415,7 +445,7 @@ android:paddingLeft="@dimen/vs_20" android:text="http://" android:textColor="@android:color/white" - android:textSize="@dimen/ts_22" /> + android:textSize="@dimen/ts_24" /> + android:textSize="@dimen/ts_24" /> diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index d90851f2..420472fc 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -30,6 +30,7 @@ 4mm 5mm 6mm + 7mm 8mm 10mm 12mm