Browse Source

视频点播

LAPTOP-K69FCNBP\crius 2 years ago
parent
commit
d8175b6462

+ 5 - 0
.idea/misc.xml

@@ -23,16 +23,21 @@
         <entry key="..\:/Progect/gitee/EffectDemo/app/src/main/res/layout/activity_view.xml" value="0.25" />
         <entry key="..\:/Progect/gitee/EffectDemo/app/src/main/res/layout/activity_web.xml" value="0.1816123188405797" />
         <entry key="..\:/Progect/gitee/EffectDemo/app/src/main/res/layout/demo_activity.xml" value="0.18020833333333333" />
+        <entry key="..\:/work/mozhi/qiqu/EffectDemo/app/src/main/res/drawable/check_box_bg.xml" value="0.1" />
         <entry key="..\:/work/mozhi/qiqu/EffectDemo/app/src/main/res/drawable/left_round_bg.xml" value="0.1355" />
         <entry key="..\:/work/mozhi/qiqu/EffectDemo/app/src/main/res/drawable/right_round_bg.xml" value="0.139" />
+        <entry key="..\:/work/mozhi/qiqu/EffectDemo/app/src/main/res/layout/activity_gsxy_video.xml" value="0.24179260031266284" />
         <entry key="..\:/work/mozhi/qiqu/EffectDemo/app/src/main/res/layout/activity_main.xml" value="0.20852641334569044" />
         <entry key="..\:/work/mozhi/qiqu/EffectDemo/app/src/main/res/layout/activity_map_challenge.xml" value="0.21241050119331742" />
         <entry key="..\:/work/mozhi/qiqu/EffectDemo/app/src/main/res/layout/activity_quxian.xml" value="0.8631178707224335" />
         <entry key="..\:/work/mozhi/qiqu/EffectDemo/app/src/main/res/layout/activity_test2.xml" value="0.2600652883569097" />
+        <entry key="..\:/work/mozhi/qiqu/EffectDemo/app/src/main/res/layout/activity_video_demand.xml" value="0.1" />
         <entry key="..\:/work/mozhi/qiqu/EffectDemo/app/src/main/res/layout/activity_word_cut.xml" value="0.42962962962962964" />
         <entry key="..\:/work/mozhi/qiqu/EffectDemo/app/src/main/res/layout/demo_activity.xml" value="0.35025641025641024" />
+        <entry key="..\:/work/mozhi/qiqu/EffectDemo/app/src/main/res/layout/item_video_demand.xml" value="0.3850877192982456" />
         <entry key="..\:/work/mozhi/qiqu/EffectDemo/app/src/main/res/layout/item_word_cut.xml" value="0.2577777777777778" />
         <entry key="..\:/work/mozhi/qiqu/EffectDemo/app/src/main/res/layout/view_linear.xml" value="0.17407407407407408" />
+        <entry key="..\:/work/mozhi/qiqu/EffectDemo/app/src/main/res/layout/view_video_demand.xml" value="0.22864583333333333" />
       </map>
     </option>
   </component>

+ 55 - 3
app/src/main/java/com/xunao/effectdemo/activity/VideoDemandActivity.java

@@ -1,20 +1,72 @@
 package com.xunao.effectdemo.activity;
 
-import androidx.appcompat.app.AppCompatActivity;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentActivity;
+import androidx.viewpager.widget.ViewPager;
 
-import android.app.Activity;
 import android.os.Bundle;
+import android.widget.ImageView;
 
 import com.xunao.effectdemo.R;
+import com.xunao.effectdemo.adapter.VideoDemandAdapter;
+import com.xunao.effectdemo.fragment.VideoDemandFragment;
+
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * 视频点播
  */
-public class VideoDemandActivity extends Activity {
+public class VideoDemandActivity extends FragmentActivity {
+
+    private ViewPager viewPager;
+    private String[] datas = {"a", "b", "c", "d", "e", "f"};
+
+    private List<Fragment> list;
+    private VideoDemandAdapter adapter;
+
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_video_demand);
+        initView();
     }
+
+    private void initView(){
+        viewPager = findViewById(R.id.view_pager);
+        //把Fragment添加到List集合里面
+        list = new ArrayList<>();
+        for(String data : datas){
+            VideoDemandFragment videoDemandFragment = new VideoDemandFragment();
+            Bundle bundle = new Bundle();
+            bundle.putString("data",data);
+            videoDemandFragment.setArguments(bundle);
+            list.add(videoDemandFragment);
+        }
+        adapter = new VideoDemandAdapter(getSupportFragmentManager(), list);
+//        viewPager.setAdapter(new VideoDemandAdapter(this, datas));
+        viewPager.setAdapter(adapter);
+        viewPager.setOffscreenPageLimit(datas.length);
+        viewPager.setCurrentItem(0);
+
+        // 上一个
+        ImageView tvPrevious = findViewById(R.id.tv_previous);
+        tvPrevious.setOnClickListener(v -> {
+            int current = viewPager.getCurrentItem();
+            if(current > 0){
+                viewPager.setCurrentItem(current - 1);
+            }
+        });
+
+        // 下一个
+        ImageView tvNext = findViewById(R.id.tv_next);
+        tvNext.setOnClickListener(v -> {
+            int current = viewPager.getCurrentItem();
+            if(current < datas.length - 1){
+                viewPager.setCurrentItem(current + 1);
+            }
+        });
+    }
+
 }

