[leanback] support volume and bright slide

pull/123/head
FongMi 3 years ago
parent 04533b9d04
commit 77a7950466
  1. 34
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/DetailActivity.java
  2. 100
      app/src/leanback/java/com/fongmi/android/tv/ui/custom/CustomKeyDownVod.java
  3. 57
      app/src/leanback/res/layout/view_widget_vod.xml
  4. 0
      app/src/main/res/drawable/ic_widget_bright_high.xml
  5. 0
      app/src/main/res/drawable/ic_widget_bright_low.xml
  6. 0
      app/src/main/res/drawable/ic_widget_bright_medium.xml
  7. 0
      app/src/main/res/drawable/ic_widget_volume_high.xml
  8. 0
      app/src/main/res/drawable/ic_widget_volume_low.xml
  9. 0
      app/src/main/res/drawable/ic_widget_volume_medium.xml

@ -190,7 +190,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis
@Override
protected void initView() {
mKeyDown = CustomKeyDownVod.create(this);
mKeyDown = CustomKeyDownVod.create(this, mBinding.video);
mFrameParams = mBinding.video.getLayoutParams();
mBinding.progressLayout.showProgress();
mPlayers = new Players().init();
@ -458,7 +458,8 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis
getIjk().getSubtitleView().setTextSize(TypedValue.COMPLEX_UNIT_SP, 24);
mBinding.video.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT));
mBinding.flag.setSelectedPosition(mCurrent);
App.post(() -> setFullscreen(true), 250);
mKeyDown.setFull(true);
setFullscreen(true);
onPlay();
}
@ -466,6 +467,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis
mBinding.video.setForeground(ResUtil.getDrawable(R.drawable.selector_video));
getIjk().getSubtitleView().setTextSize(TypedValue.COMPLEX_UNIT_SP, 16);
mBinding.video.setLayoutParams(mFrameParams);
mKeyDown.setFull(false);
setFullscreen(false);
hideInfo();
}
@ -979,6 +981,34 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis
return super.dispatchKeyEvent(event);
}
@Override
public void onBright(int progress) {
mBinding.widget.bright.setVisibility(View.VISIBLE);
mBinding.widget.brightProgress.setProgress(progress);
if (progress < 35) mBinding.widget.brightIcon.setImageResource(R.drawable.ic_widget_bright_low);
else if (progress < 70) mBinding.widget.brightIcon.setImageResource(R.drawable.ic_widget_bright_medium);
else mBinding.widget.brightIcon.setImageResource(R.drawable.ic_widget_bright_high);
}
@Override
public void onBrightEnd() {
mBinding.widget.bright.setVisibility(View.GONE);
}
@Override
public void onVolume(int progress) {
mBinding.widget.volume.setVisibility(View.VISIBLE);
mBinding.widget.volumeProgress.setProgress(progress);
if (progress < 35) mBinding.widget.volumeIcon.setImageResource(R.drawable.ic_widget_volume_low);
else if (progress < 70) mBinding.widget.volumeIcon.setImageResource(R.drawable.ic_widget_volume_medium);
else mBinding.widget.volumeIcon.setImageResource(R.drawable.ic_widget_volume_high);
}
@Override
public void onVolumeEnd() {
mBinding.widget.volume.setVisibility(View.GONE);
}
@Override
public void onSeeking(int time) {
mBinding.widget.exoDuration.setText(mPlayers.getDurationTime());

@ -1,35 +1,59 @@
package com.fongmi.android.tv.ui.custom;
import android.app.Activity;
import android.content.Context;
import android.media.AudioManager;
import android.view.GestureDetector;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import androidx.annotation.NonNull;
import com.fongmi.android.tv.App;
import com.fongmi.android.tv.Constant;
import com.fongmi.android.tv.utils.ResUtil;
import com.fongmi.android.tv.utils.Utils;
public class CustomKeyDownVod extends GestureDetector.SimpleOnGestureListener {
private final GestureDetector detector;
private final AudioManager manager;
private final Listener listener;
private final Activity activity;
private final View videoView;
private boolean changeBright;
private boolean changeVolume;
private boolean touch;
private boolean full;
private float bright;
private float volume;
private int holdTime;
public static CustomKeyDownVod create(Context context) {
return new CustomKeyDownVod(context);
public static CustomKeyDownVod create(Activity activity, View videoView) {
return new CustomKeyDownVod(activity, videoView);
}
private CustomKeyDownVod(Context context) {
this.listener = (Listener) context;
this.detector = new GestureDetector(context, this);
private CustomKeyDownVod(Activity activity, View videoView) {
this.manager = (AudioManager) App.get().getSystemService(Context.AUDIO_SERVICE);
this.detector = new GestureDetector(activity, this);
this.listener = (Listener) activity;
this.videoView = videoView;
this.activity = activity;
}
public boolean onTouchEvent(MotionEvent e) {
if (!full) return false;
if (changeBright && e.getAction() == MotionEvent.ACTION_UP) listener.onBrightEnd();
if (changeVolume && e.getAction() == MotionEvent.ACTION_UP) listener.onVolumeEnd();
return detector.onTouchEvent(e);
}
public void setFull(boolean full) {
this.full = full;
}
public boolean hasEvent(KeyEvent event) {
return Utils.isEnterKey(event) || Utils.isUpKey(event) || Utils.isDownKey(event) || Utils.isLeftKey(event) || Utils.isRightKey(event);
}
@ -55,6 +79,27 @@ public class CustomKeyDownVod extends GestureDetector.SimpleOnGestureListener {
}
}
@Override
public boolean onDown(@NonNull MotionEvent e) {
if (!full) return false;
volume = manager.getStreamVolume(AudioManager.STREAM_MUSIC);
bright = activity.getWindow().getAttributes().screenBrightness;
changeBright = false;
changeVolume = false;
touch = true;
return true;
}
@Override
public boolean onScroll(@NonNull MotionEvent e1, @NonNull MotionEvent e2, float distanceX, float distanceY) {
if (!full) return false;
float deltaY = e1.getY() - e2.getY();
if (touch) checkFunc(distanceX, distanceY, e2);
if (changeBright) setBright(deltaY);
if (changeVolume) setVolume(deltaY);
return true;
}
@Override
public boolean onDoubleTap(@NonNull MotionEvent e) {
listener.onDoubleTap();
@ -79,8 +124,53 @@ public class CustomKeyDownVod extends GestureDetector.SimpleOnGestureListener {
holdTime = 0;
}
private void checkFunc(float distanceX, float distanceY, MotionEvent e2) {
if (Math.abs(distanceX) < Math.abs(distanceY)) checkSide(e2);
touch = false;
}
private void checkSide(MotionEvent e2) {
int half = ResUtil.getScreenWidthNav() / 2;
if (e2.getX() > half) {
changeVolume = true;
} else {
changeBright = true;
}
}
private void setBright(float deltaY) {
int height = videoView.getMeasuredHeight();
if (bright == -1.0f) bright = 0.5f;
float brightness = deltaY * 2 / height + bright;
if (brightness < 0) brightness = 0f;
if (brightness > 1.0f) brightness = 1.0f;
WindowManager.LayoutParams attributes = activity.getWindow().getAttributes();
attributes.screenBrightness = brightness;
activity.getWindow().setAttributes(attributes);
listener.onBright((int) (brightness * 100));
}
private void setVolume(float deltaY) {
int height = videoView.getMeasuredHeight();
int maxVolume = manager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
float deltaV = deltaY * 2 / height * maxVolume;
float index = volume + deltaV;
if (index > maxVolume) index = maxVolume;
if (index < 0) index = 0;
manager.setStreamVolume(AudioManager.STREAM_MUSIC, (int) index, 0);
listener.onVolume((int) (index / maxVolume * 100));
}
public interface Listener {
void onBright(int progress);
void onBrightEnd();
void onVolume(int progress);
void onVolumeEnd();
void onSeeking(int time);
void onSeekTo(int time);

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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:layout_width="match_parent"
android:layout_height="match_parent">
@ -161,4 +162,60 @@
</LinearLayout>
</LinearLayout>
<LinearLayout
android:id="@+id/bright"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="@drawable/shape_widget"
android:gravity="center"
android:orientation="horizontal"
android:padding="16dp"
android:visibility="gone"
tools:visibility="visible">
<ImageView
android:id="@+id/brightIcon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
tools:src="@drawable/ic_widget_bright_high" />
<com.google.android.material.progressindicator.LinearProgressIndicator
android:id="@+id/brightProgress"
android:layout_width="200dp"
android:layout_height="wrap_content"
app:indicatorColor="@color/white"
app:trackColor="@color/grey_500" />
</LinearLayout>
<LinearLayout
android:id="@+id/volume"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="@drawable/shape_widget"
android:gravity="center"
android:orientation="horizontal"
android:padding="16dp"
android:visibility="gone"
tools:visibility="visible">
<ImageView
android:id="@+id/volumeIcon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
tools:src="@drawable/ic_widget_volume_high" />
<com.google.android.material.progressindicator.LinearProgressIndicator
android:id="@+id/volumeProgress"
android:layout_width="200dp"
android:layout_height="wrap_content"
app:indicatorColor="@color/white"
app:trackColor="@color/grey_500" />
</LinearLayout>
</FrameLayout>
Loading…
Cancel
Save