瀏覽代碼

完善视频操作流程,添加编辑视频界面

zengjiebin 7 年之前
父節點
當前提交
eef6ff9425

+ 5 - 0
app/src/main/AndroidManifest.xml

@@ -448,6 +448,11 @@
             android:screenOrientation="user"
             android:theme="@style/AppTheme.noTitleBar" />
         <activity
+            android:name="com.sheep.gamegroup.view.activity.ActCutVideo"
+            android:configChanges="orientation|keyboardHidden|navigation|screenSize"
+            android:screenOrientation="portrait"
+            android:theme="@style/AppTheme.noTitleBar" />
+        <activity
             android:name="com.sheep.gamegroup.view.activity.ActEditVideo"
             android:configChanges="orientation|keyboardHidden|navigation|screenSize"
             android:screenOrientation="user"

+ 1 - 3
app/src/main/java/cn/finalteam/rxgalleryfinal/utils/MediaUtils.java

@@ -81,9 +81,7 @@ public class MediaUtils {
                 cursor.moveToFirst();
                 do {
                     MediaBean mediaBean = parseImageCursorAndCreateThumImage(context, cursor);
-                    if (mediaBean != null) {
-                        mediaBeanList.add(mediaBean);
-                    }
+                    mediaBeanList.add(mediaBean);
                 } while (cursor.moveToNext());
             }
         }

+ 8 - 3
app/src/main/java/com/sheep/gamegroup/absBase/AbsApiRefresh.java

@@ -1,6 +1,8 @@
 package com.sheep.gamegroup.absBase;
 
+import com.alibaba.fastjson.JSONObject;
 import com.sheep.gamegroup.util.ListUtil;
+import com.sheep.gamegroup.util.LogUtil;
 import com.sheep.gamegroup.view.fragment.BaseListFragment6;
 
 import java.util.ArrayList;
@@ -30,11 +32,12 @@ public abstract class AbsApiRefresh<T> implements IApiRefresh {
     }
 
     //还有数据没有获取
