JZVideo
JZVideo copied to clipboard
全屏长按倍速如何实现呢
**需求描述
**其他app是否实现
**截图或者小视频说明 看到新版7.7有了倍速播放设置,想实现一下长按倍速播放,不知道怎么设置,,,求指点.
代码使用
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>
@zhangqifan1 自己写的长按2倍速,希望对大家有用
我把``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() 方法里就报错了...也没有具体的报错日志...注释掉就不报错了 不晓得咋回事...
"卸载init() " 啥意思?
...我这么写的报错了... 是不是这么不对着
看日志,请提供一下错误日志,你总不能让我猜吧
按理说这个继承的FramLayout 应该没问题啊 为啥报类型转换异常...
。。。 请提供一下你的 布局
` <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>
`
照抄的jzsdstdspeed 的布局 改了一下FramLayout->LongPressEventView
大佬我得吃饭去了,不能立马回复你了,我吃完就回来
你这布局对不上啊,报错说42行,你布局少发了吧
报错具体不到的,报错说的是我的引用
大佬你有没有Demo 我对比下哪不一样
破案了,我有个设置布局的方法没重写....它也没提示报错
啊这? 不戴耳机的时候长按倍速没问题, 戴耳机就会重置进度然后卡主 这这...
戴的酷狗无线蓝牙耳机 也有说是能量圈样式的~
那我不知道了,长按倍速根这个貌似没关系
戴上耳机看 Demo 的倍速是没有问题的,不晓得又是啥 ~
有一个bug...全屏暂停然后再点击屏幕,会重新播放,暂停图标没有变