diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingPlayerActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingPlayerActivity.java index 30961ad8c..d9461e70e 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingPlayerActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingPlayerActivity.java @@ -11,6 +11,7 @@ import com.fongmi.android.tv.R; import com.fongmi.android.tv.Setting; import com.fongmi.android.tv.databinding.ActivitySettingPlayerBinding; import com.fongmi.android.tv.impl.BufferCallback; +import com.fongmi.android.tv.impl.DanmuAlphaCallback; import com.fongmi.android.tv.impl.DanmuLineCallback; import com.fongmi.android.tv.impl.DanmuSizeCallback; import com.fongmi.android.tv.impl.SubtitleCallback; @@ -19,13 +20,14 @@ import com.fongmi.android.tv.player.ExoUtil; import com.fongmi.android.tv.player.Players; import com.fongmi.android.tv.ui.base.BaseActivity; import com.fongmi.android.tv.ui.dialog.BufferDialog; +import com.fongmi.android.tv.ui.dialog.DanmuAlphaDialog; import com.fongmi.android.tv.ui.dialog.DanmuLineDialog; import com.fongmi.android.tv.ui.dialog.DanmuSizeDialog; import com.fongmi.android.tv.ui.dialog.SubtitleDialog; import com.fongmi.android.tv.ui.dialog.UaDialog; import com.fongmi.android.tv.utils.ResUtil; -public class SettingPlayerActivity extends BaseActivity implements UaCallback, BufferCallback, SubtitleCallback, DanmuLineCallback, DanmuSizeCallback { +public class SettingPlayerActivity extends BaseActivity implements UaCallback, BufferCallback, SubtitleCallback, DanmuLineCallback, DanmuSizeCallback, DanmuAlphaCallback { private ActivitySettingPlayerBinding mBinding; private String[] danmuSpeed; @@ -60,6 +62,7 @@ public class SettingPlayerActivity extends BaseActivity implements UaCallback, B mBinding.subtitleText.setText(String.valueOf(Setting.getSubtitle())); mBinding.danmuSizeText.setText(String.valueOf(Setting.getDanmuSize())); mBinding.danmuLineText.setText(String.valueOf(Setting.getDanmuLine(3))); + mBinding.danmuAlphaText.setText(String.valueOf(Setting.getDanmuAlpha())); mBinding.flagText.setText((flag = ResUtil.getStringArray(R.array.select_flag))[Setting.getFlag()]); mBinding.httpText.setText((http = ResUtil.getStringArray(R.array.select_exo_http))[Setting.getHttp()]); mBinding.scaleText.setText((scale = ResUtil.getStringArray(R.array.select_scale))[Setting.getScale()]); @@ -86,6 +89,7 @@ public class SettingPlayerActivity extends BaseActivity implements UaCallback, B mBinding.caption.setOnLongClickListener(this::onCaption); mBinding.danmuSize.setOnClickListener(this::onDanmuSize); mBinding.danmuLine.setOnClickListener(this::onDanmuLine); + mBinding.danmuAlpha.setOnClickListener(this::onDanmuAlpha); mBinding.danmuSpeed.setOnClickListener(this::setDanmuSpeed); } @@ -203,4 +207,15 @@ public class SettingPlayerActivity extends BaseActivity implements UaCallback, B Setting.putDanmuSpeed(index = index == danmuSpeed.length - 1 ? 0 : ++index); mBinding.danmuSpeedText.setText(danmuSpeed[index]); } + + public void onDanmuAlpha(View view) { + DanmuAlphaDialog.create(this).show(); + } + + @Override + public void setDanmuAlpha(int alpha) { + mBinding.danmuAlphaText.setText(String.valueOf(alpha)); + Setting.putDanmuAlpha(alpha); + } + } diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java index 8eb745fdf..5d07a3fb7 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java @@ -415,6 +415,7 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List private void setDanmuView() { int maxLine = Setting.getDanmuLine(3); + float alpha = ((float) Setting.getDanmuAlpha()) / 100.0f; mPlayers.setDanmuView(mBinding.danmaku); HashMap maxLines = new HashMap<>(); float scrollSpeedFactor = 1.6f - (Setting.getDanmuSpeed() * 0.2f); @@ -423,7 +424,7 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List maxLines.put(BaseDanmaku.TYPE_SCROLL_RL, maxLine); maxLines.put(BaseDanmaku.TYPE_SCROLL_LR, maxLine); maxLines.put(BaseDanmaku.TYPE_FIX_BOTTOM, maxLine); - mDanmakuContext.setDanmakuStyle(IDisplayer.DANMAKU_STYLE_STROKEN, 3).setMaximumLines(maxLines).setScrollSpeedFactor(scrollSpeedFactor).setDanmakuMargin(12).setScaleTextSize(0.8f); + mDanmakuContext.setDanmakuStyle(IDisplayer.DANMAKU_STYLE_STROKEN, 3).setMaximumLines(maxLines).setScrollSpeedFactor(scrollSpeedFactor).setDanmakuTransparency(alpha).setDanmakuMargin(12).setScaleTextSize(0.8f); mBinding.control.danmu.setActivated(Setting.isDanmu()); } diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/dialog/DanmuAlphaDialog.java b/app/src/leanback/java/com/fongmi/android/tv/ui/dialog/DanmuAlphaDialog.java new file mode 100644 index 000000000..3441f14ee --- /dev/null +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/dialog/DanmuAlphaDialog.java @@ -0,0 +1,53 @@ +package com.fongmi.android.tv.ui.dialog; + +import android.view.LayoutInflater; + +import androidx.appcompat.app.AlertDialog; +import androidx.fragment.app.FragmentActivity; + +import com.fongmi.android.tv.Setting; +import com.fongmi.android.tv.databinding.DialogDanmuAlphaBinding; +import com.fongmi.android.tv.impl.DanmuAlphaCallback; +import com.fongmi.android.tv.utils.KeyUtil; +import com.google.android.material.dialog.MaterialAlertDialogBuilder; + +public class DanmuAlphaDialog { + + private final DialogDanmuAlphaBinding binding; + private final DanmuAlphaCallback callback; + private final AlertDialog dialog; + + public static DanmuAlphaDialog create(FragmentActivity activity) { + return new DanmuAlphaDialog(activity); + } + + public DanmuAlphaDialog(FragmentActivity activity) { + this.callback = (DanmuAlphaCallback) activity; + this.binding = DialogDanmuAlphaBinding.inflate(LayoutInflater.from(activity)); + this.dialog = new MaterialAlertDialogBuilder(activity).setView(binding.getRoot()).create(); + } + + public void show() { + initDialog(); + initView(); + initEvent(); + } + + private void initDialog() { + dialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent); + dialog.show(); + } + + private void initView() { + binding.slider.setValue(Setting.getDanmuAlpha()); + } + + private void initEvent() { + binding.slider.addOnChangeListener((slider, value, fromUser) -> callback.setDanmuAlpha((int) value)); + binding.slider.setOnKeyListener((view, keyCode, event) -> { + boolean enter = KeyUtil.isEnterKey(event); + if (enter) dialog.dismiss(); + return enter; + }); + } +} diff --git a/app/src/leanback/res/layout/activity_setting_player.xml b/app/src/leanback/res/layout/activity_setting_player.xml index 60af0a1a9..c88f12b12 100644 --- a/app/src/leanback/res/layout/activity_setting_player.xml +++ b/app/src/leanback/res/layout/activity_setting_player.xml @@ -262,6 +262,44 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/leanback/res/layout/dialog_danmu_size.xml b/app/src/leanback/res/layout/dialog_danmu_size.xml index a214a1de9..b75150c73 100644 --- a/app/src/leanback/res/layout/dialog_danmu_size.xml +++ b/app/src/leanback/res/layout/dialog_danmu_size.xml @@ -10,7 +10,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:stepSize="0.2" - android:valueFrom="1" + android:valueFrom="0.6" android:valueTo="2" app:thumbColor="@color/blue_500" app:trackColorActive="@color/blue_500" diff --git a/app/src/main/java/com/fongmi/android/tv/Setting.java b/app/src/main/java/com/fongmi/android/tv/Setting.java index 7ec60b619..546dac0fc 100644 --- a/app/src/main/java/com/fongmi/android/tv/Setting.java +++ b/app/src/main/java/com/fongmi/android/tv/Setting.java @@ -258,7 +258,7 @@ public class Setting { } public static float getDanmuSize() { - return Math.min(Math.max(Prefers.getFloat("danmu_size"), 1.0f), 2.0f); + return Math.min(Math.max(Prefers.getFloat("danmu_size", 1.0f), 0.5f), 2.0f); } public static void putDanmuSize(float size) { @@ -266,7 +266,15 @@ public class Setting { } public static int getDanmuLine(int line) { - return Math.min(Math.max(Prefers.getInt("danmu_line"), line), 15); + return Math.min(Math.max(Prefers.getInt("danmu_line", line), 1), 15); + } + + public static void putDanmuAlpha(int alpha) { + Prefers.put("danmu_alpha", alpha); + } + + public static int getDanmuAlpha() { + return Math.min(Math.max(Prefers.getInt("danmu_alpha", 90), 10), 100); } public static void putDanmuLine(int line) { diff --git a/app/src/main/java/com/fongmi/android/tv/impl/DanmuAlphaCallback.java b/app/src/main/java/com/fongmi/android/tv/impl/DanmuAlphaCallback.java new file mode 100644 index 000000000..a342b93fc --- /dev/null +++ b/app/src/main/java/com/fongmi/android/tv/impl/DanmuAlphaCallback.java @@ -0,0 +1,6 @@ +package com.fongmi.android.tv.impl; + +public interface DanmuAlphaCallback { + + void setDanmuAlpha(int alpha); +} diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index bc6120b0f..17651cf41 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -87,6 +87,7 @@ 弹幕速度 弹幕大小 弹幕行数 + 弹幕透明 后台播放 线路播放 选集样式 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 177eade14..cd3433274 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -87,6 +87,7 @@ 彈幕速度 彈幕大小 彈幕行數 + 彈幕透明 背景播放 線路播放 選集樣式 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 849c6e445..9567b70b2 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -87,6 +87,7 @@ Danmu speed Danmu size Danmu line + Danmu alpha Background play Flag play Episode style diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java index 948d4729a..e5f769874 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java @@ -413,6 +413,7 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo private void setDanmuView() { int maxLine = Setting.getDanmuLine(2); + float alpha = ((float) Setting.getDanmuAlpha()) / 100.0f; mPlayers.setDanmuView(mBinding.danmaku); HashMap maxLines = new HashMap<>(); float scrollSpeedFactor = 1.6f - (Setting.getDanmuSpeed() * 0.2f); @@ -421,7 +422,7 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo maxLines.put(BaseDanmaku.TYPE_SCROLL_RL, maxLine); maxLines.put(BaseDanmaku.TYPE_SCROLL_LR, maxLine); maxLines.put(BaseDanmaku.TYPE_FIX_BOTTOM, maxLine); - mDanmakuContext.setDanmakuStyle(IDisplayer.DANMAKU_STYLE_STROKEN, 3).setMaximumLines(maxLines).setScrollSpeedFactor(scrollSpeedFactor).setDanmakuMargin(8).setScaleTextSize(0.8f); + mDanmakuContext.setDanmakuStyle(IDisplayer.DANMAKU_STYLE_STROKEN, 3).setMaximumLines(maxLines).setScrollSpeedFactor(scrollSpeedFactor).setDanmakuTransparency(alpha).setDanmakuMargin(8).setScaleTextSize(0.8f); checkDanmuImg(); } diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/DanmuAlphaDialog.java b/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/DanmuAlphaDialog.java new file mode 100644 index 000000000..b84470bb1 --- /dev/null +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/DanmuAlphaDialog.java @@ -0,0 +1,54 @@ +package com.fongmi.android.tv.ui.dialog; + +import android.content.DialogInterface; +import android.view.LayoutInflater; + +import androidx.appcompat.app.AlertDialog; +import androidx.fragment.app.Fragment; + +import com.fongmi.android.tv.R; +import com.fongmi.android.tv.Setting; +import com.fongmi.android.tv.databinding.DialogDanmuAlphaBinding; +import com.fongmi.android.tv.impl.DanmuAlphaCallback; +import com.google.android.material.dialog.MaterialAlertDialogBuilder; + +public class DanmuAlphaDialog { + + private final DialogDanmuAlphaBinding binding; + private final DanmuAlphaCallback callback; + private int value; + + public static DanmuAlphaDialog create(Fragment fragment) { + return new DanmuAlphaDialog(fragment); + } + + public DanmuAlphaDialog(Fragment fragment) { + this.callback = (DanmuAlphaCallback) fragment; + this.binding = DialogDanmuAlphaBinding.inflate(LayoutInflater.from(fragment.getContext())); + } + + public void show() { + initDialog(); + initView(); + } + + private void initDialog() { + AlertDialog dialog = new MaterialAlertDialogBuilder(binding.getRoot().getContext()).setTitle(R.string.player_danmu_alpha).setView(binding.getRoot()).setPositiveButton(R.string.dialog_positive, this::onPositive).setNegativeButton(R.string.dialog_negative, this::onNegative).create(); + dialog.getWindow().setDimAmount(0); + dialog.show(); + } + + private void initView() { + binding.slider.setValue(value = Setting.getDanmuAlpha()); + } + + private void onPositive(DialogInterface dialog, int which) { + callback.setDanmuAlpha((int) binding.slider.getValue()); + dialog.dismiss(); + } + + private void onNegative(DialogInterface dialog, int which) { + callback.setDanmuAlpha(value); + dialog.dismiss(); + } +} diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SettingPlayerFragment.java b/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SettingPlayerFragment.java index acba0aa90..f40deedc7 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SettingPlayerFragment.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SettingPlayerFragment.java @@ -14,6 +14,7 @@ import com.fongmi.android.tv.R; import com.fongmi.android.tv.Setting; import com.fongmi.android.tv.databinding.FragmentSettingPlayerBinding; import com.fongmi.android.tv.impl.BufferCallback; +import com.fongmi.android.tv.impl.DanmuAlphaCallback; import com.fongmi.android.tv.impl.DanmuLineCallback; import com.fongmi.android.tv.impl.DanmuSizeCallback; import com.fongmi.android.tv.impl.SubtitleCallback; @@ -22,6 +23,7 @@ import com.fongmi.android.tv.player.ExoUtil; import com.fongmi.android.tv.player.Players; import com.fongmi.android.tv.ui.base.BaseFragment; import com.fongmi.android.tv.ui.dialog.BufferDialog; +import com.fongmi.android.tv.ui.dialog.DanmuAlphaDialog; import com.fongmi.android.tv.ui.dialog.DanmuLineDialog; import com.fongmi.android.tv.ui.dialog.DanmuSizeDialog; import com.fongmi.android.tv.ui.dialog.SubtitleDialog; @@ -29,7 +31,7 @@ import com.fongmi.android.tv.ui.dialog.UaDialog; import com.fongmi.android.tv.utils.ResUtil; import com.google.android.material.dialog.MaterialAlertDialogBuilder; -public class SettingPlayerFragment extends BaseFragment implements UaCallback, BufferCallback, SubtitleCallback, DanmuLineCallback, DanmuSizeCallback { +public class SettingPlayerFragment extends BaseFragment implements UaCallback, BufferCallback, SubtitleCallback, DanmuLineCallback, DanmuSizeCallback, DanmuAlphaCallback { private FragmentSettingPlayerBinding mBinding; private String[] danmuSpeed; @@ -64,6 +66,7 @@ public class SettingPlayerFragment extends BaseFragment implements UaCallback, B mBinding.subtitleText.setText(String.valueOf(Setting.getSubtitle())); mBinding.danmuSizeText.setText(String.valueOf(Setting.getDanmuSize())); mBinding.danmuLineText.setText(String.valueOf(Setting.getDanmuLine(2))); + mBinding.danmuAlphaText.setText(String.valueOf(Setting.getDanmuAlpha())); mBinding.flagText.setText((flag = ResUtil.getStringArray(R.array.select_flag))[Setting.getFlag()]); mBinding.httpText.setText((http = ResUtil.getStringArray(R.array.select_exo_http))[Setting.getHttp()]); mBinding.scaleText.setText((scale = ResUtil.getStringArray(R.array.select_scale))[Setting.getScale()]); @@ -89,6 +92,7 @@ public class SettingPlayerFragment extends BaseFragment implements UaCallback, B mBinding.caption.setOnLongClickListener(this::onCaption); mBinding.danmuSize.setOnClickListener(this::onDanmuSize); mBinding.danmuLine.setOnClickListener(this::onDanmuLine); + mBinding.danmuAlpha.setOnClickListener(this::onDanmuAlpha); mBinding.danmuSpeed.setOnClickListener(this::onDanmuSpeed); mBinding.background.setOnClickListener(this::onBackground); } @@ -206,6 +210,16 @@ public class SettingPlayerFragment extends BaseFragment implements UaCallback, B }).show(); } + public void onDanmuAlpha(View view) { + DanmuAlphaDialog.create(this).show(); + } + + @Override + public void setDanmuAlpha(int alpha) { + mBinding.danmuAlphaText.setText(String.valueOf(alpha)); + Setting.putDanmuAlpha(alpha); + } + private void onBackground(View view) { new MaterialAlertDialogBuilder(getActivity()).setTitle(R.string.player_background).setNegativeButton(R.string.dialog_negative, null).setSingleChoiceItems(background, Setting.getBackground(), (dialog, which) -> { mBinding.backgroundText.setText(background[which]); diff --git a/app/src/mobile/res/layout/dialog_danmu_alpha.xml b/app/src/mobile/res/layout/dialog_danmu_alpha.xml new file mode 100644 index 000000000..7d86652c9 --- /dev/null +++ b/app/src/mobile/res/layout/dialog_danmu_alpha.xml @@ -0,0 +1,20 @@ + + + + + + \ No newline at end of file diff --git a/app/src/mobile/res/layout/dialog_danmu_size.xml b/app/src/mobile/res/layout/dialog_danmu_size.xml index bfb7ca58c..f4eb98aaa 100644 --- a/app/src/mobile/res/layout/dialog_danmu_size.xml +++ b/app/src/mobile/res/layout/dialog_danmu_size.xml @@ -13,7 +13,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:stepSize="0.2" - android:valueFrom="1" + android:valueFrom="0.6" android:valueTo="2" app:trackColorInactive="@color/blue_50" /> diff --git a/app/src/mobile/res/layout/fragment_setting_player.xml b/app/src/mobile/res/layout/fragment_setting_player.xml index afa0873f8..ccd3802e7 100644 --- a/app/src/mobile/res/layout/fragment_setting_player.xml +++ b/app/src/mobile/res/layout/fragment_setting_player.xml @@ -282,6 +282,42 @@ + + + + + + + + + +