-    private boolean hasMore() {
+    protected boolean hasMore() {
         return ListUtil.size(list) >= per_page * page;
     }
 
     protected void loadList(List<T> newList) {
+        LogUtil.println(AbsApiRefresh.class.getSimpleName(), "loadList", JSONObject.toJSONString(newList));
         list.addAll(newList);
         notifyDataSetChanged();
     }
@@ -43,6 +46,7 @@ public abstract class AbsApiRefresh<T> implements IApiRefresh {
         if (baseListFragment6 != null)
             baseListFragment6.notifyDataSetChanged(page, hasMore());
     }
+
     @Override
     public void clear() {
         list.clear();
@@ -55,10 +59,11 @@ public abstract class AbsApiRefresh<T> implements IApiRefresh {
             loadMore = true;
             if (hasMore()) {
                 page += 1;
+                LogUtil.println(AbsApiRefresh.class.getSimpleName(), "loadMoreData", "hasMore", page);
                 initData();
             } else {
-                if (baseListFragment6 != null)
-                    baseListFragment6.notifyDataSetChanged(page, hasMore());
+                LogUtil.println(AbsApiRefresh.class.getSimpleName(), "loadMoreData", "noMore", page);
+                notifyDataSetChanged();
             }
         }
     }

+ 48 - 0
app/src/main/java/com/sheep/gamegroup/absBase/CheckErrorApiRefresh.java

@@ -0,0 +1,48 @@
+package com.sheep.gamegroup.absBase;
+
+import com.sheep.gamegroup.util.ListUtil;
+import com.sheep.gamegroup.view.fragment.BaseListFragment6;
+
+import java.util.List;
+
+/**
+ * Created by realicing on 2018/11/30.
+ * realicing@sina.com
+ * 可以排除无效数据
+ */
+public abstract class CheckErrorApiRefresh<T> extends AbsApiRefresh<T> {
+
+    public CheckErrorApiRefresh(BaseListFragment6 baseListFragment6) {
+        super(baseListFragment6);
+    }
+
+    private int errorCount = 0;//错误数据个数
+
+    @Override
+    public void clear() {
+        errorCount = 0;
+        super.clear();
+    }
+
+    @Override
+    protected void loadList(List<T> newList) {
+        ListUtil.removeItem(newList, new ListUtil.CallBack<T, Boolean>() {
+            @Override
+            public Boolean call(T mediaBean) {
+                boolean result = isRightData(mediaBean);
+                if (!result) {//错误数据,删除,并记录个数
+                    errorCount++;
+                }
+                return !result;
+            }
+        });
+        super.loadList(newList);
+    }
+
+    protected abstract boolean isRightData(T item);
+
+    @Override
+    protected boolean hasMore() {//有错误数据,删除后翻页就不正常了,要加上
+        return ListUtil.size(list) + errorCount >= per_page * page;
+    }
+}

+ 14 - 3
app/src/main/java/com/sheep/gamegroup/find/activity/ActMediaChoose.java

@@ -14,6 +14,8 @@ import com.sheep.gamegroup.find.fragment.FgtMediaPickerImg;
 import com.sheep.gamegroup.find.fragment.FgtMediaPickerVideo;
 import com.sheep.gamegroup.util.CommonUtil;
 import com.sheep.gamegroup.util.DataUtil;
+import com.sheep.gamegroup.util.TestUtil;
+import com.sheep.gamegroup.util.ViewUtil;
 import com.sheep.gamegroup.view.adapter.TitleFragmentListAdapter;
 import com.sheep.jiuyan.samllsheep.R;
 import com.sheep.jiuyan.samllsheep.utils.TitleBarUtils;
@@ -40,6 +42,8 @@ public class ActMediaChoose extends BaseActivity {
 
     @BindView(R.id.indicator)
     TabLayout indicator;
+    @BindView(R.id.below_tab_line)
+    View below_tab_line;
     @BindView(R.id.viewPager)
     ViewPager viewPager;
 
@@ -47,22 +51,29 @@ public class ActMediaChoose extends BaseActivity {
     @Override
     public void initView() {
         TitleBarUtils.getInstance().setTitle(this, "选择媒体")
-                .setTitleFinish(this).setRightImgBotton(this, R.drawable.ic_play_but_image, new View.OnClickListener() {
+                .setTitleFinish(this).setRightImgBotton(this, R.mipmap.ic_open_camera, new View.OnClickListener() {
             @Override
             public void onClick(View view) {
 //                Jump2View.getInstance().goActEditVideo(video);
-                MediaUtils.openCamera(ActMediaChoose.this, true);
+                boolean isVideo = mAdapter.getItem(viewPager.getCurrentItem()) instanceof FgtMediaPickerVideo;
+                MediaUtils.openCamera(ActMediaChoose.this, !isVideo);
             }
         });
 
         mAdapter = new TitleFragmentListAdapter(getSupportFragmentManager());
         mAdapter.add(new FgtMediaPickerVideo(), "视频");
-        mAdapter.add(new FgtMediaPickerImg(), "图片");
+        if(TestUtil.isDev()) {
+            mAdapter.add(new FgtMediaPickerImg(), "图片");
+        }
         viewPager.setAdapter(mAdapter);
         indicator.setupWithViewPager(viewPager);
         viewPager.setCurrentItem(0);
         viewPager.setOffscreenPageLimit(mAdapter.getCount());
         CommonUtil.getInstance().reflex(indicator, this);
+        if(mAdapter.getCount() < 2){
+            ViewUtil.setVisibility(indicator, false);
+            ViewUtil.setVisibility(below_tab_line, false);
+        }
 //        Integer type = DataUtil.getObject(getIntent(), Integer.class);
 //        if(type != null){
 //            switch (type){

+ 6 - 2
app/src/main/java/com/sheep/gamegroup/find/fragment/FgtMediaPickerImg.java

@@ -9,9 +9,9 @@ import com.chad.library.adapter.base.BaseQuickAdapter;
 import com.chad.library.adapter.base.BaseViewHolder;
 import com.sheep.gamegroup.absBase.AbsApiRefresh;
 import com.sheep.gamegroup.absBase.AbsObserver;
+import com.sheep.gamegroup.absBase.CheckErrorApiRefresh;
 import com.sheep.gamegroup.absBase.IApiRefresh;
 import com.sheep.gamegroup.model.entity.Lp;
-import com.sheep.gamegroup.util.TestUtil;
 import com.sheep.gamegroup.util.ViewUtil;
 import com.sheep.gamegroup.util.viewHelper.LayoutParamsUtil;
 import com.sheep.gamegroup.view.fragment.BaseListFragment6;
@@ -77,7 +77,11 @@ public class FgtMediaPickerImg extends BaseListFragment6<MediaBean> {
 
     @Override
     protected void addApiRefresh(List<IApiRefresh> apiRefreshList) {
-        apiRefresh = new AbsApiRefresh<MediaBean>(this) {
+        apiRefresh = new CheckErrorApiRefresh<MediaBean>(this) {
+            @Override
+            protected boolean isRightData(MediaBean item) {
+                return item != null && item.getWidth() > 0 && item.getHeight() > 0;
+            }
             @Override
             public void initData() {
                 Observable.create(new ObservableOnSubscribe<List<MediaBean>>() {

+ 26 - 2
app/src/main/java/com/sheep/gamegroup/find/fragment/FgtMediaPickerVideo.java

@@ -3,7 +3,7 @@ package com.sheep.gamegroup.find.fragment;
 
 import android.support.v7.widget.RecyclerView;
 import android.support.v7.widget.StaggeredGridLayoutManager;
-import android.util.LongSparseArray;
+import android.view.View;
 import android.widget.ImageView;
 import android.widget.TextView;
 
@@ -11,8 +11,12 @@ import com.chad.library.adapter.base.BaseQuickAdapter;
 import com.chad.library.adapter.base.BaseViewHolder;
 import com.sheep.gamegroup.absBase.AbsApiRefresh;
 import com.sheep.gamegroup.absBase.AbsObserver;
+import com.sheep.gamegroup.absBase.CheckErrorApiRefresh;
 import com.sheep.gamegroup.absBase.IApiRefresh;
 import com.sheep.gamegroup.model.entity.Lp;
+import com.sheep.gamegroup.model.entity.Video;
+import com.sheep.gamegroup.util.Jump2View;
+import com.sheep.gamegroup.util.ListUtil;
 import com.sheep.gamegroup.util.TimeUtil;
 import com.sheep.gamegroup.util.ViewUtil;
 import com.sheep.gamegroup.util.viewHelper.LayoutParamsUtil;
@@ -70,11 +74,30 @@ public class FgtMediaPickerVideo extends BaseListFragment6<MediaBean> {
         };
     }
 
+    @Override
+    public void initListener() {
+        super.initListener();
+        baseQuickAdapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() {
+            @Override
+            public void onItemClick(BaseQuickAdapter adapter, View view, int position) {
+                MediaBean item = ListUtil.getItem(apiRefresh.getList(), position);
+                if (item != null)
+                    Jump2View.getInstance().goActCutVideo(Video.from(item));
+            }
+        });
+
+    }
+
     private AbsApiRefresh<MediaBean> apiRefresh;
 
     @Override
     protected void addApiRefresh(List<IApiRefresh> apiRefreshList) {
-        apiRefresh = new AbsApiRefresh<MediaBean>(this) {
+        apiRefresh = new CheckErrorApiRefresh<MediaBean>(this) {
+            @Override
+            protected boolean isRightData(MediaBean item) {
+                return item != null && item.getWidth() > 0 && item.getHeight() > 0;
+            }
+
             @Override
             public void initData() {
                 Observable.create(new ObservableOnSubscribe<List<MediaBean>>() {
@@ -92,6 +115,7 @@ public class FgtMediaPickerVideo extends BaseListFragment6<MediaBean> {
                             }
                         });
             }
+
         };
         apiRefreshList.add(apiRefresh);
     }

+ 13 - 0
app/src/main/java/com/sheep/gamegroup/model/entity/Video.java

@@ -2,6 +2,8 @@ package com.sheep.gamegroup.model.entity;
 
 import java.io.Serializable;
 
+import cn.finalteam.rxgalleryfinal.bean.MediaBean;
+
 /**
  * Created by realicing on 2018/11/30.
  * realicing@sina.com
@@ -54,4 +56,15 @@ public class Video implements Serializable {
     public void setTopicId(int topicId) {
         this.topicId = topicId;
     }
+
+
+    //通过MediaBean获取Video
+    public static Video from(MediaBean item) {
+        Video video = new Video();
+        video.setWidth(item.getWidth());
+        video.setHeight(item.getHeight());
+        video.setDuration(item.getDuration());
+        video.setFilePath(item.getOriginalPath());
+        return video;
+    }
 }

+ 12 - 0
app/src/main/java/com/sheep/gamegroup/util/Jump2View.java

@@ -54,6 +54,7 @@ import com.sheep.gamegroup.view.activity.ActCoinCenter;
 import com.sheep.gamegroup.view.activity.ActCommentGameApp;
 import com.sheep.gamegroup.view.activity.ActCreditCardTaskList;
 import com.sheep.gamegroup.view.activity.ActCreditCardWeb;
+import com.sheep.gamegroup.view.activity.ActCutVideo;
 import com.sheep.gamegroup.view.activity.ActDownloadWelfareList;
 import com.sheep.gamegroup.view.activity.ActEditVideo;
 import com.sheep.gamegroup.view.activity.ActEntertainmentLuckDraw;
@@ -2260,6 +2261,17 @@ public class Jump2View {
     }
 
     /**
+     * 剪切视频
+     *
+     * @param data 视频数据,包括地址与时长,宽高等
+     */
+    public void goActCutVideo(Video data) {
+        Activity activity = ActivityManager.getInstance().currentActivity();
+        Intent intent = new Intent(activity, ActCutVideo.class);
+        DataUtil.putObject(intent, data);
+        activity.startActivity(intent);
+    }
+    /**
      * 编辑视频
      *
      * @param data 视频数据,包括地址与时长,宽高等

+ 35 - 1
app/src/main/java/com/sheep/gamegroup/util/MediaMetadataRetrieverUtil.java

@@ -107,6 +107,35 @@ public class MediaMetadataRetrieverUtil {
                 });
 
     }
+    /**
+     * 取出视频文件中的图片帧列表
+     */
+    public void initRv2(final RecyclerView recyclerView) {
+        Observable.create(new ObservableOnSubscribe<List<String>>() {
+            @Override
+            public void subscribe(ObservableEmitter<List<String>> emitter) throws Exception {
+                emitter.onNext(getFrameFileList(fromFile, outDir, duration, size));
+            }
+        })
+                .subscribeOn(Schedulers.io())
+                .observeOn(AndroidSchedulers.mainThread())
+                .subscribe(new AbsObserver<List<String>>() {
+                    @Override
+                    public void onNext(final List<String> strings) {
+                        recyclerView.setLayoutManager(new GridLayoutManager(SheepApp.getInstance(), size));
+                        BaseQuickAdapter<String, BaseViewHolder> baseQuickAdapter = new BaseQuickAdapter<String, BaseViewHolder>(R.layout.item_iv_mh, strings) {
+                            @Override
+                            protected void convert(BaseViewHolder helper, String item) {
+                                ImageView imageView = helper.getView(R.id.item_iv);
+                                ViewUtil.setImagePath(imageView, item);
+                                Jump2View.getInstance().showImgList(ActivityManager.getInstance().currentActivity(), helper.getAdapterPosition(), (ArrayList<String>) strings);
+                            }
+                        };
+                        recyclerView.setAdapter(baseQuickAdapter);
+                    }
+                });
+
+    }
 
 
     public static String getFilePath(String fromFile, String outDir, int index) {
@@ -130,7 +159,12 @@ public class MediaMetadataRetrieverUtil {
         long time = System.currentTimeMillis();
         MediaMetadataRetriever metadataRetriever = new MediaMetadataRetriever();
         metadataRetriever.setDataSource(fromFile);
-
+        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.P) {
+            MediaMetadataRetriever.BitmapParams bitmapParams = new MediaMetadataRetriever.BitmapParams();
+            Bitmap.Config config = Bitmap.Config.ARGB_8888;
+            bitmapParams.setPreferredConfig(config);
+            return metadataRetriever.getFramesAtIndex(0, size, bitmapParams);
+        }
         for (int i = 0; i < size; i++) {
             //这里单位为微秒
             long atTime = i + 1 == size ? (duration * 1000L) : i * per;

+ 26 - 18
app/src/main/java/com/sheep/gamegroup/util/ViewUtil.java

@@ -18,12 +18,10 @@ import android.media.MediaPlayer;
 import android.net.Uri;
 import android.os.Build;
 import android.provider.MediaStore;
-import android.support.annotation.IntegerRes;
 import android.support.annotation.LayoutRes;
 import android.support.annotation.StringRes;
 import android.support.v4.app.FragmentActivity;
 import android.support.v7.app.AlertDialog;
-import android.support.v7.widget.AppCompatCheckedTextView;
 import android.support.v7.widget.GridLayoutManager;
 import android.support.v7.widget.RecyclerView;
 import android.text.Html;
@@ -111,7 +109,6 @@ import java.io.IOException;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
-import java.util.Observable;
 import java.util.Random;
 import java.util.concurrent.TimeUnit;
 
@@ -280,24 +277,26 @@ public class ViewUtil {
     }
 
     public static void dismiss(DialogProgress dialogProgress, int delay) {
-        if(dialogProgress != null ){
+        if (dialogProgress != null) {
             dismiss(dialogProgress.getAlertDialog(), delay);
         }
     }
+
     public static void dismiss(DialogLoading dialogLoading, int delay) {
-        if(dialogLoading != null ){
+        if (dialogLoading != null) {
             dismiss(dialogLoading.getAlertDialog(), delay);
         }
     }
+
     public static void dismiss(final AlertDialog dialog, int delay) {
-        if(dialog != null ){
-            if(delay > 0){
+        if (dialog != null) {
+            if (delay > 0) {
                 delay(new AbsObserver<Integer>() {
                     @Override
                     public void onNext(Integer integer) {
                         try {
                             dialog.dismiss();
-                        } catch (Exception ignore){
+                        } catch (Exception ignore) {
 
                         }
                     }
@@ -307,6 +306,7 @@ public class ViewUtil {
             }
         }
     }
+
     public static void delay(Observer<Integer> observer, int delay) {
         io.reactivex.Observable.just(1)
                 .delay(delay, TimeUnit.SECONDS)
@@ -316,7 +316,7 @@ public class ViewUtil {
     }
 
     public static void setChecked(Checkable view, boolean checked) {
-        if(view != null)
+        if (view != null)
             view.setChecked(checked);
     }
 
@@ -1589,7 +1589,8 @@ public class ViewUtil {
             }
         }
     }
-    public static void setImageWH(ImageView imageView, String pictures, int width) {
+
+    public static void setViewWH(ImageView imageView, String pictures, int width) {
         if (imageView != null) {
             if (TextUtils.isEmpty(pictures)) {
                 imageView.setImageResource(R.mipmap.icon);
@@ -1600,19 +1601,20 @@ public class ViewUtil {
                 Uri uri = Uri.parse(pictures);
                 int w = NumberFormatUtils.parseInteger(uri.getQueryParameter("w"));
                 int h = NumberFormatUtils.parseInteger(uri.getQueryParameter("h"));
-                if(w > 0 && h > 0){
+                if (w > 0 && h > 0) {
                     LayoutParamsUtil.resetLayoutParams(imageView, new Lp().setWidth(width).setHeight((int) (width * h * 1.0f / w)));
                 }
-                GlideImageLoader.setImage(imageView, pictures);
             }
         }
     }
+
     public static void setViewWH(View view, int width, float radio) {
         LayoutParamsUtil.resetLayoutParams(view, new Lp().setWidth(width).setHeight((int) (width * radio)));
     }
+
     public static void setImagePath(ImageView imageView, String paths) {
-        if (imageView != null){
-            if(TextUtils.isEmpty(paths)) {
+        if (imageView != null) {
+            if (TextUtils.isEmpty(paths)) {
                 imageView.setImageResource(R.mipmap.icon);
             } else {
                 if (paths.contains(";")) {
@@ -1622,9 +1624,10 @@ public class ViewUtil {
             }
         }
     }
+
     public static void setImagePath(ImageView imageView, String paths, int radio) {
-        if (imageView != null){
-            if(TextUtils.isEmpty(paths)) {
+        if (imageView != null) {
+            if (TextUtils.isEmpty(paths)) {
                 imageView.setImageResource(R.mipmap.icon);
             } else {
                 if (paths.contains(";")) {
@@ -1704,12 +1707,14 @@ public class ViewUtil {
             textView.setText(TextUtils.isEmpty(msg) ? "" : msg);
         }
     }
-    public static void setText(TextView textView, @StringRes int stringId, Object...objects) {
+
+    public static void setText(TextView textView, @StringRes int stringId, Object... objects) {
         if (textView != null) {
             textView.setText(SheepApp.getInstance().getString(stringId, objects));
         }
     }
-    public static void setText(TextView textView, String format, Object...objects) {
+
+    public static void setText(TextView textView, String format, Object... objects) {
         if (textView != null) {
             textView.setText(String.format(Locale.CHINA, format, objects));
         }
@@ -1836,11 +1841,13 @@ public class ViewUtil {
             view.setVisibility(isVisible ? View.VISIBLE : View.GONE);
         }
     }
+
     public static void toggleVisibility(View view) {
         if (view != null) {
             view.setVisibility(isVisible(view) ? View.GONE : View.VISIBLE);
         }
     }
+
     public static boolean isVisible(View view) {
         return view != null && view.getVisibility() == View.VISIBLE;
     }
@@ -1850,6 +1857,7 @@ public class ViewUtil {
             view.setVisibility(isVisible ? View.VISIBLE : View.INVISIBLE);
         }
     }
+
     public static void toggleVisibility2(View view) {
         if (view != null) {
             view.setVisibility(isVisible(view) ? View.INVISIBLE : View.VISIBLE);

+ 510 - 0
app/src/main/java/com/sheep/gamegroup/view/activity/ActCutVideo.java

@@ -0,0 +1,510 @@
+package com.sheep.gamegroup.view.activity;
+
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.media.AudioManager;
+import android.media.MediaPlayer;
+import android.net.Uri;
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.support.v4.app.Fragment;
+import android.text.TextUtils;
+import android.view.GestureDetector;
+import android.view.KeyEvent;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.WindowManager;
+import android.widget.TextView;
+import android.widget.VideoView;
+
+import com.kfzs.duanduan.utils.NumberFormatUtils;
+import com.kfzs.duanduan.utils.StatusBarUtils;
+import com.sheep.gamegroup.absBase.AbsObserver;
+import com.sheep.gamegroup.absBase.BaseContainerActivity;
+import com.sheep.gamegroup.model.entity.DiscoveryTopic;
+import com.sheep.gamegroup.model.entity.Video;
+import com.sheep.gamegroup.util.DataUtil;
+import com.sheep.gamegroup.util.Jump2View;
+import com.sheep.gamegroup.util.KeyEventUtil;
+import com.sheep.gamegroup.util.LogUtil;
+import com.sheep.gamegroup.util.MediaHandleUtil;
+import com.sheep.gamegroup.util.TestUtil;
+import com.sheep.gamegroup.util.ViewUtil;
+import com.sheep.gamegroup.view.customview.VideoFramesView;
+import com.sheep.gamegroup.view.fragment.FgtDiscoveryTopic;
+import com.sheep.jiuyan.samllsheep.R;
+import com.sheep.jiuyan.samllsheep.utils.G;
+
+import org.greenrobot.eventbus.Subscribe;
+
+import java.util.Locale;
+
+import butterknife.BindView;
+import rx.functions.Action1;
+
+/**
+ * Created by realicing on 2018/11/9.
+ * realicing@sina.com
+ * 添加话题并剪切视频
+ */
+public class ActCutVideo extends BaseContainerActivity implements MediaPlayer.OnInfoListener, MediaPlayer.OnPreparedListener, MediaPlayer.OnErrorListener, MediaPlayer.OnCompletionListener, View.OnLayoutChangeListener {
+
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        StatusBarUtils.setTranslucent(this);
+        super.onCreate(savedInstanceState);
+    }
+
+    @BindView(R.id.videoView)
+    VideoView videoView;
+    @BindView(R.id.video_loading)
+    View video_loading;
+    @BindView(R.id.videoFramesView)
+    VideoFramesView videoFramesView;
+    @BindView(R.id.edit_video_time_tv)
+    TextView edit_video_time_tv;
+
+    @Override
+    protected int getLayoutId() {
+        return R.layout.act_edit_video;
+    }
+
+    public static final long MAX_VIDEO_DURATION = 15_000L;//视频最大时长,超过需要剪切
+    private Video data;
+
+    @Override
+    public void initView() {
+        super.initView();
+        initVolume();
+        data = DataUtil.getObject(getIntent(), Video.class);
+        Uri uri = Uri.parse(data.getFilePath());
+        videoView.setOnInfoListener(this);
+        videoView.setOnPreparedListener(this);
+        videoView.setOnErrorListener(this);
+        videoView.setOnCompletionListener(this);
+        videoView.addOnLayoutChangeListener(this);
+//        videoView.setMediaController(new MediaController(this));
+        videoView.setVideoURI(uri);
+        videoFramesView.initVideo(data).setMaxDuration(MAX_VIDEO_DURATION).showVideoList().setOnTimeChangeListener(new Action1<Float>() {
+            @Override
+            public void call(Float duration) {
+                if(duration == null)
+                    return;
+                if(ViewUtil.isVisible(videoFramesView))
+                    checkDuration(duration.longValue());
+                ViewUtil.setText(edit_video_time_tv, R.string.has_choose_x_second, NumberFormatUtils.retainMost1(duration / 1000.0f));
+                if (TestUtil.isDev()) {
+                    edit_video_time_tv.append("\t");
+                    edit_video_time_tv.append(String.valueOf(duration));
+                    edit_video_time_tv.append("\t");
+                    edit_video_time_tv.append(String.valueOf(data.getDuration()));
+                    edit_video_time_tv.append("\t");
+                    edit_video_time_tv.append(String.format(Locale.CHINA, "%.1f秒-%.1f秒", videoFramesView.getStartPoint() / 1000.0f, videoFramesView.getEndPoint() / 1000.0f));
+                    edit_video_time_tv.append("\t");
+                    edit_video_time_tv.append(videoFramesView.getLineInfo());
+                }
+            }
+        });
+        //隐藏视频剪切相关view
+        ViewUtil.setVisibility2(edit_video_time_tv, false);
+        ViewUtil.setVisibility2(videoFramesView, false);
+    }
+
+    //检查有没有设置剪切视频的时长
+    private void checkDuration(long duration) {
+        if ((data.getDuration() - duration) >= 1000) {
+            ViewUtil.setText(edit_video_sure_tv, BTN_TEXT_FINISH);
+        } else {
+            ViewUtil.setText(edit_video_sure_tv, BTN_TEXT_CUT);
+        }
+    }
+
+    @Override
+    protected Fragment initFragment() {
+        return new FgtDiscoveryTopic();
+    }
+
+    @SuppressLint("ClickableViewAccessibility")
+    @Override
+    public void initListener() {
+        mGestureDetector = new GestureDetector(getApplicationContext(), mGestureListener);
+        View.OnTouchListener listener = new View.OnTouchListener() {
+            @Override
+            public boolean onTouch(View v, MotionEvent event) {
+                return onTouchEvent(event);
+            }
+        };
+        videoView.setOnTouchListener(listener);
+    }
+
+    private GestureDetector mGestureDetector;
+
+    //播放或者暂停
+    private void playOrPause() {
+        if (videoView.isPlaying()) {
+            pause();
+        } else {
+            play();
+        }
+    }
+
+    //播放
+    private void play() {
+        if (videoView == null) {
+            return;
+        }
+        videoView.start();
+    }
+
+    //暂停
+    private void pause() {
+        if (videoView == null) {
+            return;
+        }
+        videoView.pause();
+    }
+
+    //销毁
+    private void destroy() {
+        if (videoView == null) {
+            return;
+        }
+        videoView.stopPlayback();
+    }
+
+
+    @Override
+    public boolean onTouchEvent(MotionEvent event) {
+        return mGestureDetector.onTouchEvent(event);
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        if (!isPauseByUser)
+            play();
+    }
+
+    //是否是用户手机暂停
+    private boolean isPauseByUser;
+
+    @Override
+    protected void onPause() {
+        super.onPause();
+        if (videoView != null && videoView.isPlaying())
+            isPauseByUser = false;
+        if (video_loading != null)
+            video_loading.setVisibility(View.VISIBLE);
+        pause();
+    }
+
+    @Override
+    protected void onDestroy() {
+        destroy();
+        if (videoFramesView != null)
+            videoFramesView.onDestroy();
+        super.onDestroy();
+        mAudioManager = null;
+    }
+
+    //    //滑动方向
+//    private int direction = 0;
+//    //左右滑动
+//    public static final int DIRECTION_LEFT_RIGHT = 1;
+//    //上下滑动
+//    public static final int DIRECTION_TOP_BOTTOM = 2;
+    private GestureDetector.SimpleOnGestureListener mGestureListener = new GestureDetector.SimpleOnGestureListener() {
+        @Override
+        public boolean onDown(MotionEvent e) {
+            LogUtil.println("mGestureListener", "onDown");
+//            direction = 0;
+            return super.onDown(e);
+        }
+
+        @Override
+        public void onLongPress(MotionEvent e) {
+            LogUtil.println("mGestureListener", "onLongPress");
+            super.onLongPress(e);
+        }
+
+        @Override
+        public boolean onSingleTapConfirmed(MotionEvent e) {
+            LogUtil.println("mGestureListener", "onSingleTapConfirmed");
+//            if(isPlaying)
+//                isPauseByUser = true;
+//            playOrPause();
+            return super.onSingleTapConfirmed(e);
+        }
+
+        @Override
+        public boolean onScroll(MotionEvent e1, MotionEvent e2,
+                                float distanceX, float distanceY) {
+            float mOldX = e1.getX(), mOldY = e1.getY();
+            int y = (int) e2.getRawY();
+            int windowWidth = ActCutVideo.this.windowWidth;
+            int windowHeight = ActCutVideo.this.windowHeight;
+            int lineMiddle = windowWidth / 2;
+            if (mOldX > lineMiddle)// 左边滑动
+                onBrightnessSlide((mOldY - y) / windowHeight);
+            else if (mOldX < lineMiddle)// 右边滑动
+                onVolumeSlide((mOldY - y) / windowHeight);
+            return super.onScroll(e1, e2, distanceX, distanceY);
+        }
+
+
+//        @Override
+//        public boolean onScroll(MotionEvent event1, MotionEvent event2, float distanceX, float distanceY) {
+//            LogUtil.println("mGestureListener", distanceX, distanceY);
+//            if (event1 == null || event2 == null) {
+//                return super.onScroll(event1, event2, distanceX, distanceY);
+//            }
+//            if (direction == 0) {
+//                float a = Math.abs(distanceY);
+//                float b = Math.abs(distanceX);
+//                if (a > b) {
+//                    LogUtil.println("mGestureListener", "上下滑动");
+//                    direction = DIRECTION_TOP_BOTTOM;
+//                } else if (b > a) {
+//                    LogUtil.println("mGestureListener", "左右滑动");
+//                    direction = DIRECTION_LEFT_RIGHT;
+//                }
+//            }
+//            return super.onScroll(event1, event2, distanceX, distanceY);
+//        }
+//
+//        @Override
+//        public boolean onFling(MotionEvent event1, MotionEvent event2, float velocityX, float velocityY) {
+//            LogUtil.println("mGestureListener", velocityX, velocityY);
+//            if (event1 == null || event2 == null) {
+//                return super.onFling(event1, event2, velocityX, velocityY);
+//            }
+//            final int FLING_MIN_DISTANCE = 100, FLING_MIN_VELOCITY = 200;
+//            if (event1.getX() - event2.getX() > FLING_MIN_DISTANCE
+//                    && Math.abs(velocityX) > FLING_MIN_VELOCITY) {
+//                // Fling left
+//                LogUtil.println("mGestureListener", "Fling left");
+//                //音量增益减
+//            } else if (event2.getX() - event1.getX() > FLING_MIN_DISTANCE
+//                    && Math.abs(velocityX) > FLING_MIN_VELOCITY) {
+//                // Fling right
+//                LogUtil.println("mGestureListener", "Fling rigth");
+//                //音量增益加
+//            } else if (event2.getY() - event1.getY() > FLING_MIN_DISTANCE
+//                    && Math.abs(velocityY) > FLING_MIN_VELOCITY) {
+//                if (direction == DIRECTION_LEFT_RIGHT) {
+//                    // Fling down
+//                    LogUtil.println("mGestureListener", "Fling down");
+//                    //频道减
+//                }
+//            } else if (event1.getY() - event2.getY() > FLING_MIN_DISTANCE
+//                    && Math.abs(velocityY) > FLING_MIN_VELOCITY) {
+//                if (direction == DIRECTION_LEFT_RIGHT) {
+//                    // Fling up
+//                    LogUtil.println("mGestureListener", "Fling up");
+//                    //频道加
+//                }
+//            }
+////            return super.onFling(event1, event2, velocityX, velocityY);
+//            return false;
+//        }
+    };
+    private AudioManager mAudioManager;
+    private int mMaxVolume;//最大音量
+    private int mVolume;//当前音量
+
+    private void initVolume() {
+        mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
+        if (mAudioManager != null)
+            mMaxVolume = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
+    }
+
+    //滑动改变音量
+    private void onVolumeSlide(float percent) {
+        if (mVolume == -1) {
+            mVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
+            if (mVolume < 0)
+                mVolume = 0;
+
+            // 显示
+//                mOperationBg.setImageResource(R.drawable.video_volumn_bg);
+//                mVolumeBrightnessLayout.setVisibility(View.VISIBLE);
+        }
+
+        int index = (int) (percent * mMaxVolume) + mVolume;
+        if (index > mMaxVolume)
+            index = mMaxVolume;
+        else if (index < 0)
+            index = 0;
+
+        // 变更声音
+        mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, index, 0);
+        // 变更进度条
+//            ViewGroup.LayoutParams lp = mOperationPercent.getLayoutParams();
+//            lp.width = findViewById(R.id.operation_full).getLayoutParams().width * index / mMaxVolume;
+//            mOperationPercent.setLayoutParams(lp);
+    }
+
+    private float mBrightness = -1;
+
+    //滑动改变亮度
+    private void onBrightnessSlide(float percent) {
+        if (mBrightness < 0) {
+            mBrightness = getWindow().getAttributes().screenBrightness;
+            if (mBrightness <= 0.00f)
+                mBrightness = 0.50f;
+            if (mBrightness < 0.01f)
+                mBrightness = 0.01f;
+
+            // 显示
+//                mOperationBg.setImageResource(R.drawable.video_brightness_bg);
+//                mVolumeBrightnessLayout.setVisibility(View.VISIBLE);
+        }
+        WindowManager.LayoutParams lpa = getWindow().getAttributes();
+        lpa.screenBrightness = mBrightness + percent;
+        if (lpa.screenBrightness > 1.0f)
+            lpa.screenBrightness = 1.0f;
+        else if (lpa.screenBrightness < 0.01f)
+            lpa.screenBrightness = 0.01f;
+        getWindow().setAttributes(lpa);
+
+//            ViewGroup.LayoutParams lp = mOperationPercent.getLayoutParams();
+//            lp.width = (int) (findViewById(R.id.operation_full).getLayoutParams().width * lpa.screenBrightness);
+//            mOperationPercent.setLayoutParams(lp);
+    }
+
+    @Override
+    public boolean onInfo(MediaPlayer mediaPlayer, int what, int extra) {
+        LogUtil.println("ActPlayVideo", "onInfo what = " + what + " extra = " + extra);
+        if (!mediaPlayer.isLooping())
+            mediaPlayer.setLooping(true);
+        switch (what) {
+            case MediaPlayer.MEDIA_INFO_BUFFERING_START:
+                LogUtil.println("ActPlayVideo", "onInfo", "正在缓冲");
+                if (video_loading != null)
+                    video_loading.setVisibility(View.VISIBLE);
+                break;
+            case MediaPlayer.MEDIA_INFO_BUFFERING_END:
+            case MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START:
+                LogUtil.println("ActPlayVideo", "onInfo", "缓冲完成");
+                //缓存完成,继续播放
+                if (video_loading != null)
+                    video_loading.setVisibility(View.GONE);
+                break;
+        }
+        return false;
+    }
+
+    @Override
+    public void onPrepared(MediaPlayer mediaPlayer) {
+        LogUtil.println("ActPlayVideo", "onPrepared");
+        if (video_loading != null)
+            video_loading.setVisibility(View.GONE);
+    }
+
+    @Override
+    public boolean onError(MediaPlayer mediaPlayer, int what, int extra) {
+        LogUtil.println("ActPlayVideo", "onInfo what = " + what + " extra = " + extra);
+        return false;
+    }
+
+    @Override
+    public void onCompletion(MediaPlayer mediaPlayer) {
+        LogUtil.println("ActPlayVideo", "onCompletion");
+    }
+
+    private int windowWidth = G.WIDTH;
+    private int windowHeight = G.HEIGHT;
+
+    @Override
+    public void onLayoutChange(View view, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
+        LogUtil.println("ActPlayVideo", "onLayoutChange", left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom);
+        this.windowWidth = left + right;
+        this.windowHeight = top + bottom;
+    }
+
+
+    @BindView(R.id.edit_video_topic_tv)
+    TextView edit_video_topic_tv;
+    @BindView(R.id.edit_video_sure_tv)
+    TextView edit_video_sure_tv;
+    @BindView(R.id.frame_container)
+    View frame_container;
+
+    @Override
+    protected boolean needRegisterEventBus() {
+        return true;
+    }
+
+    @Subscribe
+    public void onEventMainThread(DiscoveryTopic result) {
+        ViewUtil.setText(edit_video_topic_tv, "#%s#", result.getTopic());
+        data.setTopicId(result.getId());
+    }
+
+    //点击话题进行切换
+    public void onClickTopic(View view) {
+        ViewUtil.toggleVisibility(frame_container);
+        ViewUtil.setText(edit_video_sure_tv, BTN_TEXT_NEXT);
+        if(ViewUtil.isVisible(frame_container)){
+            ViewUtil.setVisibility2(edit_video_time_tv, false);
+            ViewUtil.setVisibility2(videoFramesView, false);
+        }
+    }
+
+    //点击返回
+    public void onClickBackImg(View view) {
+        KeyEventUtil.sendKeyDownUp(KeyEvent.KEYCODE_BACK);
+    }
+
+    private static final String BTN_TEXT_NEXT = "下一步";
+    private static final String BTN_TEXT_CUT = "剪切";
+    private static final String BTN_TEXT_FINISH = "完成";
+    //点击确定
+    public void onClickSure(View view) {
+        String btnText = ((TextView) view).getText().toString();
+        switch (btnText){
+            case BTN_TEXT_NEXT:
+                showCut();
+                break;
+            case BTN_TEXT_CUT:
+                finishCut();
+                break;
+            case BTN_TEXT_FINISH:
+                goEditVideo();
+                break;
+        }
+    }
+
+    private void goEditVideo() {//完成并跳转编辑视频界面
+        Jump2View.getInstance().goActEditVideo(data);
+        finish();
+    }
+
+    private void finishCut() {//其次完成编辑
+        G.showToast("开始剪切");
+        new MediaHandleUtil(data.getFilePath(), videoFramesView.getStartPoint() * 1000, videoFramesView.getLineDuration() * 1000)
+                .tryCutVideo(new AbsObserver<Video>() {
+                    @Override
+                    public void onNext(Video video) {
+                        data.setFilePath(video.getFilePath());
+                        data.setWidth(video.getWidth());
+                        data.setHeight(video.getHeight());
+                        data.setDuration(video.getDuration());
+                        G.showToast("完成剪切");
+                        goEditVideo();
+                    }
+
+                    @Override
+                    public void onError(Throwable e) {
+                        G.showToast(e.getMessage());
+                    }
+                });
+    }
+
+    private void showCut() {//首先隐藏话题列表
+        ViewUtil.setVisibility(frame_container, false);
+        ViewUtil.setVisibility2(edit_video_time_tv, true);
+        ViewUtil.setVisibility2(videoFramesView, true);
+        checkDuration(videoFramesView.getLineDuration());
+    }
+}

+ 3 - 430
app/src/main/java/com/sheep/gamegroup/view/activity/ActEditVideo.java

@@ -1,52 +1,21 @@
 package com.sheep.gamegroup.view.activity;
 
-import android.annotation.SuppressLint;
-import android.content.Context;
-import android.media.AudioManager;
-import android.media.MediaPlayer;
 import android.net.Uri;
 import android.os.Bundle;
 import android.support.annotation.Nullable;
-import android.support.v4.app.Fragment;
-import android.view.GestureDetector;
-import android.view.KeyEvent;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.WindowManager;
-import android.widget.TextView;
-import android.widget.VideoView;
 
-import com.kfzs.duanduan.utils.NumberFormatUtils;
 import com.kfzs.duanduan.utils.StatusBarUtils;
-import com.sheep.gamegroup.absBase.AbsObserver;
-import com.sheep.gamegroup.absBase.BaseContainerActivity;
-import com.sheep.gamegroup.model.entity.DiscoveryTopic;
+import com.sheep.gamegroup.absBase.BaseActivity;
 import com.sheep.gamegroup.model.entity.Video;
 import com.sheep.gamegroup.util.DataUtil;
-import com.sheep.gamegroup.util.KeyEventUtil;
-import com.sheep.gamegroup.util.LogUtil;
-import com.sheep.gamegroup.util.MediaHandleUtil;
-import com.sheep.gamegroup.util.TestUtil;
-import com.sheep.gamegroup.util.ViewUtil;
-import com.sheep.gamegroup.view.customview.VideoFramesView;
-import com.sheep.gamegroup.view.fragment.FgtDiscoveryTopic;
 import com.sheep.jiuyan.samllsheep.R;
-import com.sheep.jiuyan.samllsheep.utils.G;
-
-import org.greenrobot.eventbus.EventBus;
-import org.greenrobot.eventbus.Subscribe;
-
-import java.util.Locale;
-
-import butterknife.BindView;
-import rx.functions.Action1;
 
 /**
  * Created by realicing on 2018/11/9.
  * realicing@sina.com
  * 编辑视频
  */
-public class ActEditVideo extends BaseContainerActivity implements MediaPlayer.OnInfoListener, MediaPlayer.OnPreparedListener, MediaPlayer.OnErrorListener, MediaPlayer.OnCompletionListener, View.OnLayoutChangeListener {
+public class ActEditVideo extends BaseActivity {
 
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
@@ -54,412 +23,16 @@ public class ActEditVideo extends BaseContainerActivity implements MediaPlayer.O
         super.onCreate(savedInstanceState);
     }
 
-    @BindView(R.id.videoView)
-    VideoView videoView;
-    @BindView(R.id.video_loading)
-    View video_loading;
-    @BindView(R.id.videoFramesView)
-    VideoFramesView videoFramesView;
-    @BindView(R.id.edit_video_time_tv)
-    TextView edit_video_time_tv;
-
     @Override
     protected int getLayoutId() {
-        return R.layout.act_edit_video;
+        return R.layout.act_cut_video;
     }
 
-    public static final long MAX_VIDEO_DURATION = 15_000L;//视频最大时长,超过需要剪切
     private Video data;
 
     @Override
     public void initView() {
-        super.initView();
-        initVolume();
         data = DataUtil.getObject(getIntent(), Video.class);
         Uri uri = Uri.parse(data.getFilePath());
-        videoView.setOnInfoListener(this);
-        videoView.setOnPreparedListener(this);
-        videoView.setOnErrorListener(this);
-        videoView.setOnCompletionListener(this);
-        videoView.addOnLayoutChangeListener(this);
-//        videoView.setMediaController(new MediaController(this));
-        videoView.setVideoURI(uri);
-        videoFramesView.initVideo(data).setMaxDuration(MAX_VIDEO_DURATION).showVideoList().setOnTimeChangeListener(new Action1<Float>() {
-            @Override
-            public void call(Float duration) {
-                ViewUtil.setText(edit_video_time_tv, R.string.has_choose_x_second, NumberFormatUtils.retainMost1(duration / 1000.0f));
-                if (TestUtil.isDev()) {
-                    edit_video_time_tv.append("\t");
-                    edit_video_time_tv.append(String.format(Locale.CHINA, "%.1f秒-%.1f秒", videoFramesView.getStartPoint() / 1000.0f, videoFramesView.getEndPoint() / 1000.0f));
-                    edit_video_time_tv.append("\t");
-                    edit_video_time_tv.append(videoFramesView.getLineInfo());
-                }
-            }
-        });
-    }
-
-    @Override
-    protected Fragment initFragment() {
-        return new FgtDiscoveryTopic();
-    }
-
-    @SuppressLint("ClickableViewAccessibility")
-    @Override
-    public void initListener() {
-        mGestureDetector = new GestureDetector(getApplicationContext(), mGestureListener);
-        View.OnTouchListener listener = new View.OnTouchListener() {
-            @Override
-            public boolean onTouch(View v, MotionEvent event) {
-                return onTouchEvent(event);
-            }
-        };
-        videoView.setOnTouchListener(listener);
-    }
-
-    private GestureDetector mGestureDetector;
-
-    //播放或者暂停
-    private void playOrPause() {
-        if (videoView.isPlaying()) {
-            pause();
-        } else {
-            play();
-        }
-    }
-
-    //播放
-    private void play() {
-        if (videoView == null) {
-            return;
-        }
-        videoView.start();
-    }
-
-    //暂停
-    private void pause() {
-        if (videoView == null) {
-            return;
-        }
-        videoView.pause();
-    }
-
-    //销毁
-    private void destroy() {
-        if (videoView == null) {
-            return;
-        }
-        videoView.stopPlayback();
-    }
-
-
-    @Override
-    public boolean onTouchEvent(MotionEvent event) {
-        return mGestureDetector.onTouchEvent(event);
-    }
-
-    @Override
-    protected void onResume() {
-        super.onResume();
-        if (!isPauseByUser)
-            play();
-    }
-
-    //是否是用户手机暂停
-    private boolean isPauseByUser;
-
-    @Override
-    protected void onPause() {
-        super.onPause();
-        if (videoView != null && videoView.isPlaying())
-            isPauseByUser = false;
-        if (video_loading != null)
-            video_loading.setVisibility(View.VISIBLE);
-        pause();
-    }
-
-    @Override
-    protected void onDestroy() {
-        destroy();
-        if (videoFramesView != null)
-            videoFramesView.onDestroy();
-        super.onDestroy();
-        mAudioManager = null;
-    }
-
-    //    //滑动方向
-//    private int direction = 0;
-//    //左右滑动
-//    public static final int DIRECTION_LEFT_RIGHT = 1;
-//    //上下滑动
-//    public static final int DIRECTION_TOP_BOTTOM = 2;
-    private GestureDetector.SimpleOnGestureListener mGestureListener = new GestureDetector.SimpleOnGestureListener() {
-        @Override
-        public boolean onDown(MotionEvent e) {
-            LogUtil.println("mGestureListener", "onDown");
-//            direction = 0;
-            return super.onDown(e);
-        }
-
-        @Override
-        public void onLongPress(MotionEvent e) {
-            LogUtil.println("mGestureListener", "onLongPress");
-            super.onLongPress(e);
-        }
-
-        @Override
-        public boolean onSingleTapConfirmed(MotionEvent e) {
-            LogUtil.println("mGestureListener", "onSingleTapConfirmed");
-//            if(isPlaying)
-//                isPauseByUser = true;
-//            playOrPause();
-            return super.onSingleTapConfirmed(e);
-        }
-
-        @Override
-        public boolean onScroll(MotionEvent e1, MotionEvent e2,
-                                float distanceX, float distanceY) {
-            float mOldX = e1.getX(), mOldY = e1.getY();
-            int y = (int) e2.getRawY();
-            int windowWidth = ActEditVideo.this.windowWidth;
-            int windowHeight = ActEditVideo.this.windowHeight;
-            int lineMiddle = windowWidth / 2;
-            if (mOldX > lineMiddle)// 左边滑动
-                onBrightnessSlide((mOldY - y) / windowHeight);
-            else if (mOldX < lineMiddle)// 右边滑动
-                onVolumeSlide((mOldY - y) / windowHeight);
-            return super.onScroll(e1, e2, distanceX, distanceY);
-        }
-
-
-//        @Override
-//        public boolean onScroll(MotionEvent event1, MotionEvent event2, float distanceX, float distanceY) {
-//            LogUtil.println("mGestureListener", distanceX, distanceY);
-//            if (event1 == null || event2 == null) {
-//                return super.onScroll(event1, event2, distanceX, distanceY);
-//            }
-//            if (direction == 0) {
-//                float a = Math.abs(distanceY);
-//                float b = Math.abs(distanceX);
-//                if (a > b) {
-//                    LogUtil.println("mGestureListener", "上下滑动");
-//                    direction = DIRECTION_TOP_BOTTOM;
-//                } else if (b > a) {
-//                    LogUtil.println("mGestureListener", "左右滑动");
-//                    direction = DIRECTION_LEFT_RIGHT;
-//                }
-//            }
-//            return super.onScroll(event1, event2, distanceX, distanceY);
-//        }
-//
-//        @Override
-//        public boolean onFling(MotionEvent event1, MotionEvent event2, float velocityX, float velocityY) {
-//            LogUtil.println("mGestureListener", velocityX, velocityY);
-//            if (event1 == null || event2 == null) {
-//                return super.onFling(event1, event2, velocityX, velocityY);
-//            }
-//            final int FLING_MIN_DISTANCE = 100, FLING_MIN_VELOCITY = 200;
-//            if (event1.getX() - event2.getX() > FLING_MIN_DISTANCE
-//                    && Math.abs(velocityX) > FLING_MIN_VELOCITY) {
-//                // Fling left
-//                LogUtil.println("mGestureListener", "Fling left");
-//                //音量增益减
-//            } else if (event2.getX() - event1.getX() > FLING_MIN_DISTANCE
-//                    && Math.abs(velocityX) > FLING_MIN_VELOCITY) {
-//                // Fling right
-//                LogUtil.println("mGestureListener", "Fling rigth");
-//                //音量增益加
-//            } else if (event2.getY() - event1.getY() > FLING_MIN_DISTANCE
-//                    && Math.abs(velocityY) > FLING_MIN_VELOCITY) {
-//                if (direction == DIRECTION_LEFT_RIGHT) {
-//                    // Fling down
-//                    LogUtil.println("mGestureListener", "Fling down");
-//                    //频道减
-//                }
-//            } else if (event1.getY() - event2.getY() > FLING_MIN_DISTANCE
-//                    && Math.abs(velocityY) > FLING_MIN_VELOCITY) {
-//                if (direction == DIRECTION_LEFT_RIGHT) {
-//                    // Fling up
-//                    LogUtil.println("mGestureListener", "Fling up");
-//                    //频道加
-//                }
-//            }
-////            return super.onFling(event1, event2, velocityX, velocityY);
-//            return false;
-//        }
-    };
-    private AudioManager mAudioManager;
-    private int mMaxVolume;//最大音量
-    private int mVolume;//当前音量
-
-    private void initVolume() {
-        mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
-        if (mAudioManager != null)
-            mMaxVolume = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
-    }
-
-    //滑动改变音量
-    private void onVolumeSlide(float percent) {
-        if (mVolume == -1) {
-            mVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
-            if (mVolume < 0)
-                mVolume = 0;
-
-            // 显示
-//                mOperationBg.setImageResource(R.drawable.video_volumn_bg);
-//                mVolumeBrightnessLayout.setVisibility(View.VISIBLE);
-        }
-
-        int index = (int) (percent * mMaxVolume) + mVolume;
-        if (index > mMaxVolume)
-            index = mMaxVolume;
-        else if (index < 0)
-            index = 0;
-
-        // 变更声音
-        mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, index, 0);
-        // 变更进度条
-//            ViewGroup.LayoutParams lp = mOperationPercent.getLayoutParams();
-//            lp.width = findViewById(R.id.operation_full).getLayoutParams().width * index / mMaxVolume;
-//            mOperationPercent.setLayoutParams(lp);
-    }
-
-    private float mBrightness = -1;
-
-    //滑动改变亮度
-    private void onBrightnessSlide(float percent) {
-        if (mBrightness < 0) {
-            mBrightness = getWindow().getAttributes().screenBrightness;
-            if (mBrightness <= 0.00f)
-                mBrightness = 0.50f;
-            if (mBrightness < 0.01f)
-                mBrightness = 0.01f;
-
-            // 显示
-//                mOperationBg.setImageResource(R.drawable.video_brightness_bg);
-//                mVolumeBrightnessLayout.setVisibility(View.VISIBLE);
-        }
-        WindowManager.LayoutParams lpa = getWindow().getAttributes();
-        lpa.screenBrightness = mBrightness + percent;
-        if (lpa.screenBrightness > 1.0f)
-            lpa.screenBrightness = 1.0f;
-        else if (lpa.screenBrightness < 0.01f)
-            lpa.screenBrightness = 0.01f;
-        getWindow().setAttributes(lpa);
-
-//            ViewGroup.LayoutParams lp = mOperationPercent.getLayoutParams();
-//            lp.width = (int) (findViewById(R.id.operation_full).getLayoutParams().width * lpa.screenBrightness);
-//            mOperationPercent.setLayoutParams(lp);
-    }
-
-    @Override
-    public boolean onInfo(MediaPlayer mediaPlayer, int what, int extra) {
-        LogUtil.println("ActPlayVideo", "onInfo what = " + what + " extra = " + extra);
-        if (!mediaPlayer.isLooping())
-            mediaPlayer.setLooping(true);
-        switch (what) {
-            case MediaPlayer.MEDIA_INFO_BUFFERING_START:
-                LogUtil.println("ActPlayVideo", "onInfo", "正在缓冲");
-                if (video_loading != null)
-                    video_loading.setVisibility(View.VISIBLE);
-                break;
-            case MediaPlayer.MEDIA_INFO_BUFFERING_END:
-            case MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START:
-                LogUtil.println("ActPlayVideo", "onInfo", "缓冲完成");
-                //缓存完成,继续播放
-                if (video_loading != null)
-                    video_loading.setVisibility(View.GONE);
-                break;
-        }
-        return false;
-    }
-
-    @Override
-    public void onPrepared(MediaPlayer mediaPlayer) {
-        LogUtil.println("ActPlayVideo", "onPrepared");
-        if (video_loading != null)
-            video_loading.setVisibility(View.GONE);
-    }
-
-    @Override
-    public boolean onError(MediaPlayer mediaPlayer, int what, int extra) {
-        LogUtil.println("ActPlayVideo", "onInfo what = " + what + " extra = " + extra);
-        return false;
-    }
-
-    @Override
-    public void onCompletion(MediaPlayer mediaPlayer) {
-        LogUtil.println("ActPlayVideo", "onCompletion");
-    }
-
-    private int windowWidth = G.WIDTH;
-    private int windowHeight = G.HEIGHT;
-
-    @Override
-    public void onLayoutChange(View view, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
-        LogUtil.println("ActPlayVideo", "onLayoutChange", left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom);
-        this.windowWidth = left + right;
-        this.windowHeight = top + bottom;
-    }
-
-
-    @BindView(R.id.edit_video_topic_tv)
-    TextView edit_video_topic_tv;
-    @BindView(R.id.edit_video_sure_tv)
-    TextView edit_video_sure_tv;
-    @BindView(R.id.frame_container)
-    View frame_container;
-
-    @Override
-    protected boolean needRegisterEventBus() {
-        return true;
-    }
-
-    @Subscribe
-    public void onEventMainThread(DiscoveryTopic result) {
-        ViewUtil.setText(edit_video_topic_tv, "#%s#", result.getTopic());
-        data.setTopicId(result.getId());
-    }
-
-    //点击话题进行切换
-    public void onClickTopic(View view) {
-        if (ViewUtil.isVisible(frame_container)) {
-            ViewUtil.setText(edit_video_sure_tv, "完成");
-        } else {
-            ViewUtil.setText(edit_video_sure_tv, "下一步");
-        }
-        ViewUtil.toggleVisibility(frame_container);
-    }
-
-    //点击返回
-    public void onClickBackImg(View view) {
-        KeyEventUtil.sendKeyDownUp(KeyEvent.KEYCODE_BACK);
-    }
-
-    //点击确定
-    public void onClickSure(View view) {
-        if (ViewUtil.isVisible(frame_container)) {//首先隐藏话题列表
-            ViewUtil.setVisibility(frame_container, false);
-            ViewUtil.setText(edit_video_sure_tv, "完成");
-        } else {//其次完成编辑
-            G.showToast("开始剪切");
-            new MediaHandleUtil(data.getFilePath(), videoFramesView.getStartPoint() * 1000, videoFramesView.getLineDuration() * 1000)
-                    .tryCutVideo(new AbsObserver<Video>() {
-                        @Override
-                        public void onNext(Video video) {
-                            data.setFilePath(video.getFilePath());
-                            data.setWidth(video.getWidth());
-                            data.setHeight(video.getHeight());
-                            data.setDuration(video.getDuration());
-                            EventBus.getDefault().post(data);
-                            G.showToast("完成剪切");
-                            finish();
-                        }
-
-                        @Override
-                        public void onError(Throwable e) {
-                            G.showToast(e.getMessage());
-                        }
-                    });
-        }
     }
 }

+ 2 - 1
app/src/main/java/com/sheep/gamegroup/view/adapter/AdpVideo.java

@@ -37,7 +37,8 @@ public class AdpVideo extends RecyclerViewAdapter<DiscoveryVideo> {
         ImageView item_video_cover = viewHolder.itemView.findViewById(R.id.item_video_cover);
         TextView item_video_play_no_tv = viewHolder.itemView.findViewById(R.id.item_video_play_no_tv);
         TextView item_video_time_tv = viewHolder.itemView.findViewById(R.id.item_video_time_tv);
-        ViewUtil.setImageWH(item_video_cover, item.getCover(), width);
+        ViewUtil.setViewWH(item_video_cover, item.getCover(), width);
+        ViewUtil.setImage(item_video_cover, item.getCover(), G.getRealPix(5));
         ViewUtil.setVisibility(item_video_play_no_tv, item.getPlay() > 0);
         ViewUtil.setText(item_video_play_no_tv, String.format(Locale.CHINA, "%s次播放", NumberFormatUtils.getText(item.getPlay())));
         ViewUtil.setText(item_video_time_tv, TimeUtil.getDurationText(item.getDuration()));

+ 0 - 1
app/src/main/java/com/sheep/gamegroup/view/fragment/BaseListFragment6.java

@@ -209,7 +209,6 @@ public abstract class BaseListFragment6<T> extends BaseFragment implements IRefr
                 case 1:
                     if (swipeRefreshLayout != null)
                         swipeRefreshLayout.setRefreshing(false);
-                    break;
                 default:
                     baseQuickAdapter.loadMoreComplete();
                     break;

+ 10 - 0
app/src/main/res/layout/act_cut_video.xml

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<android.support.constraint.ConstraintLayout 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"
+    android:background="#000000"
+    tools:context="com.sheep.gamegroup.view.activity.ActEditVideo">
+
+</android.support.constraint.ConstraintLayout>

+ 4 - 4
app/src/main/res/layout/line_1px_hor.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <View xmlns:android="http://schemas.android.com/apk/res/android"
-      android:layout_width="match_parent"
-      android:layout_height="1px"
-      android:background="@color/gray_5">
-</View>
+    android:id="@+id/below_tab_line"
+    android:layout_width="match_parent"
+    android:layout_height="1px"
+    android:background="@color/gray_5"/>

二進制
app/src/main/res/mipmap-xxhdpi/ic_open_camera.webp