+ 36 - 0
app/src/main/java/com/xunao/effectdemo/adapter/VideoDemandAdapter.java

@@ -0,0 +1,36 @@
+package com.xunao.effectdemo.adapter;
+
+import android.content.Context;
+import android.view.View;
+import android.view.ViewGroup;
+
+import androidx.annotation.NonNull;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentManager;
+import androidx.fragment.app.FragmentPagerAdapter;
+import androidx.viewpager.widget.PagerAdapter;
+
+import com.xunao.effectdemo.R;
+
+import java.util.List;
+
+public class VideoDemandAdapter extends FragmentPagerAdapter {
+
+    private FragmentManager mfragmentManager;
+    private List<Fragment> mlist;
+
+    public VideoDemandAdapter(FragmentManager fm, List<Fragment> list) {
+        super(fm);
+        this.mlist = list;
+    }
+    //显示第几个页面
+    @Override
+    public Fragment getItem(int position) {
+        return mlist.get(position);
+    }
+    //一共有几个页面,注意,使用Fragment特有的构造器时,和ViewPager的原生构造器的方法不同
+    @Override
+    public int getCount() {
+        return mlist.size();
+    }
+}

+ 159 - 0
app/src/main/java/com/xunao/effectdemo/fragment/VideoDemandFragment.java

@@ -0,0 +1,159 @@
+package com.xunao.effectdemo.fragment;
+
+import static android.view.View.GONE;
+
+import android.animation.Animator;
+import android.animation.AnimatorInflater;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.AnimatorSet;
+import android.content.Context;
+import android.os.Bundle;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
+
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+
+import com.shuyu.gsyvideoplayer.GSYVideoManager;
+import com.shuyu.gsyvideoplayer.listener.GSYVideoProgressListener;
+import com.xunao.effectdemo.R;
+import com.xunao.effectdemo.view.VideoPreviewPlay;
+
+public class VideoDemandFragment extends Fragment {
+    private final String TAG = "VideoDemandFragment";
+
+    private AnimatorSet mRightOutSet; // 右出动画
+    private AnimatorSet mLeftInSet; // 左入动画
+    private RelativeLayout rlContainer;
+    private VideoPreviewPlay videoFront;
+    private TextView tvBack;
+    private boolean mIsShowBack = true;
+    private String url = "http://v3.cztv.com/cztv/vod/2018/06/28/7c45987529ea410dad7c088ba3b53dac/h264_1500k_mp4.mp4";
+    String data;
+
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+        View view = inflater.inflate(R.layout.view_video_demand, container, false);
+        videoFront = view.findViewById(R.id.video_front);
+        videoFront.setUp(url, true, "null");
+        videoFront.getTitleTextView().setVisibility(View.GONE);
+        videoFront.getFullscreenButton().setVisibility(View.GONE);
+        videoFront.getBackButton().setVisibility(GONE);
+        videoFront.setGSYVideoProgressListener(new GSYVideoProgressListener() {
+            @Override
+            public void onProgress(int progress, int secProgress, int currentPosition, int duration) {
+                Log.i(TAG, "onProgress:" +progress + "----" + secProgress + "----" + currentPosition + "---" + duration);
+                if(progress == 100){
+                    // 翻转到缩略图并且记录改项已完成
+                }
+            }
+        });
+//        videoFront.startPlayLogic();
+        tvBack = view.findViewById(R.id.tv_back);
+        rlContainer = view.findViewById(R.id.rl_container);
+        tvBack.setOnClickListener(v -> {
+            flipCard();
+        });
+        setAnimators(); // 设置动画
+        setCameraDistance(); // 设置镜头距离
+
+        assert getArguments() != null;
+        data = getArguments().getString("data");
+        return view;
+    }
+
+    // 设置动画
+    private void setAnimators() {
+        mRightOutSet = (AnimatorSet) AnimatorInflater.loadAnimator(getContext(), R.animator.anim_out);
+        mLeftInSet = (AnimatorSet) AnimatorInflater.loadAnimator(getContext(), R.animator.anim_in);
+
+        // 设置点击事件
+        mRightOutSet.addListener(new AnimatorListenerAdapter() {
+            @Override
+            public void onAnimationStart(Animator animation) {
+                super.onAnimationStart(animation);
+                tvBack.setClickable(false);
+            }
+        });
+        mLeftInSet.addListener(new AnimatorListenerAdapter() {
+            @Override
+            public void onAnimationEnd(Animator animation) {
+                super.onAnimationEnd(animation);
+                tvBack.setClickable(true);
+                tvBack.setVisibility(GONE);
+            }
+        });
+    }
+
+    // 改变视角距离, 贴近屏幕
+    private void setCameraDistance() {
+        int distance = 1000000;
+        float scale = getContext().getResources().getDisplayMetrics().density * distance;
+        videoFront.setCameraDistance(scale);
+        tvBack.setCameraDistance(scale);
+        Log.i(TAG, "setCameraDistance:改变视角距离" + scale);
+    }
+
+    // 翻转卡片
+    public void flipCard() {
+        // 正面朝上
+        if (!mIsShowBack) {
+            mRightOutSet.setTarget(videoFront);
+            mLeftInSet.setTarget(tvBack);
+            mRightOutSet.start();
+            mLeftInSet.start();
+            mIsShowBack = true;
+            Log.i(TAG, "flipCard:正面朝上");
+        } else { // 背面朝上
+            mRightOutSet.setTarget(tvBack);
+            mLeftInSet.setTarget(videoFront);
+            mRightOutSet.start();
+            mLeftInSet.start();
+            mIsShowBack = false;
+            Log.i(TAG, "flipCard:背面朝上");
+        }
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+        videoFront.onVideoResume();
+        Log.i(TAG, "onResume");
+    }
+
+    @Override
+    public void onPause() {
+        super.onPause();
+        videoFront.onVideoPause();
+        Log.i(TAG, "onPause");
+    }
+
+    @Override
+    public void onStop() {
+        super.onStop();
+        Log.i(TAG, "onStop");
+    }
+
+    @Override
+    public void onDestroy() {
+        super.onDestroy();
+        GSYVideoManager.releaseAllVideos();
+        Log.i(TAG, "onDestroy");
+    }
+
+
+    // 当前fragment 可见->不可见 或 不可见->可见时 会调用这个方法
+    @Override
+    public void setUserVisibleHint(boolean isVisibleToUser) {
+        super.setUserVisibleHint(isVisibleToUser);
+        Log.i(TAG, "setUserVisibleHint: " + isVisibleToUser + "--" + data);
+        if(!isVisibleToUser && videoFront != null){
+            videoFront.onVideoPause();
+        }
+    }
+}

