Danmaku Sync

pull/482/head
okjack 2 years ago
parent c11ff31d6b
commit b34e0fe6b7
  1. 8
      app/src/main/java/com/fongmi/android/tv/Setting.java
  2. 10
      app/src/main/java/com/fongmi/android/tv/player/Players.java
  3. 22
      app/src/main/java/com/fongmi/android/tv/player/danmu/Parser.java
  4. 13
      app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SettingCustomFragment.java
  5. 28
      app/src/mobile/res/layout/fragment_setting_custom.xml

@ -286,14 +286,6 @@ public class Setting {
return Math.min(Math.max(Prefers.getInt("danmu_alpha", 90), 10), 100);
}
public static void putDanmuSync(boolean sync) {
Prefers.put("danmu_sync", sync);
}
public static boolean isDanmuSync() {
return Prefers.getBoolean("danmu_sync", false);
}
public static void putDanmuAlpha(int alpha) {
Prefers.put("danmu_alpha", alpha);
}

@ -81,11 +81,9 @@ public class Players implements Player.Listener, IMediaPlayer.Listener, Analytic
private Sub sub;
private long position;
private float speed;
private int player;
private int error;
private int retry;
private boolean danmuSync;
public static boolean isExo(int type) {
return type == EXO;
@ -112,7 +110,6 @@ public class Players implements Player.Listener, IMediaPlayer.Listener, Analytic
builder = new StringBuilder();
runnable = ErrorEvent::timeout;
formatter = new Formatter(builder, Locale.getDefault());
danmuSync = Setting.isDanmuSync();
createSession(activity);
return this;
}
@ -308,8 +305,8 @@ public class Players implements Player.Listener, IMediaPlayer.Listener, Analytic
}
public String setSpeed(float speed) {
if (exoPlayer != null && !Setting.isTunnel()) exoPlayer.setPlaybackSpeed(this.speed = speed);
if (ijkPlayer != null) ijkPlayer.setSpeed(this.speed = speed);
if (exoPlayer != null && !Setting.isTunnel()) exoPlayer.setPlaybackSpeed(speed);
if (ijkPlayer != null) ijkPlayer.setSpeed(speed);
return getSpeedText();
}
@ -689,8 +686,7 @@ public class Players implements Player.Listener, IMediaPlayer.Listener, Analytic
@Override
public void updateTimer(DanmakuTimer timer) {
if (danmuSync) App.post(() -> timer.update(getPosition()));
else if (speed != 1) timer.add((long) (timer.lastInterval() * (speed - 1)));
}
@Override

@ -24,10 +24,8 @@ import master.flame.danmaku.danmaku.util.DanmakuUtils;
public class Parser extends BaseDanmakuParser {
private final Danmu danmu;
private BaseDanmaku item;
private float scaleX;
private float scaleY;
private int index;
public Parser(String path) {
this.danmu = Danmu.fromXml(getContent(path));
@ -45,11 +43,9 @@ public class Parser extends BaseDanmakuParser {
for (Danmu.Data data : danmu.getData()) {
String[] values = data.getParam().split(",");
if (values.length < 4) continue;
setParam(values);
setText(data.getText());
synchronized (result.obtainSynchronizer()) {
result.addItem(item);
}
BaseDanmaku item = createDanmaku(values);
setText(item, data.getText());
result.addItem(item);
}
return result;
}
@ -62,27 +58,27 @@ public class Parser extends BaseDanmakuParser {
return this;
}
private void setParam(String[] values) {
private BaseDanmaku createDanmaku(String[] values) {
int type = Integer.parseInt(values[1]);
long time = (long) (Float.parseFloat(values[0]) * 1000);
float size = Float.parseFloat(values[2]) * (mDispDensity - 0.6f);
int color = (int) ((0x00000000ff000000L | Long.parseLong(values[3])) & 0x00000000ffffffffL);
item = mContext.mDanmakuFactory.createDanmaku(type, mContext);
BaseDanmaku item = mContext.mDanmakuFactory.createDanmaku(type, mContext);
item.setTime(time);
item.setTimer(mTimer);
item.textSize = size;
item.textColor = color;
item.textShadowColor = color <= Color.BLACK ? Color.WHITE : Color.BLACK;
item.flags = mContext.mGlobalFlagValues;
return item;
}
private void setText(String text) {
item.index = index++;
private void setText(BaseDanmaku item, String text) {
DanmakuUtils.fillText(item, decodeXmlString(text));
if (item.getType() == BaseDanmaku.TYPE_SPECIAL && text.startsWith("[") && text.endsWith("]")) setSpecial();
if (item.getType() == BaseDanmaku.TYPE_SPECIAL && text.startsWith("[") && text.endsWith("]")) setSpecial(item);
}
private void setSpecial() {
private void setSpecial(BaseDanmaku item) {
String[] textArr = null;
try {
JSONArray jsonArray = new JSONArray(item.text);

@ -45,7 +45,6 @@ public class SettingCustomFragment extends BaseFragment {
@Override
protected void initView() {
mBinding.sizeText.setText((size = ResUtil.getStringArray(R.array.select_size))[Setting.getSize()]);
mBinding.danmuSyncText.setText(getSwitch(Setting.isDanmuSync()));
mBinding.speedText.setText(getSpeedText());
mBinding.incognitoText.setText(getSwitch(Setting.isIncognito()));
mBinding.aggregatedSearchText.setText(getSwitch(Setting.isAggregatedSearch()));
@ -57,9 +56,7 @@ public class SettingCustomFragment extends BaseFragment {
@Override
protected void initEvent() {
mBinding.title.setOnLongClickListener(this::onTitle);
mBinding.size.setOnClickListener(this::setSize);
mBinding.danmuSync.setOnClickListener(this::setDanmuSync);
mBinding.speed.setOnClickListener(this::setSpeed);
mBinding.speed.setOnLongClickListener(this::resetSpeed);
mBinding.incognito.setOnClickListener(this::setIncognito);
@ -72,11 +69,6 @@ public class SettingCustomFragment extends BaseFragment {
}
private boolean onTitle(View view) {
mBinding.danmuSync.setVisibility(View.VISIBLE);
return true;
}
private void setSize(View view) {
new MaterialAlertDialogBuilder(getActivity()).setTitle(R.string.setting_size).setNegativeButton(R.string.dialog_negative, null).setSingleChoiceItems(size, Setting.getSize(), (dialog, which) -> {
mBinding.sizeText.setText(size[which]);
@ -86,11 +78,6 @@ public class SettingCustomFragment extends BaseFragment {
}).show();
}
private void setDanmuSync(View view) {
Setting.putDanmuSync(!Setting.isDanmuSync());
mBinding.danmuSyncText.setText(getSwitch(Setting.isDanmuSync()));
}
private String getSpeedText() {
return String.format(Locale.getDefault(), "%.2f", Setting.getPlaySpeed());
}

@ -70,34 +70,6 @@
</LinearLayout>
<LinearLayout
android:id="@+id/danmuSync"
android:visibility="gone"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:background="@drawable/shape_item"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:text="@string/player_danmu_sync"
android:textColor="@color/white"
android:textSize="16sp" />
<TextView
android:id="@+id/danmuSyncText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="end"
android:textColor="@color/white"
android:textSize="16sp"
tools:text="開" />
</LinearLayout>
<LinearLayout
android:id="@+id/speed"
android:layout_width="match_parent"

Loading…
Cancel
Save