Add play controller - part 1

pull/4/head^2
FongMi 4 years ago
parent 2e639cba6a
commit dae14c33ff
  1. 20
      app/src/main/java/com/fongmi/bear/impl/KeyDownImpl.java
  2. 19
      app/src/main/java/com/fongmi/bear/player/Player.java
  3. 7
      app/src/main/java/com/fongmi/bear/ui/activity/DetailActivity.java
  4. 77
      app/src/main/java/com/fongmi/bear/ui/activity/PlayActivity.java
  5. 52
      app/src/main/java/com/fongmi/bear/utils/KeyDown.java
  6. 6
      app/src/main/res/drawable/selector_site.xml
  7. 6
      app/src/main/res/drawable/selector_text.xml
  8. 11
      app/src/main/res/drawable/shape_controller.xml
  9. 0
      app/src/main/res/drawable/shape_text_activated.xml
  10. 0
      app/src/main/res/drawable/shape_text_focused.xml
  11. 0
      app/src/main/res/drawable/shape_text_normal.xml
  12. 9
      app/src/main/res/layout/activity_play.xml
  13. 2
      app/src/main/res/layout/adapter_site.xml
  14. 124
      app/src/main/res/layout/view_controller.xml
  15. 11
      app/src/main/res/values/colors.xml

@ -0,0 +1,20 @@
package com.fongmi.bear.impl;
public interface KeyDownImpl {
void onSeek(boolean forward);
void onKeyVertical(boolean up);
void onKeyLeft();
void onKeyRight();
void onKeyCenter();
void onKeyMenu();
void onKeyBack();
void onLongPress();
}

@ -98,11 +98,24 @@ public class Player implements com.google.android.exoplayer2.Player.Listener {
@Override
public void onPlaybackStateChanged(int state) {
if (state != com.google.android.exoplayer2.Player.STATE_READY) return;
callback.onPrepared();
switch (state) {
case com.google.android.exoplayer2.Player.STATE_BUFFERING:
callback.onBuffering();
break;
case com.google.android.exoplayer2.Player.STATE_READY:
callback.onReady();
break;
case com.google.android.exoplayer2.Player.STATE_ENDED:
break;
case com.google.android.exoplayer2.Player.STATE_IDLE:
break;
}
}
public interface Callback {
void onPrepared();
void onBuffering();
void onReady();
}
}