+ 25 - 0
app/src/main/res/animator/anim_in.xml

@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<set xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <!--消失-->
+    <objectAnimator
+        android:duration="0"
+        android:propertyName="alpha"
+        android:valueFrom="1.0"
+        android:valueTo="0.0" />
+
+    <!--旋转-->
+    <objectAnimator
+        android:duration="@integer/anim_length"
+        android:propertyName="rotationY"
+        android:valueFrom="-180"
+        android:valueTo="0" />
+
+    <!--出现-->
+    <objectAnimator
+        android:duration="0"
+        android:propertyName="alpha"
+        android:startOffset="@integer/anim_half_length"
+        android:valueFrom="0.0"
+        android:valueTo="1.0" />
+</set>

+ 17 - 0
app/src/main/res/animator/anim_out.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<set xmlns:android="http://schemas.android.com/apk/res/android">
+    <!--旋转-->
+    <objectAnimator
+        android:duration="@integer/anim_length"
+        android:propertyName="rotationY"
+        android:valueFrom="0"
+        android:valueTo="180" />
+
+    <!--消失-->
+    <objectAnimator
+        android:duration="0"
+        android:propertyName="alpha"
+        android:startOffset="@integer/anim_half_length"
+        android:valueFrom="1.0"
+        android:valueTo="0.0" />
+</set>

BIN
app/src/main/res/drawable/next_icon.png


BIN
app/src/main/res/drawable/previous_icon.png


+ 20 - 3
app/src/main/res/layout/activity_video_demand.xml

@@ -1,9 +1,26 @@
 <?xml version="1.0" encoding="utf-8"?>
-<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<RelativeLayout 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"
     tools:context=".activity.VideoDemandActivity">
-
-</androidx.constraintlayout.widget.ConstraintLayout>
+    <ImageView
+        android:id="@+id/tv_previous"
+        android:layout_width="64dp"
+        android:layout_height="64dp"
+        android:src="@drawable/previous_icon"
+        android:layout_centerVertical="true"/>
+    <androidx.viewpager.widget.ViewPager
+        android:id="@+id/view_pager"
+        android:layout_width="400dp"
+        android:layout_height="300dp"
+        android:layout_centerInParent="true"/>
+    <ImageView
+        android:id="@+id/tv_next"
+        android:layout_width="64dp"
+        android:layout_height="64dp"
+        android:src="@drawable/next_icon"
+        android:layout_centerVertical="true"
+        android:layout_alignParentRight="true"/>
+</RelativeLayout>

+ 18 - 0
app/src/main/res/layout/view_video_demand.xml

@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/rl_container"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+    <com.xunao.effectdemo.view.VideoPreviewPlay
+        android:id="@+id/video_front"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"/>
+    <TextView
+        android:id="@+id/tv_back"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:background="@color/colorGrayDark"
+        android:gravity="center"
+        android:textSize="28sp"
+        android:text="背面"/>
+</RelativeLayout>

+ 5 - 0
app/src/main/res/values/Integers.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <integer name="anim_length">3000</integer>
+    <integer name="anim_half_length">1500</integer>
+</resources>