Jzvd / JZVideo

高度自定义的安卓视频框架 MediaPlayer exoplayer ijkplayer ffmpeg
MIT License
2.88k stars 523 forks source link

全屏长按倍速如何实现呢 #392

Open zhangqifan1 opened 3 years ago

zhangqifan1 commented 3 years ago

**需求描述

**其他app是否实现

**截图或者小视频说明 看到新版7.7有了倍速播放设置,想实现一下长按倍速播放,不知道怎么设置,,,求指点.

ZhuSky commented 3 years ago

代码使用

LongPressEventView viewLongPress = findViewById(R.id.surface_container);
viewLongPress.setLongPressEventListener(new LongPressEventView.LongPressEventListener() {
    @Override
    public void onLongClick(View v) {
        //震动反馈
        v.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS, HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING);
        if (mediaInterface != null) {
            mediaInterface.setSpeed(2);
        }
    }

    @Override
    public void onDisLongClick(View v) {
        if (mediaInterface != null) {
            mediaInterface.setSpeed(speed);
        }
      }
});

LongPressEventView 长按的监听代码

import android.content.Context;
import android.os.Handler;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.RelativeLayout;

import androidx.annotation.Nullable;

/**
 * @author abc
 * 长按事件的view
 */
public class LongPressEventView extends FrameLayout {

    private LongPressEventListener longPressEventListener;
    private boolean isScroll = false;
    private float downX;
    private float downY;

    public LongPressEventView(Context context) {
        super(context);
        initView();
    }

    public LongPressEventView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        initView();
    }

    public LongPressEventView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initView();
    }

    private void initView() {
    }

    public void setLongPressEventListener(LongPressEventListener longPressEventListener) {
        this.longPressEventListener = longPressEventListener;
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        return super.onInterceptTouchEvent(ev);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        isScroll = false;
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            downX = event.getX();
            downY = event.getY();
            handler.sendEmptyMessageDelayed(1, 800);
        } else if (event.getAction() == MotionEvent.ACTION_UP) {
            // 放开处理
            handler.removeMessages(1);
            handler.sendEmptyMessage(2);
        } else if (event.getAction() == MotionEvent.ACTION_MOVE) {
            if (Math.abs(downX - event.getX()) > 20 || Math.abs(downY - event.getY()) > 20) {
                //移动
                isScroll = true;
                handler.removeMessages(1);
            }
        }
        return super.onTouchEvent(event);
    }

    // 长按触发handle
    final Handler handler = new Handler(msg -> {
        if (isScroll) {
            return false;
        }
        if (msg.what == 1) {
            // 长按处理
            if (longPressEventListener != null) {
                longPressEventListener.onLongClick(this);
            }
        } else if (msg.what == 2) {
            // 取消长按了
            if (longPressEventListener != null) {
                longPressEventListener.onDisLongClick(this);
            }
        }
        return false;
    });

    public interface LongPressEventListener {

        /**
         * 长按监听
         *
         * @param v v
         */
        void onLongClick(View v);

        /**
         * 取消长按监听
         *
         * @param v v
         */
        void onDisLongClick(View v);
    }
}

布局使用

因为是继承JzvdStd自定义的播放器layout,所以直接替换原来的视频容器就行,surface_container不能变

<LongPressEventView
    android:id="@+id/surface_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

</LongPressEventView>
ZhuSky commented 3 years ago

@zhangqifan1 自己写的长按2倍速,希望对大家有用

zhangqifan1 commented 3 years ago

