JCVideoPlayerStandard是一个使用很简单的视频开源库,而且功能很强大,3行代码实现简单的视频播放
特征:
- 视频全屏和浮动小窗口
- 完全定制ui
- 在
ListView
,ViewPager
和ListView
,ViewPager
和Fragment
其他嵌套片段和视图的情况下,它工作得很好 - Gestrues修改进度和音量
- 适应屏幕尺寸,其中至少视频的宽度或长度是自适应的,而另一个在屏幕上居中
- 进入或退出全屏时不会打扰或改变播放状态
- 重力传感器全自动全屏
- 具有本地视频控制的WebView
- 支持https和rtsp
- 小于100kb
GitHub:https://github.com/lipangit/JieCaoVideoPlayer
效果图(在Listview显示每个视频): 结构图:
还是相同的套路,先使用okhttp获取到json数据,然后解析json数据显示到listview上,这里会使用到okhttp(网络请求库)、Picasso(图片缓存库)和jiecaovideoplayer(视频播放库)
1、导入相应的库
okhttp
Picasso
jiecaovideoplayer
2、activity_main布局添加listview
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.wdl.video_demo.MainActivity"> <ListView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/lv" /> </LinearLayout>
3、创建listview的item布局lv_item.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <fm.jiecao.jcvideoplayer_lib.JCVideoPlayerStandard android:layout_marginTop="5dp" android:id="@+id/videoplayer" android:layout_width="match_parent" android:layout_height="200dp"/> </LinearLayout>
4、MainActivity.java
public class MainActivity extends AppCompatActivity { public ListView lv; String date; public video_item video; public ArrayList<Map<String, Object>> list = new ArrayList<>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //listview控件 lv = (ListView) findViewById(R.id.lv); //获取到json数据 initdate(); } private void initdate() { list.clear(); //线程 new Thread(new Runnable() { @Override public void run() { OkHttpClient okHttpClient=new OkHttpClient(); //服务器返回的地址 Request request=new Request.Builder() .url("http://192.168.1.6:8080/date.json").build(); try { Response response=okHttpClient.newCall(request).execute(); //得到数据 date=response.body().string(); //打印出是否得到数据,因为线程中无法执行主线程操作所以我们使用handler Message mes=new Message(); mes.what=2; handler.sendMessage(mes); //解析json数据 JsonJX(date); } catch (IOException e) { e.printStackTrace(); } } }).start(); } public void JsonJX(String date) { //数据是否为空 if (date != null) { try { //数据的解析 JSONObject video_object = new JSONObject(date); String flag = video_object.getString("flag"); if (flag.equals("success")) { JSONArray array = video_object.getJSONArray("activity"); for (int i = 0; i < array.length(); i++) { JSONObject object = array.getJSONObject(i); String video_titie=object.getString("video_title"); String video_url=object.getString("video_url"); String video_pic=object.getString("video_pic"); //存入Map Map<String,Object> map=new HashMap<>(); map.put("title",video_titie); map.put("url",video_url); map.put("pic",video_pic); list.add(map); } } //调用适配器 Message mes=new Message(); mes.what=1; handler.sendMessage(mes); } catch (JSONException e) { e.printStackTrace(); } } else { Message mes=new Message(); mes.what=3; handler.sendMessage(mes); } } public Handler handler=new Handler(){ @Override public void handleMessage(Message msg) { switch (msg.what){ case 1: video=new video_item(MainActivity.this,list); lv.setAdapter(video); break; case 2: Log.i("TAG","-------------"+date); break; case 3: Toast.makeText(MainActivity.this,"数据是空的!",Toast.LENGTH_LONG).show(); break; } } }; //监听返回键如果不写视频播放在全屏时点击返回则直接退出. @Override public void onBackPressed() { if (JCVideoPlayer.backPress()) { return; } super.onBackPressed(); } @Override protected void onPause() { super.onPause(); JCVideoPlayer.releaseAllVideos(); } }
5、创建适配器video_item
public class video_item extends BaseAdapter { public Context con; public ArrayList<Map<String,Object>> list; public LayoutInflater inflater; public video_item(Context context, ArrayList<Map<String,Object>> list){ this.con=context; this.list=list; this.inflater=LayoutInflater.from(con); } @Override public int getCount() { return list.size(); } @Override public Object getItem(int position) { return list.get(position); } @Override public long getItemId(int position) { return position; } @TargetApi(Build.VERSION_CODES.LOLLIPOP) @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView==null){ holder=new ViewHolder(); convertView=inflater.inflate(R.layout.lv_item,null); holder.jcVideoPlayerStandard= (JCVideoPlayerStandard) convertView.findViewById(R.id.videoplayer); convertView.setTag(holder); }else{ holder= (ViewHolder) convertView.getTag(); } //加载视频 holder.jcVideoPlayerStandard.setUp(list.get(position).get("url").toString(), JCVideoPlayerStandard.SCREEN_LAYOUT_NORMAL, list.get(position).get("title").toString()); //判断获取的图片是否为空 if (TextUtils.isEmpty(list.get(position).get("pic").toString())){ //空时 Picasso .with(con) .cancelRequest(holder.jcVideoPlayerStandard.thumbImageView); holder.jcVideoPlayerStandard.thumbImageView. setImageDrawable(con.getResources(). getDrawable(R.mipmap.f));//当图片为空时显示的图片 }else { //这需要的图片是显示在视频没播放的情况下显示的图片 Picasso .with(con) .load(list.get(position).get("pic").toString()) .placeholder(con.getResources().getDrawable(R.mipmap.timg))//图片加载中显示 .into(holder.jcVideoPlayerStandard.thumbImageView); } return convertView; } class ViewHolder{ JCVideoPlayerStandard jcVideoPlayerStandard; } }
最后一步网络权限添加:
<uses-permission android:name="android.permission.INTERNET" />
作者:qq_26650589 发表于2017/9/4 11:43:29 原文链接
阅读:84 评论:0 查看评论