完善播放器控制UI

pull/1/head
Cuke 4 years ago
parent c01fbacb9e
commit fc15ba1e4a
  1. 6
      app/src/main/java/com/github/tvbox/osc/api/ApiConfig.java
  2. 9
      app/src/main/java/com/github/tvbox/osc/player/IjkMediaPlayer.java
  3. 8
      app/src/main/java/com/github/tvbox/osc/player/controller/BaseController.java
  4. 154
      app/src/main/java/com/github/tvbox/osc/player/controller/VodController.java
  5. 24
      app/src/main/java/com/github/tvbox/osc/ui/activity/DetailActivity.java
  6. 57
      app/src/main/java/com/github/tvbox/osc/ui/activity/PlayActivity.java
  7. 10
      app/src/main/java/com/github/tvbox/osc/ui/adapter/HistoryAdapter.java
  8. 42
      app/src/main/java/com/github/tvbox/osc/ui/fragment/ModelSettingFragment.java
  9. 2
      app/src/main/java/com/github/tvbox/osc/util/HawkConfig.java
  10. 63
      app/src/main/java/com/github/tvbox/osc/util/PlayerHelper.java
  11. 17
      app/src/main/res/layout/activity_play.xml
  12. 42
      app/src/main/res/layout/fragment_model.xml
  13. 1
      app/src/main/res/layout/player_vod_control_view.xml