我把``LongPressEventView viewLongPress = findViewById(R.id.surface_container); viewLongPress.setLongPressEventListener(new LongPressEventView.LongPressEventListener() { @Override public void onLongClick(View v) { //震动反馈 v.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS, HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING); if (mediaInterface != null) { mediaInterface.setSpeed(2); tvSpeed.setVisibility(View.VISIBLE); } }

        @Override
        public void onDisLongClick(View v) {
            if (mediaInterface != null) {
                mediaInterface.setSpeed(1);
                tvSpeed.setVisibility(View.INVISIBLE);
            }
        }
    });

这个卸载init() 方法里就报错了...也没有具体的报错日志...注释掉就不报错了 不晓得咋回事...

ZhuSky commented 3 years ago

"卸载init() " 啥意思?

zhangqifan1 commented 3 years ago

图片

zhangqifan1 commented 3 years ago

...我这么写的报错了... 是不是这么不对着

ZhuSky commented 3 years ago

看日志,请提供一下错误日志,你总不能让我猜吧

zhangqifan1 commented 3 years ago

图片 图片

zhangqifan1 commented 3 years ago

按理说这个继承的FramLayout 应该没问题啊 为啥报类型转换异常...

ZhuSky commented 3 years ago

。。。 请提供一下你的 布局

zhangqifan1 commented 3 years ago

`<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/black" android:descendantFocusability="afterDescendants">

<com.as.apprehendschool.customviews.jzvideoplayer.LongPressEventView
    android:id="@+id/surface_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

</com.as.apprehendschool.customviews.jzvideoplayer.LongPressEventView>

<ImageView
    android:id="@+id/poster"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_alignParentStart="true"
    android:layout_alignParentLeft="true"
    android:layout_alignParentBottom="true"
    android:adjustViewBounds="true"
    android:background="#000000"
    android:scaleType="fitXY" />

<LinearLayout
    android:id="@+id/layout_bottom"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:layout_alignParentBottom="true"
    android:background="@drawable/jz_bottom_bg"
    android:gravity="center_vertical"
    android:orientation="horizontal"
    android:visibility="invisible">

    <TextView
        android:id="@+id/current"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="14dp"
        android:text="00:00"
        android:textColor="#ffffff" />

    <SeekBar
        android:id="@+id/bottom_seek_progress"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_weight="1.0"
        android:background="@null"
        android:max="100"
        android:maxHeight="1dp"
        android:minHeight="1dp"
        android:paddingLeft="12dp"
        android:paddingTop="8dp"
        android:paddingRight="12dp"
        android:paddingBottom="8dp"
        android:progressDrawable="@drawable/jz_bottom_seek_progress"
        android:thumb="@drawable/jz_bottom_seek_poster" />

    <TextView
        android:id="@+id/total"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="00:00"
        android:textColor="#ffffff" />

    <TextView
        android:id="@+id/clarity"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:clickable="true"
        android:paddingLeft="20dp"
        android:text="clarity"

        android:textAlignment="center"
        android:textColor="#ffffff" />

    <ImageView
        android:id="@+id/fullscreen"
        android:layout_width="52.5dp"
        android:layout_height="fill_parent"
        android:paddingLeft="14dp"
        android:paddingRight="14dp"
        android:scaleType="centerInside"
        android:src="@drawable/jz_enlarge" />
</LinearLayout>

<ProgressBar
    android:id="@+id/bottom_progress"
    style="?android:attr/progressBarStyleHorizontal"
    android:layout_width="match_parent"
    android:layout_height="1.5dp"
    android:layout_alignParentBottom="true"
    android:max="100"
    android:progressDrawable="@drawable/jz_bottom_progress" />

<ImageView
    android:id="@+id/back_tiny"
    android:layout_width="24dp"
    android:layout_height="24dp"
    android:layout_marginLeft="6dp"
    android:layout_marginTop="6dp"
    android:background="@drawable/jz_click_back_tiny_selector"
    android:visibility="gone" />

<RelativeLayout
    android:id="@+id/layout_top"
    android:layout_width="match_parent"
    android:layout_height="48dp"
    android:layout_alignParentStart="true"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:background="@drawable/jz_title_bg"
    android:paddingStart="10dp"
    android:paddingLeft="10dp"
    android:visibility="gone">

    <ImageView
        android:id="@+id/back"
        android:layout_width="26dp"
        android:layout_height="26dp"
        android:layout_alignParentStart="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginTop="12dp"
        android:padding="3dp"
        android:scaleType="centerInside"
        android:src="@drawable/jz_click_back_selector" />

    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_marginEnd="12dp"
        android:layout_marginRight="12dp"
        android:layout_toLeftOf="@+id/battery_time_layout"
        android:layout_toEndOf="@+id/back"
        android:layout_toRightOf="@+id/back"
        android:ellipsize="end"
        android:maxLines="2"
        android:textColor="#ffffff"
        android:textSize="18sp" />

    <LinearLayout
        android:id="@+id/battery_time_layout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:layout_marginEnd="14dp"
        android:layout_marginRight="14dp"
        android:gravity="center_vertical"
        android:orientation="vertical"
        android:visibility="invisible">

        <ImageView
            android:id="@+id/battery_level"
            android:layout_width="23dp"
            android:layout_height="10dp"
            android:layout_gravity="center_horizontal"
            android:background="@drawable/jz_battery_level_10" />

        <TextView
            android:id="@+id/video_current_time"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:gravity="center_vertical"
            android:maxLines="1"
            android:textColor="#ffffffff"
            android:textSize="12.0sp" />
    </LinearLayout>

    <TextView
        android:id="@+id/tv_speed"
        android:layout_width="42dp"
        android:layout_height="60dp"
        android:layout_centerVertical="true"
        android:layout_marginEnd="13dp"
        android:layout_marginRight="13dp"
        android:layout_toStartOf="@+id/battery_time_layout"
        android:layout_toLeftOf="@+id/battery_time_layout"
        android:gravity="center"
        android:text="2.0倍速"
        android:textColor="#ffffffff" />

</RelativeLayout>

<ProgressBar
    android:id="@+id/loading"
    android:layout_width="@dimen/jz_start_button_w_h_normal"
    android:layout_height="@dimen/jz_start_button_w_h_normal"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true"
    android:indeterminateDrawable="@drawable/jz_loading"
    android:visibility="invisible" />

<LinearLayout
    android:id="@+id/start_layout"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true"
    android:layout_gravity="center_vertical">

    <ImageView
        android:id="@+id/start"
        android:layout_width="@dimen/jz_start_button_w_h_normal"
        android:layout_height="@dimen/jz_start_button_w_h_normal"
        android:src="@drawable/jz_click_play_selector" />
</LinearLayout>

<TextView
    android:id="@+id/replay_text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/start_layout"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="6dp"
    android:text="@string/replay"
    android:textColor="#ffffff"
    android:textSize="12sp"
    android:visibility="invisible" />

<LinearLayout
    android:id="@+id/retry_layout"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true"
    android:gravity="center_horizontal"
    android:orientation="vertical"
    android:visibility="invisible">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/video_loading_failed"
        android:textColor="@android:color/white"
        android:textSize="14sp" />

    <TextView
        android:id="@+id/retry_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="15dp"
        android:background="@drawable/jz_retry"
        android:paddingLeft="9dp"
        android:paddingTop="4dp"
        android:paddingRight="9dp"
        android:paddingBottom="4dp"
        android:text="@string/click_to_restart"
        android:textColor="@android:color/white"
        android:textSize="14sp" />
</LinearLayout>

`

zhangqifan1 commented 3 years ago

照抄的jzsdstdspeed 的布局 改了一下FramLayout->LongPressEventView

zhangqifan1 commented 3 years ago

大佬我得吃饭去了,不能立马回复你了,我吃完就回来

ZhuSky commented 3 years ago

你这布局对不上啊,报错说42行,你布局少发了吧

zhangqifan1 commented 3 years ago

报错具体不到的,报错说的是我的引用

zhangqifan1 commented 3 years ago

大佬你有没有Demo 我对比下哪不一样

zhangqifan1 commented 3 years ago

破案了,我有个设置布局的方法没重写....它也没提示报错

zhangqifan1 commented 3 years ago

啊这? 不戴耳机的时候长按倍速没问题, 戴耳机就会重置进度然后卡主 这这...

zhangqifan1 commented 3 years ago

戴的酷狗无线蓝牙耳机 也有说是能量圈样式的~

ZhuSky commented 3 years ago

那我不知道了,长按倍速根这个貌似没关系

zhangqifan1 commented 3 years ago

戴上耳机看 Demo 的倍速是没有问题的,不晓得又是啥 ~

zhangqifan1 commented 3 years ago

有一个bug...全屏暂停然后再点击屏幕,会重新播放,暂停图标没有变