先放效果图

两个视频的地址:

private final String mp4_a = "http://vfx.mtime.cn/Video/2019/03/19/mp4/190319212559089721.mp4";//玩具总动员private final String mp4_b = "http://vfx.mtime.cn/Video/2019/03/13/mp4/190313094901111138.mp4";  //抓小偷

我的build.gradle版本

    compileSdkVersion 29buildToolsVersion "29.0.0"defaultConfig {applicationId "com.klod.t1"minSdkVersion 21targetSdkVersion 29versionCode 1versionName "1.0"testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"}

使用GSYVideoPlayer

     //完整版引入implementation 'com.shuyu:GSYVideoPlayer:7.0.1'implementation 'com.shuyu:gsyVideoPlayer-java:7.0.1'

实现上下滑自动播放视频只要一个Activity (先放主要代码,全部代码会在最下方给出)

1.layout只有一个RecyclerView 代码就不贴出了

2.设置RecyclerView

private void init() {recyclerView = findViewById(R.id.video_list);List_Video_Adapter list_video_adapter = new List_Video_Adapter(this, list);LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);//获取屏幕宽高DisplayMetrics dm = new DisplayMetrics();getWindowManager().getDefaultDisplay().getMetrics(dm);//自定播放帮助类 限定范围为屏幕一半的上下偏移180   括号里不用在意 因为是一个item一个屏幕scrollCalculatorHelper = new ScrollCalculatorHelper(R.id.list_video_player, dm.heightPixels / 2 - DpTools.dip2px(this, 180), dm.heightPixels / 2 + DpTools.dip2px(this, 180));//让RecyclerView有ViewPager的翻页效果PagerSnapHelper pagerSnapHelper = new PagerSnapHelper();pagerSnapHelper.attachToRecyclerView(recyclerView);//设置LayoutManager和AdapterrecyclerView.setLayoutManager(linearLayoutManager);recyclerView.setAdapter(list_video_adapter);//设置滑动监听recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {//第一个可见视图,最后一个可见视图int firstVisibleItem, lastVisibleItem;@Overridepublic void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {super.onScrollStateChanged(recyclerView, newState);//如果newState的状态==RecyclerView.SCROLL_STATE_IDLE;//播放对应的视频scrollCalculatorHelper.onScrollStateChanged(recyclerView, newState);}@Overridepublic void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {super.onScrolled(recyclerView, dx, dy);firstVisibleItem = linearLayoutManager.findFirstVisibleItemPosition();lastVisibleItem = linearLayoutManager.findLastVisibleItemPosition();Log.e("有几个item", firstVisibleItem + "    " + lastVisibleItem);//一屏幕显示一个item 所以固定1//实时获取设置 当前显示的GSYBaseVideoPlayer的下标scrollCalculatorHelper.onScroll(recyclerView, firstVisibleItem, lastVisibleItem, 1);}});}

3.  第2步里的scrollCalculatorHelper  是GSYVideoPlayer里的一个工具类 直接复制拿来用就行

package com.klod.t1.utils;import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.graphics.Rect;
import android.os.Handler;
import android.util.Log;
import android.widget.Toast;import androidx.recyclerview.widget.RecyclerView;import com.shuyu.gsyvideoplayer.utils.NetworkUtils;
import com.shuyu.gsyvideoplayer.video.base.GSYBaseVideoPlayer;/*** 计算滑动,自动播放的帮助类* Created by guoshuyu on 2017/11/2.*/public class ScrollCalculatorHelper {private int firstVisible = 0;private int lastVisible = 0;private int visibleCount = 0;private int playId;private int rangeTop;private int rangeBottom;private PlayRunnable runnable;private final String TAG = "ScrollCalculatorHelper";private Handler playHandler = new Handler();public ScrollCalculatorHelper(int playId, int rangeTop, int rangeBottom) {this.playId = playId;this.rangeTop = rangeTop;this.rangeBottom = rangeBottom;}public void onScrollStateChanged(RecyclerView view, int scrollState) {switch (scrollState) {case RecyclerView.SCROLL_STATE_IDLE:Log.e(TAG,"自动播放执行");playVideo(view);break;}}public void onScroll(RecyclerView view, int firstVisibleItem, int lastVisibleItem, int visibleItemCount) {if (firstVisible == firstVisibleItem) {return;}firstVisible = firstVisibleItem;lastVisible = lastVisibleItem;visibleCount = visibleItemCount;}private void playVideo(RecyclerView view) {if (view == null) {return;}RecyclerView.LayoutManager layoutManager = view.getLayoutManager();GSYBaseVideoPlayer gsyBaseVideoPlayer = null;boolean needPlay = false;Log.e(TAG,"自动播放执行 View未空"+visibleCount);for (int i = 0; i < visibleCount; i++) {if (layoutManager.getChildAt(i) != null && layoutManager.getChildAt(i).findViewById(playId) != null) {GSYBaseVideoPlayer player = layoutManager.getChildAt(i).findViewById(playId);Rect rect = new Rect();player.getLocalVisibleRect(rect);int height = player.getHeight();//说明第一个完全可视if (rect.top == 0 && rect.bottom == height) {gsyBaseVideoPlayer = player;if ((player.getCurrentPlayer().getCurrentState() == GSYBaseVideoPlayer.CURRENT_STATE_NORMAL|| player.getCurrentPlayer().getCurrentState() == GSYBaseVideoPlayer.CURRENT_STATE_ERROR)) {needPlay = true;}break;}}}if (gsyBaseVideoPlayer != null && needPlay) {if (runnable != null) {GSYBaseVideoPlayer tmpPlayer = runnable.gsyBaseVideoPlayer;playHandler.removeCallbacks(runnable);runnable = null;if (tmpPlayer == gsyBaseVideoPlayer) {return;}}Log.e(TAG,"自动播放执行 开始");runnable = new PlayRunnable(gsyBaseVideoPlayer);//降低频率playHandler.postDelayed(runnable, 400);}}private class PlayRunnable implements Runnable {GSYBaseVideoPlayer gsyBaseVideoPlayer;public PlayRunnable(GSYBaseVideoPlayer gsyBaseVideoPlayer) {this.gsyBaseVideoPlayer = gsyBaseVideoPlayer;}@Overridepublic void run() {boolean inPosition = false;//如果未播放,需要播放if (gsyBaseVideoPlayer != null) {int[] screenPosition = new int[2];gsyBaseVideoPlayer.getLocationOnScreen(screenPosition);int halfHeight = gsyBaseVideoPlayer.getHeight() / 2;int rangePosition = screenPosition[1] + halfHeight;//中心点在播放区域内if (rangePosition >= rangeTop && rangePosition <= rangeBottom) {inPosition = true;}if (inPosition) {startPlayLogic(gsyBaseVideoPlayer, gsyBaseVideoPlayer.getContext());//gsyBaseVideoPlayer.startPlayLogic();}}}}/***************************************自动播放的点击播放确认******************************************/private void startPlayLogic(GSYBaseVideoPlayer gsyBaseVideoPlayer, Context context) {if (!com.shuyu.gsyvideoplayer.utils.CommonUtil.isWifiConnected(context)) {//这里判断是否wifishowWifiDialog(gsyBaseVideoPlayer, context);return;}gsyBaseVideoPlayer.startPlayLogic();}private void showWifiDialog(final GSYBaseVideoPlayer gsyBaseVideoPlayer, Context context) {if (!NetworkUtils.isAvailable(context)) {Toast.makeText(context, context.getResources().getString(com.shuyu.gsyvideoplayer.R.string.no_net), Toast.LENGTH_LONG).show();return;}AlertDialog.Builder builder = new AlertDialog.Builder(context);builder.setMessage(context.getResources().getString(com.shuyu.gsyvideoplayer.R.string.tips_not_wifi));builder.setPositiveButton(context.getResources().getString(com.shuyu.gsyvideoplayer.R.string.tips_not_wifi_confirm), new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {dialog.dismiss();gsyBaseVideoPlayer.startPlayLogic();}});builder.setNegativeButton(context.getResources().getString(com.shuyu.gsyvideoplayer.R.string.tips_not_wifi_cancel), new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {dialog.dismiss();}});builder.create().show();}}

接下来做RecyclerView适配器
适配器的Item就一个StandardGSYVideoPlayer

xml:

<com.shuyu.gsyvideoplayer.video.StandardGSYVideoPlayerandroid:id="@+id/list_video_player"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_centerVertical="true"android:paddingBottom="20dp"/>

adapter:

package com.klod.t1.adapter;import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;import com.klod.t1.R;
import com.klod.t1.bean.Video_Bean;
import com.shuyu.gsyvideoplayer.GSYVideoManager;
import com.shuyu.gsyvideoplayer.builder.GSYVideoOptionBuilder;
import com.shuyu.gsyvideoplayer.listener.GSYSampleCallBack;
import com.shuyu.gsyvideoplayer.video.StandardGSYVideoPlayer;import java.util.HashMap;
import java.util.List;
import java.util.Map;public class List_Video_Adapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {private Context context;private List<Video_Bean> list;public static final String TAG = "ListNormalAdapter22";private GSYVideoOptionBuilder gsyVideoOptionBuilder;public List_Video_Adapter(Context context,List<Video_Bean> list) {this.context = context;this.list = list;}@NonNull@Overridepublic RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {return new ViewHolder(LayoutInflater.from(context).inflate(R.layout.list_video_item,parent,false));}@Overridepublic void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {ViewHolder vh = (ViewHolder) holder;Map<String, String> header = new HashMap<>();header.put("ee", "33");//配置视频播放器参数gsyVideoOptionBuilder.setIsTouchWiget(false).setUrl(list.get(position).getUrl()).setVideoTitle(list.get(position).getTitle()).setCacheWithPlay(false).setRotateViewAuto(true).setLockLand(true).setPlayTag(TAG).setMapHeadData(header).setShowFullAnimation(true).setNeedLockFull(true).setPlayPosition(position).setReleaseWhenLossAudio(false).setVideoAllCallBack(new GSYSampleCallBack() {@Overridepublic void onPrepared(String url, Object... objects) {super.onPrepared(url, objects);if (!vh.standardGSYVideoPlayer.isIfCurrentIsFullscreen()) {//静音//GSYVideoManager.instance().setNeedMute(true);}}@Overridepublic void onQuitFullscreen(String url, Object... objects) {super.onQuitFullscreen(url, objects);//全屏不静音//GSYVideoManager.instance().setNeedMute(true);}@Overridepublic void onEnterFullscreen(String url, Object... objects) {super.onEnterFullscreen(url, objects);GSYVideoManager.instance().setNeedMute(false);vh.standardGSYVideoPlayer.getCurrentPlayer().getTitleTextView().setText((String)objects[0]);}}).build(vh.standardGSYVideoPlayer);//设置返回键vh.standardGSYVideoPlayer.getBackButton().setVisibility(View.GONE);//设置全屏按键功能vh.standardGSYVideoPlayer.getFullscreenButton().setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {vh.standardGSYVideoPlayer.startWindowFullscreen(context, false, true);}});
//实现第一个视频自动播放if(position==0){vh.standardGSYVideoPlayer.startPlayLogic();}}@Overridepublic int getItemCount() {return list==null?0:list.size();}class ViewHolder extends RecyclerView.ViewHolder{private StandardGSYVideoPlayer standardGSYVideoPlayer;public ViewHolder(@NonNull View itemView) {super(itemView);gsyVideoOptionBuilder = new GSYVideoOptionBuilder();standardGSYVideoPlayer = itemView.findViewById(R.id.list_video_player);}}}

到这就实现了短视频软件上下滑自动播放视频
总体流程:
写布局=>写适配器=>写Activity逻辑

给出Activity全部代码:

package com.klod.t1.activity;import android.content.res.Configuration;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.WindowManager;import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.PagerSnapHelper;
import androidx.recyclerview.widget.RecyclerView;import com.klod.t1.R;
import com.klod.t1.adapter.List_Video_Adapter;
import com.klod.t1.bean.Video_Bean;
import com.klod.t1.utils.DpTools;
import com.klod.t1.utils.ScrollCalculatorHelper;
import com.klod.t1.utils.StatusBarUtil;
import com.shuyu.gsyvideoplayer.GSYVideoManager;import java.util.ArrayList;
import java.util.List;public class List_Video_Activity extends AppCompatActivity {private RecyclerView recyclerView;private final String mp4_a = "http://vfx.mtime.cn/Video/2019/03/19/mp4/190319212559089721.mp4";//玩具总动员private final String mp4_b = "http://vfx.mtime.cn/Video/2019/03/13/mp4/190313094901111138.mp4";  //抓小偷private List<Video_Bean> list;//控制滚动播放ScrollCalculatorHelper scrollCalculatorHelper;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.list_video_activity);StatusBarUtil.setColor(this, getResources().getColor(R.color.HaiPaiBlack));initData();init();}private void initData() {//视频数据list = new ArrayList<>();for (int i = 0; i < 10; i++) {Video_Bean video_bean = new Video_Bean();if (i % 2 == 0) {video_bean.setUrl(mp4_a);} else {video_bean.setUrl(mp4_b);}video_bean.setBitmap(ContextCompat.getDrawable(this, R.drawable.image));video_bean.setTitle("傀儡偶段のVideo  " + i);list.add(video_bean);}}private void init() {recyclerView = findViewById(R.id.video_list);List_Video_Adapter list_video_adapter = new List_Video_Adapter(this, list);LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);//获取屏幕宽高DisplayMetrics dm = new DisplayMetrics();getWindowManager().getDefaultDisplay().getMetrics(dm);//自定播放帮助类 限定范围为屏幕一半的上下偏移180   括号里不用在意 因为是一个item一个屏幕scrollCalculatorHelper = new ScrollCalculatorHelper(R.id.list_video_player, dm.heightPixels / 2 - DpTools.dip2px(this, 180), dm.heightPixels / 2 + DpTools.dip2px(this, 180));//让RecyclerView有ViewPager的翻页效果PagerSnapHelper pagerSnapHelper = new PagerSnapHelper();pagerSnapHelper.attachToRecyclerView(recyclerView);//设置LayoutManager和AdapterrecyclerView.setLayoutManager(linearLayoutManager);recyclerView.setAdapter(list_video_adapter);//设置滑动监听recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {//第一个可见视图,最后一个可见视图int firstVisibleItem, lastVisibleItem;@Overridepublic void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {super.onScrollStateChanged(recyclerView, newState);//如果newState的状态==RecyclerView.SCROLL_STATE_IDLE;//播放对应的视频scrollCalculatorHelper.onScrollStateChanged(recyclerView, newState);}@Overridepublic void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {super.onScrolled(recyclerView, dx, dy);firstVisibleItem = linearLayoutManager.findFirstVisibleItemPosition();lastVisibleItem = linearLayoutManager.findLastVisibleItemPosition();Log.e("有几个item", firstVisibleItem + "    " + lastVisibleItem);//一屏幕显示一个item 所以固定1//实时获取设置 当前显示的GSYBaseVideoPlayer的下标scrollCalculatorHelper.onScroll(recyclerView, firstVisibleItem, lastVisibleItem, 1);}});}@Overrideprotected void onResume() {super.onResume();GSYVideoManager.onResume();}@Overrideprotected void onPause() {super.onPause();GSYVideoManager.onPause();}@Overrideprotected void onDestroy() {super.onDestroy();GSYVideoManager.releaseAllVideos();}@Overridepublic void onConfigurationChanged(Configuration newConfig) {Configuration mConfiguration = this.getResources().getConfiguration();int ori = mConfiguration.orientation;if (ori == Configuration.ORIENTATION_LANDSCAPE) {getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); //隐藏状态栏} else if (ori == Configuration.ORIENTATION_PORTRAIT) {//当前为竖屏getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); //显示状态栏}super.onConfigurationChanged(newConfig);}
}

还有一个单位转换类:

public class DpTools {/*** 根据手机的分辨率从 dp 的单位 转成为 px(像素)*/public static int dip2px(Context context, float dpValue) {final float scale = context.getResources().getDisplayMetrics().density;return (int) (dpValue * scale + 0.5f);}/*** 根据手机的分辨率从 px(像素) 的单位 转成为 dp*/public static int px2dip(Context context, float pxValue) {final float scale = context.getResources().getDisplayMetrics().density;return (int) (pxValue / scale + 0.5f);}
}

补上 Bean的代码

public class Video_Bean implements Serializable {/*** 默认*/public static final long serialVersionUID = 1L;private String url;private String title;private Drawable bitmap;public Video_Bean() {}public Video_Bean(String url, String title, Drawable bitmap) {this.url = url;this.bitmap = bitmap;this.title = title;}public String getUrl() {return url;}public void setUrl(String url) {this.url = url;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public Drawable getBitmap() {return bitmap;}public void setBitmap(Drawable bitmap) {this.bitmap = bitmap;}
}

Android 基于GSYVideoPlayer实现短视频软件上下滑自动播放视频相关推荐

  1. mac iphone照片_如何在iPhone,iPad和Mac上禁用自动播放视频和实时照片

    mac iphone照片 Khamosh Pathak Khamosh Pathak Autoplaying videos and Live Photos can be nice to look at ...

  2. 自动点击器如何设置最快_微视APP如何设置自动播放视频-微视APP设置自动播放视频的方法...

    微视APP是一款功能实用的短视频软件,在手机上安装这款软件之后就可以在使用手机的时候点击打开微视,查看一些自己感兴趣的视频,现在很多视频应用都是采用滑动的方式来进行切换视频,如果用户的手不方便进行滑动 ...

  3. 开机自动播放视频,开机就自动播放视频,开机自动播放u盘视频

    因客户要求,开机自动播放视频,不需要电脑控制,通电自动循环播放视频. 电脑成本太高,最少也要800元,个头太大,解码也不是太好,控制不太方便, 于是就给客户推荐了一个'企鹅安卓机顶盒',个头小,解码速 ...

  4. html怎样自动播放视频,html5如何实现自动播放视频?

    慕标琳琳 HTML5 是下一代的 HTML, 提供了展示视频的标准,规定了一种通过 video 元素来包含视频的标准方法. Video有以下的属性.autoplay    autoplay    如果 ...

  5. Mac系统如何取消自动播放视频和实况照片?

    Mac系统是一款非常好用的电脑操作系统,在使用这款操作系统的过程中,当我们打开照片或者视频的时候,系统会自动播放视频以及实况照片.如果电脑连接的是数据流量,播放视频以及照片就会对流量造成很大的消耗,在 ...

  6. Mac中如何取消“自动播放视频和实况照片”的操作方法

    Mac系统是一款非常好用的电脑操作系统,在使用这款操作系统的过程中,当我们打开照片或者视频的时候,系统会自动播放视频以及实况照片.如果电脑连接的是数据流量,播放视频以及照片就会对流量造成很大的消耗,在 ...

  7. 如何阻止YouTube在iOS,Android和Web上自动播放视频

    Over at YouTube, they love it when you watch more YouTube. If you're sick of YouTube automatically q ...

  8. 迪士尼源码_如何在迪士尼+上禁用自动播放和背景视频

    迪士尼源码 Just like Netflix, Disney+ makes it easy to binge-watch a show by automatically playing the ne ...

  9. Android浏览器自动播放视频,HTML 5自动播放谷歌浏览器Android不播放

    我试图在用户在浏览器中打开网页时自动播放视频.在我的笔记本电脑上,自动播放适用于所有浏览器,但在Android上,它不适用于谷歌浏览器,在iphone中,它不适用于Safari浏览器.我已经做了一个搜 ...

最新文章

  1. 刚刚用华为鸿蒙跑了个“hello world”!跑通后,我特么开始怀疑人生....
  2. node.js:fs.open 和 fs.write 读取文件和改写文件
  3. python 渗透框架_Python渗透测试框架:PytheM
  4. 怎么把原来的墙拆掉_家装拆除不是简单的砸砸墙,它也是有技术的
  5. poj 3131 Cubic Eight-Puzzle 双向广搜 Hash判重
  6. 每天阅读一个 npm 模块(4)- throttle-debounce
  7. 南邮linux期末考试试题,南邮操作系统试卷及答案.doc
  8. java instanceof运算符_java的instanceof运算符
  9. 公众号和小程序可以同名了 名称支持同主体复用
  10. 技术水平低,就这还敢写自动化项目实战经验丰富?
  11. Python获取指定目录下文件数量及总大小
  12. LightOJ 1336 Sigma Function 算数基本定理
  13. 安卓问题报告小记(四):Some projects cannot be imported because they already exist in the workspace...
  14. 机器视觉——镜头介绍
  15. CodeForces - 3B Lorry【贪心】
  16. 使用Hourglass网络来理解人体姿态
  17. android系统自带分享图片到微信,通过intent和无障碍服务实现分享图片+文字到微信朋友圈...
  18. 给武则天找凤凰的java游戏_武则天称帝时,改国号为
  19. 【BW系列】SAP 讲讲BW/4 HANA和BW on HANA的区别
  20. c# web版本,进销存和财务管理业务系统 ERP系统源码

热门文章

  1. Linux系统下GiB和GB的换算详细解析
  2. 智能机器人技术综合实训课程说明
  3. 计算机如何性能测试,计算机性能测试
  4. Nature:地球微生物组计划首发成果
  5. win10升级win11后笔记本电脑充不了电解决方法
  6. 《财富》推荐的75本必读书
  7. 大华服务器维护常使用的命令,大华平台软件简介
  8. 如何优雅的使用RestTemplate
  9. android 霓虹灯效果
  10. [渝粤教育] 南京工业大学 有机化学实验 参考 资料