@ -450,8 +450,12 @@ public class ApiConfig {
public IJKCode getCurrentIJKCode() {
String codeName = Hawk.get(HawkConfig.IJK_CODEC, "");
return getIJKCodec(codeName);
}
public IJKCode getIJKCodec(String name) {
for (IJKCode code : ijkCodes) {
if (code.getName().equals(codeName))
if (code.getName().equals(name))
return code;
}
return ijkCodes.get(0);

@ -13,15 +13,18 @@ import xyz.doikki.videoplayer.ijk.IjkPlayer;
public class IjkMediaPlayer extends IjkPlayer {
public IjkMediaPlayer(Context context) {
private IJKCode codec = null;
public IjkMediaPlayer(Context context, IJKCode codec) {
super(context);
this.codec = codec;
}
@Override
public void setOptions() {
super.setOptions();
IJKCode codec = ApiConfig.get().getCurrentIJKCode();
LinkedHashMap<String, String> options = codec.getOption();
IJKCode codecTmp = this.codec == null ? ApiConfig.get().getCurrentIJKCode() : this.codec;
LinkedHashMap<String, String> options = codecTmp.getOption();
if (options != null) {
for (String key : options.keySet()) {
String value = options.get(key);

@ -90,10 +90,10 @@ public abstract class BaseController extends BaseVideoController implements Gest
super(context, attrs, defStyleAttr);
}
TextView mSlideInfo;
ProgressBar mLoading;
ViewGroup mPauseRoot;
TextView mPauseTime;
private TextView mSlideInfo;
private ProgressBar mLoading;
private ViewGroup mPauseRoot;
private TextView mPauseTime;
@Override
protected void initView() {

@ -15,12 +15,20 @@ import androidx.annotation.NonNull;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.github.tvbox.osc.R;
import com.github.tvbox.osc.api.ApiConfig;
import com.github.tvbox.osc.bean.IJKCode;
import com.github.tvbox.osc.bean.ParseBean;
import com.github.tvbox.osc.ui.adapter.ParseAdapter;
import com.github.tvbox.osc.util.HawkConfig;
import com.github.tvbox.osc.util.PlayerHelper;
import com.orhanobut.hawk.Hawk;
import com.owen.tvrecyclerview.widget.TvRecyclerView;
import com.owen.tvrecyclerview.widget.V7LinearLayoutManager;
import org.jetbrains.annotations.NotNull;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.List;
import xyz.doikki.videoplayer.player.VideoView;
import xyz.doikki.videoplayer.util.PlayerUtils;
@ -162,43 +170,123 @@ public class VodController extends BaseController {
mPlayerScaleBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
try {
int scaleType = mPlayerConfig.getInt("sc");
scaleType++;
if (scaleType > 5)
scaleType = 0;
mPlayerConfig.put("sc", scaleType);
updatePlayerCfgView();
listener.updatePlayerCfg();
mControlWrapper.setScreenScaleType(scaleType);
} catch (JSONException e) {
e.printStackTrace();
}
}
});
mPlayerSpeedBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
try {
float speed = (float) mPlayerConfig.getDouble("sp");
speed += 0.5f;
if (speed > 3)
speed = 1;
mPlayerConfig.put("sp", speed);
updatePlayerCfgView();
listener.updatePlayerCfg();
mControlWrapper.setSpeed(speed);
} catch (JSONException e) {
e.printStackTrace();
}
}
});
mPlayerBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
try {
int playerType = mPlayerConfig.getInt("pl");
playerType++;
if (playerType > 2)
playerType = 0;
mPlayerConfig.put("pl", playerType);
updatePlayerCfgView();
listener.updatePlayerCfg();
listener.replay();
} catch (JSONException e) {
e.printStackTrace();
}
}
});
mPlayerIJKBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
try {
String ijk = mPlayerConfig.getString("ijk");
List<IJKCode> codecs = ApiConfig.get().getIjkCodes();
for (int i = 0; i < codecs.size(); i++) {
if (ijk.equals(codecs.get(i).getName())) {
if (i >= codecs.size() - 1)
ijk = codecs.get(0).getName();
else {
ijk = codecs.get(i + 1).getName();
}
break;
}
}
mPlayerConfig.put("ijk", ijk);
updatePlayerCfgView();
listener.updatePlayerCfg();
listener.replay();
} catch (JSONException e) {
e.printStackTrace();
}
}
});
mPlayerTimeStartBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
try {
int step = Hawk.get(HawkConfig.PLAY_TIME_STEP, 5);
int st = mPlayerConfig.getInt("st");
st += step;
if (st > 60 * 10)
st = 0;
mPlayerConfig.put("st", st);
updatePlayerCfgView();
listener.updatePlayerCfg();
} catch (JSONException e) {
e.printStackTrace();
}
}
});
mPlayerTimeSkipBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
try {
int step = Hawk.get(HawkConfig.PLAY_TIME_STEP, 5);
int et = mPlayerConfig.getInt("et");
et += step;
if (et > 60 * 10)
et = 0;
mPlayerConfig.put("et", et);
updatePlayerCfgView();
listener.updatePlayerCfg();
} catch (JSONException e) {
e.printStackTrace();
}
}
});
mPlayerTimeStepBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
int step = Hawk.get(HawkConfig.PLAY_TIME_STEP, 5);
step += 5;
if (step > 30) {
step = 5;
}
Hawk.put(HawkConfig.PLAY_TIME_STEP, step);
updatePlayerCfgView();
}
});
}
@ -212,12 +300,40 @@ public class VodController extends BaseController {
mParseRoot.setVisibility(userJxList ? VISIBLE : GONE);
}
private JSONObject mPlayerConfig = null;
public void setPlayerConfig(JSONObject playerCfg) {
this.mPlayerConfig = playerCfg;
updatePlayerCfgView();
}
void updatePlayerCfgView() {
try {
int playerType = mPlayerConfig.getInt("pl");
mPlayerBtn.setText(PlayerHelper.getPlayerName(playerType));
mPlayerScaleBtn.setText(PlayerHelper.getScaleName(mPlayerConfig.getInt("sc")));
mPlayerIJKBtn.setText(mPlayerConfig.getString("ijk"));
mPlayerIJKBtn.setVisibility(playerType == 1 ? VISIBLE : GONE);
mPlayerScaleBtn.setText(PlayerHelper.getScaleName(mPlayerConfig.getInt("sc")));
mPlayerSpeedBtn.setText("x" + mPlayerConfig.getDouble("sp"));
mPlayerTimeStartBtn.setText(PlayerUtils.stringForTime(mPlayerConfig.getInt("st") * 1000));
mPlayerTimeSkipBtn.setText(PlayerUtils.stringForTime(mPlayerConfig.getInt("et") * 1000));
mPlayerTimeStepBtn.setText(Hawk.get(HawkConfig.PLAY_TIME_STEP, 5) + "s");
} catch (JSONException e) {
e.printStackTrace();
}
}
public interface VodControlListener {
void playNext();
void playPre();
void changeParse(ParseBean pb);
void updatePlayerCfg();
void replay();
}
public void setListener(VodControlListener listener) {
@ -232,6 +348,15 @@ public class VodController extends BaseController {
return;
}
super.setProgress(duration, position);
int et = 0;
try {
et = mPlayerConfig.getInt("et");
} catch (JSONException e) {
e.printStackTrace();
}
if (position + (et * 1000) >= duration) {
listener.playNext();
}
mCurrentTime.setText(PlayerUtils.stringForTime(position));
mTotalTime.setText(PlayerUtils.stringForTime(duration));
if (duration > 0) {
@ -299,9 +424,24 @@ public class VodController extends BaseController {
protected void onPlayStateChanged(int playState) {
super.onPlayStateChanged(playState);
switch (playState) {
case VideoView.STATE_IDLE:
break;
case VideoView.STATE_PLAYING:
startProgress();
break;
case VideoView.STATE_PAUSED:
break;
case VideoView.STATE_ERROR:
break;
case VideoView.STATE_PREPARED:
case VideoView.STATE_BUFFERED:
break;
case VideoView.STATE_PREPARING:
case VideoView.STATE_BUFFERING:
break;
case VideoView.STATE_PLAYBACK_COMPLETED:
listener.playNext();
break;
}
}

@ -43,6 +43,7 @@ import com.squareup.picasso.Picasso;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import org.json.JSONObject;
import java.net.URLEncoder;
import java.util.ArrayList;
@ -377,17 +378,24 @@ public class DetailActivity extends BaseActivity {
public void refresh(RefreshEvent event) {
if (event.type == RefreshEvent.TYPE_REFRESH) {
if (event.obj != null) {
int index = (int) event.obj;
if (index != vodInfo.playIndex) {
seriesAdapter.getData().get(vodInfo.playIndex).selected = false;
seriesAdapter.notifyItemChanged(vodInfo.playIndex);
seriesAdapter.getData().get(index).selected = true;
seriesAdapter.notifyItemChanged(index);
mGridView.setSelection(index);
vodInfo.playIndex = index;
if (event.obj instanceof Integer) {
int index = (int) event.obj;
if (index != vodInfo.playIndex) {
seriesAdapter.getData().get(vodInfo.playIndex).selected = false;
seriesAdapter.notifyItemChanged(vodInfo.playIndex);
seriesAdapter.getData().get(index).selected = true;
seriesAdapter.notifyItemChanged(index);
mGridView.setSelection(index);
vodInfo.playIndex = index;
//保存历史
insertVod(sourceKey, vodInfo);
}
} else if (event.obj instanceof JSONObject) {
vodInfo.playerCfg = ((JSONObject) event.obj).toString();
//保存历史
insertVod(sourceKey, vodInfo);
}
}
} else if (event.type == RefreshEvent.TYPE_QUICK_SEARCH_SELECT) {
if (event.obj != null) {

@ -95,7 +95,6 @@ public class PlayActivity extends BaseActivity {
private void initView() {
setLoadSir(findViewById(R.id.rootLayout));
mVideoView = findViewById(R.id.mVideoView);
PlayerHelper.updateCfg(mVideoView);
controller = new VodController(this);
controller.setCanChangePosition(true);
controller.setEnableInNormal(true);
@ -109,7 +108,13 @@ public class PlayActivity extends BaseActivity {
@Override
public long getSavedProgress(String url) {
if (CacheManager.getCache(MD5.string2MD5(url)) == null) {
return 0;
int st = 0;
try {
st = mVodPlayerCfg.getInt("st");
} catch (JSONException e) {
e.printStackTrace();
}
return st * 1000;
}
return (long) CacheManager.getCache(MD5.string2MD5(url));
}
@ -129,6 +134,17 @@ public class PlayActivity extends BaseActivity {
public void changeParse(ParseBean pb) {
doParse(pb);
}
@Override
public void updatePlayerCfg() {
mVodInfo.playerCfg = mVodPlayerCfg.toString();
EventBus.getDefault().post(new RefreshEvent(RefreshEvent.TYPE_REFRESH, mVodPlayerCfg));
}
@Override
public void replay() {
play();
}
});
mVideoView.setVideoController(controller);
}
@ -158,6 +174,7 @@ public class PlayActivity extends BaseActivity {
public void run() {
if (mVideoView != null) {
mVideoView.release();
PlayerHelper.updateCfg(mVideoView, mVodPlayerCfg);
mVideoView.setProgressKey(progressKey);
if (headers != null) {
mVideoView.setUrl(url, headers);
@ -223,10 +240,45 @@ public class PlayActivity extends BaseActivity {
Bundle bundle = intent.getExtras();
mVodInfo = (VodInfo) bundle.getSerializable("VodInfo");
sourceKey = bundle.getString("sourceKey");
initPlayerCfg();
play();
}
}
void initPlayerCfg() {
try {
mVodPlayerCfg = new JSONObject(mVodInfo.playerCfg);
} catch (Throwable th) {
mVodPlayerCfg = new JSONObject();
}
try {
if (!mVodPlayerCfg.has("pl")) {
mVodPlayerCfg.put("pl", Hawk.get(HawkConfig.PLAY_TYPE, 1));
}
if (!mVodPlayerCfg.has("pr")) {
mVodPlayerCfg.put("pr", Hawk.get(HawkConfig.PLAY_RENDER, 0));
}
if (!mVodPlayerCfg.has("ijk")) {
mVodPlayerCfg.put("ijk", Hawk.get(HawkConfig.IJK_CODEC, ""));
}
if (!mVodPlayerCfg.has("sc")) {
mVodPlayerCfg.put("sc", Hawk.get(HawkConfig.PLAY_SCALE, 0));
}
if (!mVodPlayerCfg.has("sp")) {
mVodPlayerCfg.put("sp", 1.0f);
}
if (!mVodPlayerCfg.has("st")) {
mVodPlayerCfg.put("st", 0);
}
if (!mVodPlayerCfg.has("et")) {
mVodPlayerCfg.put("et", 0);
}
} catch (Throwable th) {
}
controller.setPlayerConfig(mVodPlayerCfg);
}
@Override
public void onBackPressed() {
if (controller.onBackPressed()) {
@ -274,6 +326,7 @@ public class PlayActivity extends BaseActivity {
}
private VodInfo mVodInfo;
private JSONObject mVodPlayerCfg;
private String sourceKey;
private void playNext() {

@ -1,7 +1,6 @@
package com.github.tvbox.osc.ui.adapter;
import android.text.TextUtils;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
@ -38,7 +37,7 @@ public class HistoryAdapter extends BaseQuickAdapter<VodInfo, BaseViewHolder> {
tvYear.setVisibility(View.VISIBLE);
}*/
tvYear.setText(ApiConfig.get().getSource(item.sourceKey).getName());
TextView tvLang = helper.getView(R.id.tvLang);
/*TextView tvLang = helper.getView(R.id.tvLang);
if (TextUtils.isEmpty(item.lang)) {
tvLang.setVisibility(View.GONE);
} else {
@ -59,9 +58,12 @@ public class HistoryAdapter extends BaseQuickAdapter<VodInfo, BaseViewHolder> {
} else {
tvNote.setText(item.note);
tvNote.setVisibility(View.VISIBLE);
}
}*/
helper.setVisible(R.id.tvLang, false);
helper.setVisible(R.id.tvArea, false);
helper.setVisible(R.id.tvNote, false);
helper.setText(R.id.tvName, item.name);
helper.setText(R.id.tvActor, item.actor);
// helper.setText(R.id.tvActor, item.actor);
ImageView ivThumb = helper.getView(R.id.ivThumb);
//由于部分电视机使用glide报错
if (!TextUtils.isEmpty(item.pic)) {

@ -42,6 +42,7 @@ public class ModelSettingFragment extends BaseLazyFragment {
private TextView tvParseWebView;
private TextView tvPlay;
private TextView tvRender;
private TextView tvScale;
private TextView tvXWalkDown;
private TextView tvApi;
private TextView tvHomeApi;
@ -66,6 +67,7 @@ public class ModelSettingFragment extends BaseLazyFragment {
tvMediaCodec = findViewById(R.id.tvMediaCodec);
tvPlay = findViewById(R.id.tvPlay);
tvRender = findViewById(R.id.tvRenderType);
tvScale = findViewById(R.id.tvScaleType);
tvXWalkDown = findViewById(R.id.tvXWalkDown);
tvApi = findViewById(R.id.tvApi);
tvHomeApi = findViewById(R.id.tvHomeApi);
@ -75,6 +77,7 @@ public class ModelSettingFragment extends BaseLazyFragment {
tvXWalkDown.setText(XWalkUtils.xWalkLibExist(mContext) ? "已下载" : "未下载");
tvApi.setText(Hawk.get(HawkConfig.API_URL, ""));
tvHomeApi.setText(ApiConfig.get().getHomeSourceBean().getName());
tvScale.setText(PlayerHelper.getScaleName(Hawk.get(HawkConfig.PLAY_SCALE, 0)));
tvPlay.setText(PlayerHelper.getPlayerName(Hawk.get(HawkConfig.PLAY_TYPE, 0)));
tvRender.setText(PlayerHelper.getRenderName(Hawk.get(HawkConfig.PLAY_RENDER, 0)));
findViewById(R.id.llXWalkCore).setVisibility(Hawk.get(HawkConfig.PARSE_WEBVIEW, true) ? View.GONE : View.VISIBLE);
@ -230,6 +233,45 @@ public class ModelSettingFragment extends BaseLazyFragment {
dialog.show();
}
});
findViewById(R.id.llScale).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FastClickCheckUtil.check(v);
int defaultPos = Hawk.get(HawkConfig.PLAY_SCALE, 0);
ArrayList<Integer> players = new ArrayList<>();
players.add(0);
players.add(1);
players.add(2);
players.add(3);
players.add(4);
players.add(4);
SelectDialog<Integer> dialog = new SelectDialog<>(mActivity);
dialog.setTip("请选择默认画面缩放");
dialog.setAdapter(new SelectDialogAdapter.SelectDialogInterface<Integer>() {
@Override
public void click(Integer value, int pos) {
Hawk.put(HawkConfig.PLAY_SCALE, value);
tvScale.setText(PlayerHelper.getScaleName(value));
}
@Override
public String getDisplay(Integer val) {
return PlayerHelper.getScaleName(val);
}
}, new DiffUtil.ItemCallback<Integer>() {
@Override
public boolean areItemsTheSame(@NonNull @NotNull Integer oldItem, @NonNull @NotNull Integer newItem) {
return oldItem.intValue() == newItem.intValue();
}
@Override
public boolean areContentsTheSame(@NonNull @NotNull Integer oldItem, @NonNull @NotNull Integer newItem) {
return oldItem.intValue() == newItem.intValue();
}
}, players, defaultPos);
dialog.show();
}
});
findViewById(R.id.llPlay).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {

@ -16,4 +16,6 @@ public class HawkConfig {
public static final String LIVE_CHANNEL = "last_live_channel_name";
public static final String PLAY_TYPE = "play_type";//0 系统;1 ijk;2 exo
public static final String PLAY_RENDER = "play_render"; //0 texture 2
public static final String PLAY_SCALE = "play_scale"; //0 texture 2
public static final String PLAY_TIME_STEP = "play_time_step"; //0 texture 2
}

@ -2,29 +2,44 @@ package com.github.tvbox.osc.util;
import android.content.Context;
import com.github.tvbox.osc.api.ApiConfig;
import com.github.tvbox.osc.bean.IJKCode;
import com.github.tvbox.osc.player.IjkMediaPlayer;
import com.github.tvbox.osc.player.render.SurfaceRenderViewFactory;
import com.orhanobut.hawk.Hawk;
import org.json.JSONException;
import org.json.JSONObject;
import tv.danmaku.ijk.media.player.IjkLibLoader;
import xyz.doikki.videoplayer.exo.ExoMediaPlayerFactory;
import xyz.doikki.videoplayer.player.AndroidMediaPlayerFactory;
import xyz.doikki.videoplayer.player.PlayerFactory;
import xyz.doikki.videoplayer.player.VideoView;
import xyz.doikki.videoplayer.player.VideoViewConfig;
import xyz.doikki.videoplayer.player.VideoViewManager;
import xyz.doikki.videoplayer.render.RenderViewFactory;
import xyz.doikki.videoplayer.render.TextureRenderViewFactory;
public class PlayerHelper {
public static void updateCfg(VideoView videoView) {
int playType = Hawk.get(HawkConfig.PLAY_TYPE, 0);
public static void updateCfg(VideoView videoView, JSONObject playerCfg) {
int playerType = Hawk.get(HawkConfig.PLAY_TYPE, 0);
int renderType = Hawk.get(HawkConfig.PLAY_RENDER, 0);
String ijkCode = Hawk.get(HawkConfig.IJK_CODEC, "软解码");
int scale = Hawk.get(HawkConfig.PLAY_SCALE, 0);
try {
playerType = playerCfg.getInt("pl");
renderType = playerCfg.getInt("pr");
ijkCode = playerCfg.getString("ijk");
scale = playerCfg.getInt("sc");
} catch (JSONException e) {
e.printStackTrace();
}
IJKCode codec = ApiConfig.get().getIJKCodec(ijkCode);
PlayerFactory playerFactory;
if (playType == 1) {
if (playerType == 1) {
playerFactory = new PlayerFactory<IjkMediaPlayer>() {
@Override
public IjkMediaPlayer createPlayer(Context context) {
return new IjkMediaPlayer(context);
return new IjkMediaPlayer(context, codec);
}
};
try {
@ -41,12 +56,11 @@ public class PlayerHelper {
} catch (Throwable th) {
th.printStackTrace();
}
} else if (playType == 2) {
} else if (playerType == 2) {
playerFactory = ExoMediaPlayerFactory.create();
} else {
playerFactory = AndroidMediaPlayerFactory.create();
}
int renderType = Hawk.get(HawkConfig.PLAY_RENDER, 0);
RenderViewFactory renderViewFactory = null;
switch (renderType) {
case 0:
@ -59,17 +73,17 @@ public class PlayerHelper {
}
videoView.setPlayerFactory(playerFactory);
videoView.setRenderViewFactory(renderViewFactory);
videoView.setScreenScaleType(scale);
}
public static void init() {
public static void updateCfg(VideoView videoView) {
int playType = Hawk.get(HawkConfig.PLAY_TYPE, 0);
PlayerFactory playerFactory;
if (playType == 1) {
playerFactory = new PlayerFactory<IjkMediaPlayer>() {
@Override
public IjkMediaPlayer createPlayer(Context context) {
return new IjkMediaPlayer(context);
return new IjkMediaPlayer(context, null);
}
};
try {
@ -102,13 +116,26 @@ public class PlayerHelper {
renderViewFactory = SurfaceRenderViewFactory.create();
break;
}
//播放器配置,注意:此为全局配置,按需开启
VideoViewManager.setConfig(VideoViewConfig.newBuilder()
.setLogEnabled(Hawk.get(HawkConfig.DEBUG_OPEN, false))
.setScreenScaleType(VideoView.SCREEN_SCALE_DEFAULT)
.setPlayerFactory(playerFactory)
.setRenderViewFactory(renderViewFactory)
.build());
videoView.setPlayerFactory(playerFactory);
videoView.setRenderViewFactory(renderViewFactory);
}
public static void init() {
try {
tv.danmaku.ijk.media.player.IjkMediaPlayer.loadLibrariesOnce(new IjkLibLoader() {
@Override
public void loadLibrary(String s) throws UnsatisfiedLinkError, SecurityException {
try {
System.loadLibrary(s);
} catch (Throwable th) {
th.printStackTrace();
}
}
});
} catch (Throwable th) {
th.printStackTrace();
}
}
public static String getPlayerName(int playType) {

@ -1,11 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout android:id="@+id/rootLayout" xmlns:android="http://schemas.android.com/apk/res/android"
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
android:layout_height="match_parent"
android:background="@android:color/black">
<xyz.doikki.videoplayer.player.VideoView
android:id="@+id/mVideoView"
<FrameLayout
android:id="@+id/rootLayout"
android:layout_width="match_parent"
android:layout_height="match_parent" />
android:layout_height="match_parent">
<xyz.doikki.videoplayer.player.VideoView
android:id="@+id/mVideoView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</FrameLayout>
</FrameLayout>

@ -280,6 +280,48 @@
android:textSize="@dimen/ts_30" />
</LinearLayout>
<LinearLayout
android:id="@+id/llScale"
android:layout_width="match_parent"
android:layout_height="@dimen/vs_50"
android:layout_marginBottom="@dimen/vs_10"
android:background="@drawable/shape_setting_model_focus"
android:focusable="true"
android:gravity="center_vertical"
android:orientation="horizontal"
android:paddingLeft="@dimen/vs_20"
android:paddingRight="@dimen/vs_20">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="画面缩放"
android:textColor="@android:color/white"
android:textSize="@dimen/ts_24" />
<Space
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1" />
<TextView
android:id="@+id/tvScaleType"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@android:color/white"
android:textSize="@dimen/ts_24" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/vs_10"
android:layout_marginLeft="@dimen/vs_10"
android:text=">"
android:textColor="@android:color/white"
android:textSize="@dimen/ts_30" />
</LinearLayout>
<LinearLayout
android:id="@+id/llParseWebVew"
android:layout_width="match_parent"

@ -114,7 +114,6 @@
android:textColor="@android:color/white"
android:textSize="@dimen/ts_20" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"

Loading…
Cancel
Save