From f50ba18fb6aec7bb0d12a619c1319cd69d22f973 Mon Sep 17 00:00:00 2001 From: FongMi Date: Thu, 21 May 2026 02:14:59 +0800 Subject: [PATCH] Optimize offset dialog --- app/src/leanback/res/layout/dialog_offset.xml | 9 ++- .../tv/ui/dialog/BaseSideSheetDialog.java | 5 +- .../tv/ui/dialog/DanmakuSettingDialog.java | 10 +++- .../android/tv/ui/dialog/OffsetDialog.java | 10 +++- .../android/tv/ui/dialog/OffsetPanel.java | 57 ++++++++++--------- app/src/mobile/res/layout/dialog_offset.xml | 9 ++- 6 files changed, 61 insertions(+), 39 deletions(-) diff --git a/app/src/leanback/res/layout/dialog_offset.xml b/app/src/leanback/res/layout/dialog_offset.xml index 9fb47d21b..998ee07d8 100644 --- a/app/src/leanback/res/layout/dialog_offset.xml +++ b/app/src/leanback/res/layout/dialog_offset.xml @@ -1,6 +1,7 @@ @@ -39,7 +40,9 @@ android:id="@+id/audioSection" android:layout_width="match_parent" android:layout_height="wrap_content" - android:orientation="vertical"> + android:orientation="vertical" + android:visibility="gone" + tools:visibility="visible"> + android:orientation="vertical" + android:visibility="gone" + tools:visibility="visible"> String.format(Locale.getDefault(), "%+.1fs", v / 1000f)); - binding.textSlider.setLabelFormatter(v -> String.format(Locale.getDefault(), "%+.1fs", v / 1000f)); - binding.audioSlider.setValue(clamp(player.getAudioOffsetMs())); - binding.textSlider.setValue(clamp(player.getTextOffsetMs())); - setAudioValue(binding.audioSlider.getValue()); - setTextValue(binding.textSlider.getValue()); - binding.audioSlider.addOnChangeListener((slider, value, fromUser) -> onAudioChange(value)); - binding.textSlider.addOnChangeListener((slider, value, fromUser) -> onTextChange(value)); + setupOffset(binding.audioSlider, binding.audioValue, player.getAudioOffsetMs(), player::setAudioOffsetMs); + setupOffset(binding.textSlider, binding.textValue, player.getTextOffsetMs(), player::setTextOffsetMs); binding.reset.setOnClickListener(this::onReset); + getSection().setVisibility(View.VISIBLE); + getSlider().requestFocus(); } - private void onReset(View view) { - if (type == C.TRACK_TYPE_AUDIO) binding.audioSlider.setValue(0); - if (type == C.TRACK_TYPE_TEXT) binding.textSlider.setValue(0); + private ViewGroup getSection() { + return type == C.TRACK_TYPE_AUDIO ? binding.audioSection : binding.textSection; } - private void onAudioChange(float value) { - player.setAudioOffsetMs(Math.round(value / OFFSET_STEP_MS) * OFFSET_STEP_MS); - setAudioValue(value); + private Slider getSlider() { + return type == C.TRACK_TYPE_AUDIO ? binding.audioSlider : binding.textSlider; } - private void onTextChange(float value) { - player.setTextOffsetMs(Math.round(value / OFFSET_STEP_MS) * OFFSET_STEP_MS); - setTextValue(value); + private TextView getLabel() { + return type == C.TRACK_TYPE_AUDIO ? binding.audioValue : binding.textValue; } - private void setAudioValue(float value) { - binding.audioValue.setText(String.format(Locale.getDefault(), "%+.1fs", value / 1000f)); + private void onReset(View view) { + getSlider().setValue(0); + getLabel().setText(format(0)); } - private void setTextValue(float value) { - binding.textValue.setText(String.format(Locale.getDefault(), "%+.1fs", value / 1000f)); + private void setupOffset(Slider slider, TextView label, long valueMs, LongConsumer setter) { + float clamped = Math.max(slider.getValueFrom(), Math.min(slider.getValueTo(), valueMs)); + slider.clearOnChangeListeners(); + slider.setLabelFormatter(this::format); + slider.setValue(clamped); + label.setText(format(clamped)); + slider.addOnChangeListener((source, value, fromUser) -> { + if (!fromUser) return; + setter.accept(Math.round(value / OFFSET_STEP_MS) * OFFSET_STEP_MS); + label.setText(format(value)); + }); } - private float clamp(long value) { - return Math.max(OFFSET_MIN_MS, Math.min(OFFSET_MAX_MS, value)); + private String format(float value) { + return String.format(Locale.getDefault(), "%+.1fs", value / 1000f); } } diff --git a/app/src/mobile/res/layout/dialog_offset.xml b/app/src/mobile/res/layout/dialog_offset.xml index 447a9ae64..87e7f3d6f 100644 --- a/app/src/mobile/res/layout/dialog_offset.xml +++ b/app/src/mobile/res/layout/dialog_offset.xml @@ -1,6 +1,7 @@ @@ -37,7 +38,9 @@ android:id="@+id/audioSection" android:layout_width="match_parent" android:layout_height="wrap_content" - android:orientation="vertical"> + android:orientation="vertical" + android:visibility="gone" + tools:visibility="visible"> + android:orientation="vertical" + android:visibility="gone" + tools:visibility="visible">