@ -168,7 +168,12 @@ public class DetailActivity extends BaseActivity implements Player.Callback {
}
@Override
public void onPrepared() {
public void onBuffering() {
mBinding.progress.getRoot().setVisibility(View.VISIBLE);
}
@Override
public void onReady() {
mBinding.progress.getRoot().setVisibility(View.GONE);
}

@ -2,15 +2,21 @@ package com.fongmi.bear.ui.activity;
import android.app.Activity;
import android.content.Intent;
import android.view.KeyEvent;
import android.view.View;
import androidx.viewbinding.ViewBinding;
import com.fongmi.bear.databinding.ActivityPlayBinding;
import com.fongmi.bear.impl.KeyDownImpl;
import com.fongmi.bear.player.Player;
import com.fongmi.bear.utils.KeyDown;
import com.fongmi.bear.utils.Utils;
public class PlayActivity extends BaseActivity {
public class PlayActivity extends BaseActivity implements Player.Callback, KeyDownImpl {
private ActivityPlayBinding mBinding;
private KeyDown mKeyDown;
public static void newInstance(Activity activity) {
activity.startActivityForResult(new Intent(activity, PlayActivity.class), 1000);
@ -23,10 +29,77 @@ public class PlayActivity extends BaseActivity {
@Override
protected void initView() {
mBinding.video.setPlayer(Player.get().exo());
mKeyDown = KeyDown.create(this);
mBinding.video.setPlayer(Player.get().callback(this).exo());
}
@Override
protected void initEvent() {
}
@Override
public void onBuffering() {
mBinding.progress.getRoot().setVisibility(View.VISIBLE);
}
@Override
public void onReady() {
mBinding.progress.getRoot().setVisibility(View.GONE);
}
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
if (!mBinding.video.isControllerVisible() && Utils.hasEvent(event)) return mKeyDown.onKeyDown(event);
else return super.dispatchKeyEvent(event);
}
@Override
public void onSeek(boolean forward) {
}
@Override
public void onKeyVertical(boolean up) {
}
@Override
public void onKeyLeft() {
}
@Override
public void onKeyRight() {
}
@Override
public void onKeyCenter() {
mBinding.video.showController();
}
@Override
public void onKeyMenu() {
}
@Override
public void onKeyBack() {
onBackPressed();
}
@Override
public void onLongPress() {
}
@Override
public void onBackPressed() {
if (mBinding.video.isControllerVisible()) {
mBinding.video.hideController();
} else {
super.onBackPressed();
}
}
}

@ -0,0 +1,52 @@
package com.fongmi.bear.utils;
import android.view.KeyEvent;
import com.fongmi.bear.impl.KeyDownImpl;
public class KeyDown {
private final KeyDownImpl mKeyDown;
private boolean mPress;
public static KeyDown create(KeyDownImpl keyDown) {
return new KeyDown(keyDown);
}
private KeyDown(KeyDownImpl keyDown) {
this.mKeyDown = keyDown;
}
public boolean onKeyDown(KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN && Utils.isUpKey(event)) {
mKeyDown.onKeyVertical(true);
} else if (event.getAction() == KeyEvent.ACTION_DOWN && Utils.isDownKey(event)) {
mKeyDown.onKeyVertical(false);
} else if (event.getAction() == KeyEvent.ACTION_DOWN && Utils.isLeftKey(event)) {
mKeyDown.onSeek(false);
} else if (event.getAction() == KeyEvent.ACTION_DOWN && Utils.isRightKey(event)) {
mKeyDown.onSeek(true);
} else if (event.getAction() == KeyEvent.ACTION_UP && Utils.isLeftKey(event)) {
mKeyDown.onKeyLeft();
} else if (event.getAction() == KeyEvent.ACTION_UP && Utils.isRightKey(event)) {
mKeyDown.onKeyRight();
} else if (event.getAction() == KeyEvent.ACTION_UP && Utils.isBackKey(event)) {
mKeyDown.onKeyBack();
} else if (event.getAction() == KeyEvent.ACTION_UP && Utils.isMenuKey(event)) {
mKeyDown.onKeyMenu();
} else if (Utils.isEnterKey(event)) {
checkPress(event);
}
return true;
}
private void checkPress(KeyEvent event) {
if (event.isLongPress()) {
mPress = true;
mKeyDown.onLongPress();
} else if (event.getAction() == KeyEvent.ACTION_UP) {
if (mPress) mPress = false;
else mKeyDown.onKeyCenter();
}
}
}

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/shape_site_focused" android:state_focused="true" />
<item android:drawable="@drawable/shape_site_activated" android:state_activated="true" />
<item android:drawable="@drawable/shape_site_normal" />
</selector>

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/shape_text_focused" android:state_focused="true" />
<item android:drawable="@drawable/shape_text_activated" android:state_activated="true" />
<item android:drawable="@drawable/shape_text_normal" />
</selector>

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/white_90" />
<corners
android:topLeftRadius="8dp"
android:topRightRadius="8dp" />
</shape>

@ -10,7 +10,12 @@
android:id="@+id/video"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:resize_mode="fill"
app:use_controller="false" />
app:controller_layout_id="@layout/view_controller"
app:resize_mode="fill" />
<include
android:id="@+id/progress"
layout="@layout/view_progress"
android:visibility="gone" />
</FrameLayout>

@ -4,7 +4,7 @@
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/selector_site"
android:background="@drawable/selector_text"
android:focusable="true"
android:focusableInTouchMode="true"
android:gravity="center"

@ -0,0 +1,124 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/exo_controller"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:background="@drawable/shape_controller"
android:orientation="vertical"
android:paddingStart="16dp"
android:paddingTop="16dp"
android:paddingEnd="16dp"
android:paddingBottom="8dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:text="播放"
android:textColor="@color/grey_700"
android:textSize="16sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:background="@drawable/selector_text"
android:text="下一集"
android:textColor="@color/white" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:background="@drawable/selector_text"
android:text="上一集"
android:textColor="@color/white" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:background="@drawable/selector_text"
android:text="重播本集"
android:textColor="@color/white" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:text="倍速"
android:textColor="@color/grey_700"
android:textSize="16sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:background="@drawable/selector_text"
android:text="x1.0"
android:textColor="@color/white" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:text="縮放比例"
android:textColor="@color/grey_700"
android:textSize="16sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:background="@drawable/selector_text"
android:text="預設"
android:textColor="@color/white" />
</LinearLayout>
<LinearLayout
android:id="@id/exo_time"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:gravity="center"
android:orientation="horizontal">
<TextView
android:id="@id/exo_position"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/grey_700"
android:textSize="16sp"
tools:text="00:00:00" />
<com.google.android.exoplayer2.ui.DefaultTimeBar
android:id="@id/exo_progress"
android:layout_width="0dp"
android:layout_height="26dp"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:layout_weight="1"
app:buffered_color="@color/grey_700"
app:played_color="@color/grey_900"
app:scrubber_color="@color/blue_500"
app:unplayed_color="@color/grey_500" />
<TextView
android:id="@id/exo_duration"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/grey_700"
android:textSize="16sp"
tools:text="00:00:00" />
</LinearLayout>
</LinearLayout>

@ -7,6 +7,8 @@
<color name="white">#FFFFFF</color>
<color name="blue_500">#2196F3</color>
<color name="grey_300">#E0E0E0</color>
<color name="grey_500">#9E9E9E</color>
<color name="grey_700">#616161</color>
<color name="grey_900">#212121</color>
<color name="green_400">#66BB6A</color>
@ -19,5 +21,14 @@
<color name="black_60">#99000000</color>
<color name="black_70">#B3000000</color>
<color name="black_80">#CC000000</color>
<color name="white_10">#1AFFFFFF</color>
<color name="white_20">#33FFFFFF</color>
<color name="white_30">#4DFFFFFF</color>
<color name="white_40">#66FFFFFF</color>
<color name="white_50">#80FFFFFF</color>
<color name="white_60">#99FFFFFF</color>
<color name="white_70">#B3FFFFFF</color>
<color name="white_80">#CCFFFFFF</color>
<color name="white_90">#E6FFFFFF</color>
</resources>
Loading…
Cancel
Save