Преглед изворни кода

Merge branch 'sheep_develop' of 10.8.230.114:xmy_android/small_sheep_android into sheep_develop

hanjing пре 7 година
родитељ
комит
77cf295164
48 измењених фајлова са 2021 додато и 277 уклоњено
  1. 0 1
      app/build.gradle
  2. 4 4
      app/src/main/java/com/sheep/gamegroup/view/activity/MiddleSchemeAct.java
  3. 2 2
      gradle.properties
  4. 2 0
      joevideolib/proguard-rules.pro
  5. 1 0
      media/app/build.gradle
  6. 4 2
      media/app/src/main/AndroidManifest.xml
  7. 192 0
      media/app/src/main/java/com/kfzs/cfyl/media/BaseListFgtActivity.java
  8. 207 0
      media/app/src/main/java/com/kfzs/cfyl/media/BaseListFgtFgt.java
  9. 74 150
      media/app/src/main/java/com/kfzs/cfyl/media/activity/ActCutVideo.java
  10. 38 9
      media/app/src/main/java/com/kfzs/cfyl/media/activity/ActEditVideo.java
  11. 26 1
      media/app/src/main/java/com/kfzs/cfyl/media/activity/MainActivity.java
  12. 11 0
      media/app/src/main/java/com/kfzs/cfyl/media/api/FgtCreater.java
  13. 62 0
      media/app/src/main/java/com/kfzs/cfyl/media/bean/EditVideoType.java
  14. 17 15
      media/app/src/main/java/com/kfzs/cfyl/media/customview/VideoFramesView.java
  15. 106 0
      media/app/src/main/java/com/kfzs/cfyl/media/fragment/FgtColorList.java
  16. 50 5
      media/app/src/main/java/com/kfzs/cfyl/media/fragment/FgtDiscoveryTopic.java
  17. 290 0
      media/app/src/main/java/com/kfzs/cfyl/media/fragment/FgtDoodle.java
  18. 129 0
      media/app/src/main/java/com/kfzs/cfyl/media/fragment/FgtEditVideoTypeList.java
  19. 174 0
      media/app/src/main/java/com/kfzs/cfyl/media/fragment/FgtVideoFrameList.java
  20. 200 0
      media/app/src/main/java/com/kfzs/cfyl/media/util/BitmapUtil.java
  21. 36 0
      media/app/src/main/java/com/kfzs/cfyl/media/util/VideoUtil.java
  22. 21 0
      media/app/src/main/java/com/kfzs/cfyl/media/util/ViewUtil.java
  23. 7 0
      media/app/src/main/res/drawable/media_shape_oval_14e213.xml
  24. 7 0
      media/app/src/main/res/drawable/media_shape_oval_1b9bff.xml
  25. 7 0
      media/app/src/main/res/drawable/media_shape_oval_8c05ff.xml
  26. 7 0
      media/app/src/main/res/drawable/media_shape_oval_black.xml
  27. 7 0
      media/app/src/main/res/drawable/media_shape_oval_fbf606.xml
  28. 7 0
      media/app/src/main/res/drawable/media_shape_oval_red_ff1d11.xml
  29. 9 0
      media/app/src/main/res/drawable/media_shape_ring_tra.xml
  30. 9 0
      media/app/src/main/res/drawable/media_shape_ring_white.xml
  31. 7 5
      media/app/src/main/res/layout/main_activity.xml
  32. 1 75
      media/app/src/main/res/layout/media_act_cut_video.xml
  33. 4 1
      media/app/src/main/res/layout/media_act_edit_video.xml
  34. 0 6
      media/app/src/main/res/layout/media_common_rv.xml
  35. 14 0
      media/app/src/main/res/layout/media_fgt_color_list.xml
  36. 53 0
      media/app/src/main/res/layout/media_fgt_cut_video.xml
  37. 88 0
      media/app/src/main/res/layout/media_fgt_doodle.xml
  38. 59 0
      media/app/src/main/res/layout/media_fgt_dt.xml
  39. 41 0
      media/app/src/main/res/layout/media_fgt_edit_video_type_list.xml
  40. 19 0
      media/app/src/main/res/layout/media_item_color.xml
  41. 25 0
      media/app/src/main/res/layout/media_item_iv_tv.xml
  42. BIN
      media/app/src/main/res/mipmap-xxhdpi/media_ic_cover.png
  43. BIN
      media/app/src/main/res/mipmap-xxhdpi/media_ic_doodle.png
  44. BIN
      media/app/src/main/res/mipmap-xxhdpi/media_ic_music.png
  45. BIN
      media/app/src/main/res/mipmap-xxhdpi/media_ic_sticker.png
  46. BIN
      media/app/src/main/res/mipmap-xxhdpi/media_ic_text.png
  47. 3 1
      media/settings.gradle
  48. 1 0
      media/share_library/build.gradle

+ 0 - 1
app/build.gradle

@@ -428,7 +428,6 @@ dependencies {
     implementation 'com.alibaba:fastjson:1.2.52'
     implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.34'
 //    implementation 'com.github.yangjie10930:EpMedia:v0.9.5'
-    implementation project(':joevideolib')
 }
 
 static def releaseTime() {

+ 4 - 4
app/src/main/java/com/sheep/gamegroup/view/activity/MiddleSchemeAct.java

@@ -74,7 +74,7 @@ public class MiddleSchemeAct extends Activity {
             default://尝试获取game_id
                 tryGoSplashAct(uri);
                 break;
-            //sheep://small.kfzs.com/sheep?type=jhl&data={"Jump":"1"}
+            //sheep://small.kfzs.com/xmy?type=jhl&data={"Jump":"1"}
             case "jump_home_list"://跳转homeList
             case "jhl":
                 try {
@@ -86,7 +86,7 @@ public class MiddleSchemeAct extends Activity {
                         G.showToast(e.getMessage());
                 }
                 break;
-            //sheep://small.kfzs.com/sheep?type=jum&data={"jump":1}
+            //sheep://small.kfzs.com/xmy?type=jum&data={"jump":1}
             case "jump_user_module"://跳转个人中心列表功能模块
             case "jum":
                 try {
@@ -98,7 +98,7 @@ public class MiddleSchemeAct extends Activity {
                         G.showToast(e.getMessage());
                 }
                 break;
-            //sheep://small.kfzs.com/sheep?type=jss&data={"Type":1}
+            //sheep://small.kfzs.com/xmy?type=jss&data={"Type":1}
             case "jump_slide_show"://跳转banner(主页banner或者游戏banner)
             case "jss":
                 try {
@@ -110,7 +110,7 @@ public class MiddleSchemeAct extends Activity {
                         G.showToast(e.getMessage());
                 }
                 break;
-            //sheep://small.kfzs.com/sheep?type=run_app&packageName=com.realicing.android.upgrade.sheep&className=com.realicing.android.upgrade.sheep.MainActivity
+            //sheep://small.kfzs.com/xmy?type=run_app&packageName=com.realicing.android.upgrade.sheep&className=com.realicing.android.upgrade.sheep.MainActivity
             case "run_app":
             case "run":
                 String packageName = uri.getQueryParameter("packageName");

+ 2 - 2
gradle.properties

@@ -17,8 +17,8 @@
 # org.gradle.parallel=true
 #android.injected.build.model.only.versioned = 3
 
-VERSION_NAME=3.4.5
-VERSION_CODE=3004005
+VERSION_NAME=3.4.6
+VERSION_CODE=3004006
 ANDROID_COMPILE_SDK_VERSION=28
 ANDROID_BUILD_TOOLS_VERSION=28.0.3
 ANDROID_MIN_SDK_VERSION=18

+ 2 - 0
joevideolib/proguard-rules.pro

@@ -24,3 +24,5 @@
 #保留注解,如果不添加改行会导致我们的@Keep注解失效
 -keepattributes *Annotation*
 -keep @android.support.annotation.Keep class **
+-keep class Jni.** { *; }
+-keep class VideoHandle.** { *; }

+ 1 - 0
media/app/build.gradle

@@ -90,6 +90,7 @@ dependencies {
     implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.34'
     //fast json
     implementation 'com.alibaba:fastjson:1.2.52'
+    implementation 'com.github.1993hzw:Doodle:5.3'
 }
 
 

+ 4 - 2
media/app/src/main/AndroidManifest.xml

@@ -104,9 +104,11 @@
         </activity>
         <activity android:name=".activity.ActCutVideo"
             android:theme="@style/media_AppTheme"
-            android:screenOrientation="portrait"/>
+            android:configChanges="orientation|keyboardHidden|navigation|screenSize"
+            android:screenOrientation="sensor"/>
         <activity android:name=".activity.ActEditVideo"
             android:theme="@style/media_AppTheme"
-            android:screenOrientation="portrait"/>
+            android:configChanges="orientation|keyboardHidden|navigation|screenSize"
+            android:screenOrientation="sensor"/>
     </application>
 </manifest>

+ 192 - 0
media/app/src/main/java/com/kfzs/cfyl/media/BaseListFgtActivity.java

@@ -0,0 +1,192 @@
+package com.kfzs.cfyl.media;
+
+import android.content.Intent;
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentTransaction;
+
+import com.kfzs.cfyl.media.api.FgtCreater;
+import com.kfzs.cfyl.media.util.ListUtil;
+
+import java.util.List;
+
+
+/**
+ * Created by realicing on 2018/11/2.
+ * realicing@sina.com
+ */
+public abstract class BaseListFgtActivity extends BaseActivity {
+
+    @Override
+    protected int getLayoutId() {
+        return R.layout.media_common_container;
+    }
+
+    @Override
+    public void initView() {
+        parseIntent(getIntent());
+        initFragments();
+    }
+
+    //解析intent数据
+    protected void parseIntent(Intent intent){
+
+    }
+
+    //获取子fgt列表的创建器列表
+    protected abstract List<FgtCreater> getFgtCreaterList();
+
+    //fgt列表总个数
+    protected int fgtCount;
+
+    public int getFgtCount() {
+        return fgtCount;
+    }
+
+    //初始化并加载fgt列表
+    protected void initFragments() {
+        List<FgtCreater> fgtCreaterList = getFgtCreaterList();
+        fgtCount = fgtCreaterList.size();
+        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
+        int index = 0;
+        for (FgtCreater item : fgtCreaterList) {
+            Fragment fragment = getSupportFragmentManager().findFragmentByTag(getFgtTagByPosition(index));
+            if (fragment == null) {
+                fragment = item.newInstance();
+                onInitFragment(fragment, index);
+            }
+            transaction.add(R.id.media_frame_container, fragment, getFgtTagByPosition(index));
+            if (index == 0) {
+                onBeforeShowFragment(fragment, index);
+                transaction.show(fragment);
+                onShowFragment(fragment, index);
+            } else {
+                onBeforeHideFragment(fragment, index);
+                transaction.hide(fragment);
+                onHideFragment(fragment, index);
+            }
+            if(fragment instanceof BaseListFgtFgt){
+                ((BaseListFgtFgt) fragment).initFragments(this, getFgtTagByPosition(index), index);
+            }
+            index++;
+        }
+        transaction.commitAllowingStateLoss();
+    }
+
+    //最后选中的位置
+    private int lastPosition;
+
+    public int getLastPosition() {
+        return lastPosition;
+    }
+
+    //判断是否可以切换到上一个fgt
+    public boolean canSwitchLastFgt(){
+        return lastPosition > 0;
+    }
+    //切换到上一个fgt
+    public boolean switchLastFgt(){
+        if(canSwitchLastFgt()){
+            switchFgt(lastPosition - 1);
+            return true;
+        }
+        return false;
+    }
+    //判断是否可以切换到下一个fgt
+    public boolean canSwitchNextFgt(){
+        return lastPosition + 1 < fgtCount;
+    }
+    //切换到下一个fgt
+    public boolean switchNextFgt(){
+        if(canSwitchNextFgt()){
+            switchFgt(lastPosition + 1);
+            return true;
+        }
+        return false;
+    }
+    //切换fgt
+    public void switchFgt(int position) {
+        if (lastPosition != position) {
+            FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
+            Fragment cFragment = getFgtByPosition(position);
+            Fragment lFragment = getFgtByPosition(lastPosition);
+            if (lFragment != null) {
+                onBeforeHideFragment(lFragment, position);
+                transaction.hide(lFragment);
+                onHideFragment(lFragment, position);
+            }
+            if (cFragment != null) {
+                onBeforeShowFragment(cFragment, lastPosition);
+                transaction.show(cFragment);
+                onShowFragment(cFragment, lastPosition);
+            }
+            transaction.commitAllowingStateLoss();
+            if (lFragment != null)
+                lFragment.setUserVisibleHint(false);
+            if (cFragment != null)
+                cFragment.setUserVisibleHint(true);
+        }
+        lastPosition = position;
+    }
+
+    /**
+     * 切换fgt
+     * @param position 要显示的position
+     * @param lFragment 要隐藏的fgt
+     */
+    public void switchFgt(int position, Fragment lFragment) {
+        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
+        Fragment cFragment = getFgtByPosition(position);
+        if (lFragment != null) {
+            int lPosition = -1;
+            if(cFragment instanceof BaseListFgtFgt){
+                lPosition = ((BaseListFgtFgt) cFragment).getLastPosition();
+            }
+            onBeforeHideFragment(lFragment, lPosition);
+            transaction.hide(lFragment);
+            onHideFragment(lFragment, lPosition);
+        }
+        if (cFragment != null) {
+            onBeforeShowFragment(cFragment, position);
+            transaction.show(cFragment);
+            onShowFragment(cFragment, position);
+        }
+        transaction.commitAllowingStateLoss();
+        if (lFragment != null)
+            lFragment.setUserVisibleHint(false);
+        if (cFragment != null)
+            cFragment.setUserVisibleHint(true);
+        lastPosition = position;
+    }
+
+    public Fragment getFgtByPosition(int position) {
+        return getSupportFragmentManager().findFragmentByTag(getFgtTagByPosition(position));
+    }
+
+    //根据位置获取fgt的tag
+    public String getFgtTagByPosition(int position) {
+        return "fragment_" + position;
+    }
+
+    //初始化fragment时
+    protected void onInitFragment(Fragment fragment, int position) {
+
+    }
+    //显示fgt前
+    protected void onBeforeShowFragment(Fragment fragment, int position) {
+
+    }
+    //显示fgt后
+    protected void onShowFragment(Fragment fragment, int position) {
+        if(fragment instanceof BaseListFgtFgt){
+            ((BaseListFgtFgt) fragment).setLastPosition(-1);
+        }
+    }
+    //隐藏fgt前
+    protected void onBeforeHideFragment(Fragment fragment, int position) {
+
+    }
+    //隐藏fgt后
+    protected void onHideFragment(Fragment fragment, int position) {
+
+    }
+}

+ 207 - 0
media/app/src/main/java/com/kfzs/cfyl/media/BaseListFgtFgt.java

@@ -0,0 +1,207 @@
+package com.kfzs.cfyl.media;
+
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentManager;
+import android.support.v4.app.FragmentTransaction;
+
+import com.kfzs.cfyl.media.api.FgtCreater;
+
+import java.util.List;
+
+
+/**
+ * Created by realicing on 2018/11/2.
+ * realicing@sina.com
+ * 需要调用initFragments方法初始化
+ */
+public abstract class BaseListFgtFgt extends BaseFragment {
+
+    //获取子fgt列表的创建器列表
+    protected abstract List<FgtCreater> getFgtCreaterList();
+
+    //fgt列表总个数
+    protected int fgtCount;
+
+    public int getFgtCount() {
+        return fgtCount;
+    }
+
+    private String curTag;
+    private int backFgtPosition;
+    //初始化并加载fgt列表
+    public void initFragments(BaseListFgtActivity baseListFgtActivity, String backTag, int backFgtPosition) {
+        this.curTag = backTag;
+        this.backFgtPosition = backFgtPosition;
+        List<FgtCreater> fgtCreaterList = getFgtCreaterList();
+        fgtCount = fgtCreaterList.size();
+        FragmentManager fragmentManager = baseListFgtActivity.getSupportFragmentManager();
+        if (fragmentManager != null) {
+            FragmentTransaction transaction = fragmentManager.beginTransaction();
+            int index = 0;
+            for (FgtCreater item : fgtCreaterList) {
+                String tag = getFgtTagByPosition(index);
+                Fragment fragment = fragmentManager.findFragmentByTag(tag);
+                if (fragment == null) {
+                    fragment = item.newInstance();
+                    onInitFragment(baseListFgtActivity, fragment, index);
+                }
+                transaction.add(R.id.media_frame_container, fragment, tag);
+                onBeforeHideFragment(baseListFgtActivity, fragment, index);
+                transaction.hide(fragment);
+                onHideFragment(baseListFgtActivity, fragment, index);
+                index++;
+            }
+            transaction.commitAllowingStateLoss();
+        }
+    }
+
+    private FragmentManager getSupportFragmentManager() {
+        if (getActivity() != null) {
+            return getActivity().getSupportFragmentManager();
+        }
+        return null;
+    }
+
+    //最后选中的位置
+    private int lastPosition = -1;
+
+    public void setLastPosition(int lastPosition) {
+        this.lastPosition = lastPosition;
+    }
+
+    public int getLastPosition() {
+        return lastPosition;
+    }
+
+    //判断是否可以切换到上一个fgt
+    public boolean canSwitchLastFgt() {
+        return lastPosition > 0;
+    }
+
+    //切换到上一个fgt
+    public boolean switchLastFgt() {
+        if (canSwitchLastFgt()) {
+            switchFgt(lastPosition - 1);
+            return true;
+        }
+        return false;
+    }
+
+    //判断是否可以切换到下一个fgt
+    public boolean canSwitchNextFgt() {
+        return lastPosition + 1 < fgtCount;
+    }
+
+    //切换到下一个fgt
+    public boolean switchNextFgt() {
+        if (canSwitchNextFgt()) {
+            switchFgt(lastPosition + 1);
+            return true;
+        }
+        return false;
+    }
+
+    //返回
+    public boolean back() {
+        if(curTag != null){
+            if (getSupportFragmentManager() != null) {
+                BaseListFgtActivity baseListFgtActivity = null;
+                if(getActivity() instanceof BaseListFgtActivity){
+                    baseListFgtActivity = (BaseListFgtActivity) getActivity();
+                }
+                FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
+                Fragment cFragment = getSupportFragmentManager().findFragmentByTag(curTag);
+                Fragment lFragment = getFgtByPosition(lastPosition);
+                if (lFragment != null) {
+                    onBeforeHideFragment(baseListFgtActivity, lFragment, lastPosition);
+                    transaction.hide(lFragment);
+                    onHideFragment(baseListFgtActivity, lFragment, lastPosition);
+                }
+                if (cFragment != null) {
+                    onBeforeShowFragment(baseListFgtActivity, cFragment, backFgtPosition);
+                    transaction.show(cFragment);
+                    onShowFragment(baseListFgtActivity, cFragment, backFgtPosition);
+                }
+                transaction.commitAllowingStateLoss();
+                if (lFragment != null)
+                    lFragment.setUserVisibleHint(false);
+                if (cFragment != null)
+                    cFragment.setUserVisibleHint(true);
+                return true;
+            }
+        }
+        return false;
+    }
+
+    //切换fgt
+    public void switchFgt(int position) {
+        if (lastPosition != position) {
+            if (getSupportFragmentManager() != null) {
+                BaseListFgtActivity baseListFgtActivity = null;
+                if(getActivity() instanceof BaseListFgtActivity){
+                    baseListFgtActivity = (BaseListFgtActivity) getActivity();
+                }
+                FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
+                Fragment cFragment = getFgtByPosition(position);
+                Fragment lFragment = getFgtByPosition(lastPosition);
+                if (lFragment != null) {
+                    onBeforeHideFragment(baseListFgtActivity, lFragment, lastPosition);
+                    transaction.hide(lFragment);
+                    onHideFragment(baseListFgtActivity, lFragment, lastPosition);
+                }
+                if (cFragment != null) {
+                    onBeforeShowFragment(baseListFgtActivity, cFragment, position);
+                    transaction.show(cFragment);
+                    onShowFragment(baseListFgtActivity, cFragment, position);
+                }
+                transaction.commitAllowingStateLoss();
+                if (lFragment != null)
+                    lFragment.setUserVisibleHint(false);
+                if (cFragment != null)
+                    cFragment.setUserVisibleHint(true);
+            }
+        }
+        lastPosition = position;
+    }
+
+    public Fragment getFgtByPosition(int position) {
+        if (getSupportFragmentManager() != null) {
+            if(position == -1){
+                return this;
+            }
+            String tag = getFgtTagByPosition(position);
+            return getSupportFragmentManager().findFragmentByTag(tag);
+        }
+        return null;
+    }
+
+    //根据位置获取fgt的tag
+    public String getFgtTagByPosition(int position) {
+        return getClass().getSimpleName() + "_fragment_" + position;
+    }
+
+    //初始化fragment时
+    protected void onInitFragment(BaseListFgtActivity baseListFgtActivity, Fragment fragment, int position) {
+        baseListFgtActivity.onInitFragment(fragment, position);
+    }
+
+    //显示fgt前
+    protected void onBeforeShowFragment(BaseListFgtActivity baseListFgtActivity, Fragment fragment, int position) {
+        baseListFgtActivity.onBeforeShowFragment(fragment, position);
+    }
+
+    //显示fgt后
+    protected void onShowFragment(BaseListFgtActivity baseListFgtActivity, Fragment fragment, int position) {
+        baseListFgtActivity.onShowFragment(fragment, position);
+    }
+
+    //隐藏fgt前
+    protected void onBeforeHideFragment(BaseListFgtActivity baseListFgtActivity, Fragment fragment, int position) {
+        baseListFgtActivity.onBeforeHideFragment(fragment, position);
+    }
+
+    //隐藏fgt后
+    protected void onHideFragment(BaseListFgtActivity baseListFgtActivity, Fragment fragment, int position) {
+        baseListFgtActivity.onHideFragment(fragment, position);
+    }
+}

+ 74 - 150
media/app/src/main/java/com/kfzs/cfyl/media/activity/ActCutVideo.java

@@ -5,45 +5,38 @@ import android.media.MediaPlayer;
 import android.net.Uri;
 import android.support.v4.app.Fragment;
 import android.util.Log;
-import android.view.KeyEvent;
+import android.view.MotionEvent;
 import android.view.View;
-import android.widget.TextView;
 
 import com.alibaba.fastjson.JSONObject;
-import com.kfzs.cfyl.media.BaseContainerActivity;
+import com.kfzs.cfyl.media.BaseListFgtActivity;
 import com.kfzs.cfyl.media.R;
+import com.kfzs.cfyl.media.api.FgtCreater;
 import com.kfzs.cfyl.media.api.IdChooser;
-import com.kfzs.cfyl.media.customview.VideoFramesView;
+import com.kfzs.cfyl.media.bean.EditVideoType;
 import com.kfzs.cfyl.media.fragment.FgtDiscoveryTopic;
+import com.kfzs.cfyl.media.fragment.FgtDoodle;
+import com.kfzs.cfyl.media.fragment.FgtEditVideoTypeList;
+import com.kfzs.cfyl.media.fragment.FgtVideoFrameList;
 import com.kfzs.cfyl.media.util.G;
-import com.kfzs.cfyl.media.util.KeyEventUtil;
 import com.kfzs.cfyl.media.util.ListUtil;
-import com.kfzs.cfyl.media.util.VideoUtil;
-import com.kfzs.cfyl.media.util.ViewUtil;
-import com.kfzs.cfyl.share_library.util.LogUtil;
 import com.sheep.gamegroup.model.entity.Video;
 
 import org.wysaid.common.Common;
 import org.wysaid.view.VideoPlayerGLSurfaceView;
 
-import java.text.DecimalFormat;
 import java.util.ArrayList;
-
-import rx.functions.Action1;
+import java.util.List;
 
 /**
  * Created by realicing on 2018/11/9.
  * realicing@sina.com
  * 添加话题并剪切视频
  */
-public class ActCutVideo extends BaseContainerActivity implements IdChooser {
+public class ActCutVideo extends BaseListFgtActivity implements IdChooser {
 
     VideoPlayerGLSurfaceView mPlayerView;
-    VideoFramesView videoFramesView;
-    TextView edit_video_time_tv;
 
-    TextView edit_video_topic_tv;
-    TextView edit_video_sure_tv;
     View frame_container;
 
     @Override
@@ -51,34 +44,72 @@ public class ActCutVideo extends BaseContainerActivity implements IdChooser {
         return R.layout.media_act_cut_video;
     }
 
-
-    public static final long MAX_VIDEO_DURATION = 15_000L;//视频最大时长,超过需要剪切
     private Video data;
 
     private ArrayList<String> arrayList;//主题列表
 
+    @Override
+    protected void parseIntent(Intent intent) {
+        arrayList = intent.getStringArrayListExtra(ArrayList.class.getSimpleName());
+        data = JSONObject.parseObject(intent.getStringExtra(String.class.getSimpleName()), Video.class);
+    }
 
     @Override
-    protected Fragment initFragment() {
-        return new FgtDiscoveryTopic();
+    protected List<FgtCreater> getFgtCreaterList() {
+        List<FgtCreater> fgtCreaterList = new ArrayList<>();
+        fgtCreaterList.add(new FgtCreater() {
+            @Override
+            public Fragment newInstance() {
+                return new FgtDiscoveryTopic();
+            }
+        });
+        fgtCreaterList.add(new FgtCreater() {
+            @Override
+            public Fragment newInstance() {
+                return new FgtEditVideoTypeList();
+            }
+        });
+        fgtCreaterList.add(new FgtCreater() {
+            @Override
+            public Fragment newInstance() {
+                return new FgtVideoFrameList();
+            }
+        });
+        return fgtCreaterList;
     }
+
     @Override
     public void initView() {
         super.initView();
-
-        Intent intent = getIntent();
-        arrayList = intent.getStringArrayListExtra(ArrayList.class.getSimpleName());
-        if (arrayList != null && fragment instanceof FgtDiscoveryTopic)
-            ((FgtDiscoveryTopic) fragment).loadData(arrayList);
-        data = JSONObject.parseObject(intent.getStringExtra(String.class.getSimpleName()), Video.class);
-
         mPlayerView = findViewById(R.id.videoGLSurfaceView);
-        videoFramesView = findViewById(R.id.media_videoFramesView);
-        edit_video_time_tv = findViewById(R.id.media_edit_video_time_tv);
-        edit_video_topic_tv = findViewById(R.id.media_edit_video_topic_tv);
-        edit_video_sure_tv = findViewById(R.id.media_edit_video_sure_tv);
         frame_container = findViewById(R.id.media_frame_container);
+    }
+    @Override
+    protected void onInitFragment(Fragment fragment, int position) {
+        super.onInitFragment(fragment, position);
+        if (fragment instanceof FgtDiscoveryTopic) {
+            if(arrayList != null)
+                ((FgtDiscoveryTopic) fragment).loadData(arrayList);
+        } else if (fragment instanceof FgtVideoFrameList) {
+            if(data != null)
+                ((FgtVideoFrameList) fragment).loadData(data);
+        }
+    }
+
+    @Override
+    protected void onShowFragment(Fragment fragment, int position) {
+        super.onShowFragment(fragment, position);
+        if (fragment instanceof FgtVideoFrameList) {
+            if(data != null)
+                ((FgtVideoFrameList) fragment).tryCheckDuration();
+        } else if(fragment instanceof FgtDoodle){
+            if(data != null)
+                ((FgtDoodle) fragment).loadData(data);
+        }
+    }
 
+    @Override
+    public void initListener() {
         //播放视频
         mPlayerView.setZOrderOnTop(false);
         mPlayerView.setZOrderMediaOverlay(true);
@@ -107,44 +138,8 @@ public class ActCutVideo extends BaseContainerActivity implements IdChooser {
                 player.start();
             }
         }, playCompletionCallback);
-
-        //视频帧
-        videoFramesView.initVideo(data).setMaxDuration(MAX_VIDEO_DURATION).showVideoList(this).setOnTimeChangeListener(new Action1<Float>() {
-            @Override
-            public void call(Float duration) {
-                if (duration == null)
-                    return;
-                if (videoFramesView.getVisibility() == View.VISIBLE)
-                    checkDuration(duration.longValue());
-                edit_video_time_tv.setText(getString(R.string.media_has_choose_x_second, new DecimalFormat("#.#").format(duration / 1000.0f)));
-//                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
-        edit_video_time_tv.setVisibility(View.INVISIBLE);
-        videoFramesView.setVisibility(View.INVISIBLE);
     }
 
-    private static final String TAG = ActCutVideo.class.getSimpleName();
-
-    //检查有没有设置剪切视频的时长
-    private void checkDuration(long duration) {
-        LogUtil.println(TAG, data.getDuration(), duration);
-        if ((data.getDuration() - duration) >= 500) {
-            edit_video_sure_tv.setText(BTN_TEXT_CUT);
-        } else {
-            edit_video_sure_tv.setText(BTN_TEXT_FINISH);
-        }
-    }
-
-
     @Override
     public void onPause() {
         super.onPause();
@@ -159,13 +154,6 @@ public class ActCutVideo extends BaseContainerActivity implements IdChooser {
         mPlayerView.onResume();
     }
 
-    @Override
-    protected void onDestroy() {
-        if (videoFramesView != null)
-            videoFramesView.onDestroy();
-        super.onDestroy();
-    }
-
     private VideoPlayerGLSurfaceView.PlayCompletionCallback playCompletionCallback = new VideoPlayerGLSurfaceView.PlayCompletionCallback() {
         @Override
         public void playComplete(MediaPlayer player) {
@@ -180,89 +168,25 @@ public class ActCutVideo extends BaseContainerActivity implements IdChooser {
         }
     };
 
-    //点击话题进行切换
-    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:
-                tryCut();
-                break;
-            case BTN_TEXT_FINISH:
-                finishCut();
-                break;
+    @Override
+    public void onSelectId(int id) {
+        String item = ListUtil.getItem(arrayList, id);
+        if (item != null) {
+            data.setTopicIndex(id);
         }
     }
 
-    private void finishCut() {//完成剪切并返回数据
-        Intent intent = new Intent();
-        intent.putExtra(Video.class.getSimpleName(), data);
-        setResult(RESULT_OK, intent);
-        finish();
-    }
-
-    private void tryCut() {//其次完成编辑
-        showProgress().getTextView().setText("剪切视频中");
-        VideoUtil.tryCutVideo(data.getFilePath(), videoFramesView.getStartPoint() * 1000, videoFramesView.getLineDuration() * 1000, new Action1<Object>() {
-            @Override
-            public void call(final Object result) {
-                runOnUiThread(new Runnable() {
-                    @Override
-                    public void run() {
-                        if (result instanceof Video) {
-                            Video video = (Video) result;
-                            data.setFilePath(video.getFilePath());
-                            data.setWidth(video.getWidth());
-                            data.setHeight(video.getHeight());
-                            data.setDuration(video.getDuration());
-                            sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + video.getFilePath())));
-                            hideProgress();
-                            G.showToast(getApplicationContext(), "剪切完成");
-                            finishCut();
-                        } else if (result instanceof Throwable) {
-                            hideProgress();
-                            G.showToast(getApplicationContext(), ((Throwable) result).getMessage());
-                        }
-                    }
-                });
-            }
-        });
-    }
+    private View curTouchView;
 
-    private void showCut() {//首先隐藏话题列表
-        ViewUtil.setVisibility(frame_container, false);
-        ViewUtil.setVisibility2(edit_video_time_tv, true);
-        ViewUtil.setVisibility2(videoFramesView, true);
-        checkDuration(videoFramesView.getLineDuration());
+    public void setCurTouchView(View curTouchView) {
+        this.curTouchView = curTouchView;
     }
 
     @Override
-    public void onSelectId(int id) {
-        String item = ListUtil.getItem(arrayList, id);
-        if (item != null) {
-            data.setTopicIndex(id);
-            ViewUtil.setText(edit_video_topic_tv, "#%s#", item);
+    public boolean onTouchEvent(MotionEvent event) {
+        if(curTouchView != null){
+            return curTouchView.onTouchEvent(event);
         }
+        return super.onTouchEvent(event);
     }
 }

+ 38 - 9
media/app/src/main/java/com/kfzs/cfyl/media/activity/ActEditVideo.java

@@ -1,5 +1,6 @@
 package com.kfzs.cfyl.media.activity;
 
+import android.content.Context;
 import android.content.Intent;
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
@@ -9,6 +10,7 @@ import android.support.v4.app.Fragment;
 import android.text.TextUtils;
 import android.util.Log;
 import android.view.View;
+import android.widget.ImageView;
 import android.widget.LinearLayout;
 import android.widget.SeekBar;
 
@@ -20,6 +22,7 @@ import com.kfzs.cfyl.media.api.Levelble;
 import com.kfzs.cfyl.media.bean.BeautifyFilter;
 import com.kfzs.cfyl.media.bean.Size;
 import com.kfzs.cfyl.media.fragment.FgtChooseEditList;
+import com.kfzs.cfyl.media.fragment.FgtDoodle;
 import com.kfzs.cfyl.media.util.BitmapUtil;
 import com.kfzs.cfyl.media.util.G;
 import com.kfzs.cfyl.media.util.ViewUtil;
@@ -31,6 +34,7 @@ import org.wysaid.nativePort.CGEFFmpegNativeLibrary;
 import org.wysaid.nativePort.CGENativeLibrary;
 import org.wysaid.view.VideoPlayerGLSurfaceView;
 
+import java.io.File;
 import java.util.Locale;
 
 import cn.finalteam.rxgalleryfinal.utils.MediaUtils;
@@ -75,6 +79,7 @@ public class ActEditVideo extends BaseContainerActivity implements Filterble, Le
         if (this instanceof BaseContainerActivity) {
             super.initView();
         }
+        loadDoodleFile();
         mPlayerView = findViewById(R.id.videoGLSurfaceView);
         data = (Video) getIntent().getSerializableExtra(Video.class.getSimpleName());
         mPlayerView.setZOrderOnTop(false);
@@ -147,15 +152,7 @@ public class ActEditVideo extends BaseContainerActivity implements Filterble, Le
     private String tryGenerateVideoWithFilter() {
         String srcFilPath = data.getFilePath();
         String outputFilename = String.format(Locale.CHINA, "%s_%d_%f.mp4", srcFilPath.substring(0, srcFilPath.lastIndexOf(".")), mCurrentConfig.hashCode(), mIntensity);
-        Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.media_sheep_logo_3);
-        //left 30px top 60px width 750
-        Bitmap logo = data.getOrientation() / 90 % 2 == 0 ?
-            BitmapUtil.createBigLogo(bmp, new Size().setWidth(data.getWidth()).setHeight(data.getHeight()).setX(data.getWidth() * 30 / 750).setY(data.getWidth() * 60 / 750)) :
-            BitmapUtil.createBigLogo(bmp, new Size().setWidth(data.getHeight()).setHeight(data.getWidth()).setX(data.getHeight() * 30 / 750).setY(data.getHeight() * 60 / 750));
-        Bitmap rotateBmp = data.getOrientation() != 0 ? MediaUtils.rotateBimap(360 - data.getOrientation(), logo) : logo;
-        if(logo != rotateBmp)
-            logo.recycle();
-        bmp.recycle();
+        Bitmap rotateBmp = getRotateBmp(getApplicationContext(), data);
 
         CGEFFmpegNativeLibrary.generateVideoWithFilter(outputFilename, srcFilPath, mCurrentConfig, mIntensity, rotateBmp, CGENativeLibrary.TextureBlendMode.CGE_BLEND_ADDREV, 1.0f, false);
         rotateBmp.recycle();
@@ -163,6 +160,27 @@ public class ActEditVideo extends BaseContainerActivity implements Filterble, Le
         return outputFilename;
     }
 
+    public static Bitmap getRotateBmp(Context context, Video data) {
+        File doodleFile = FgtDoodle.getDoodleFile(context);
+        Bitmap doodleBitmap;
+        Bitmap logo = null;
+        if(doodleFile.exists()){
+            doodleBitmap = BitmapFactory.decodeFile(doodleFile.getAbsolutePath());
+        } else {
+            logo = BitmapFactory.decodeResource(context.getResources(), R.drawable.media_sheep_logo_3);
+            //left 30px top 60px width 750
+            doodleBitmap = data.getOrientation() / 90 % 2 == 0 ?
+                    BitmapUtil.createBigLogo(logo, new Size().setWidth(data.getWidth()).setHeight(data.getHeight()).setX(data.getWidth() * 30 / 750).setY(data.getWidth() * 60 / 750)) :
+                    BitmapUtil.createBigLogo(logo, new Size().setWidth(data.getHeight()).setHeight(data.getWidth()).setX(data.getHeight() * 30 / 750).setY(data.getHeight() * 60 / 750));
+        }
+        Bitmap rotateBmp = data.getOrientation() != 0 ? MediaUtils.rotateBimap(360 - data.getOrientation(), doodleBitmap) : doodleBitmap;
+        if(doodleBitmap != rotateBmp)
+            doodleBitmap.recycle();
+        if(logo != null)
+            logo.recycle();
+        return rotateBmp;
+    }
+
     private IFilter filter;
     //设置滤镜
     @Override
@@ -355,4 +373,15 @@ public class ActEditVideo extends BaseContainerActivity implements Filterble, Le
         return new FgtChooseEditList();
     }
 
+
+    //加载之前保存的图片
+    private void loadDoodleFile() {
+        ImageView act_edit_video_doodle_iv = findViewById(R.id.act_edit_video_doodle_iv);
+        File doodleFile = FgtDoodle.getDoodleFile(getApplicationContext());
+        if(doodleFile.exists()){
+            Bitmap doodleBitmap = BitmapFactory.decodeFile(doodleFile.getAbsolutePath());
+            act_edit_video_doodle_iv.setImageBitmap(doodleBitmap);
+        }
+    }
+
 }

+ 26 - 1
media/app/src/main/java/com/kfzs/cfyl/media/activity/MainActivity.java

@@ -2,8 +2,10 @@ package com.kfzs.cfyl.media.activity;
 
 import android.app.Activity;
 import android.content.DialogInterface;
+import android.graphics.Bitmap;
 import android.support.v7.app.AlertDialog;
 import android.view.View;
+import android.widget.ImageView;
 
 import com.kfzs.cfyl.media.BaseActivity;
 import com.kfzs.cfyl.media.R;
@@ -75,10 +77,30 @@ public class MainActivity extends BaseActivity {
             }
         }).start();
     }
+    private void testDoodleAndLogo() {
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                List<MediaBean> mediaBeanList = MediaUtils.getMediaWithVideoList(getApplicationContext(), page++, 1);
+                MediaBean mediaBean = ListUtil.getItem(mediaBeanList, 0);
+                if(mediaBean != null) {
+                    final Video video = Video.from(mediaBean);
+                    final Bitmap bmp = ActEditVideo.getRotateBmp(getApplicationContext(), video);
+                    runOnUiThread(new Runnable() {
+                        @Override
+                        public void run() {
+                            ImageView media_act_main_iv = findViewById(R.id.media_act_main_iv);
+                            media_act_main_iv.setImageBitmap(bmp);
+                        }
+                    });
+                }
+            }
+        }).start();
+    }
 
     public void onClickHelloWorld(View view) {
         Activity activity = this;
-        final String[] items = {"剪切视频", "编辑视频"};
+        final String[] items = {"剪切视频", "编辑视频", "涂鸦与logo"};
         AlertDialog dialog = new AlertDialog.Builder(activity).setTitle("请选择测试项目")
                 .setItems(items, new DialogInterface.OnClickListener() {
 
@@ -91,6 +113,9 @@ public class MainActivity extends BaseActivity {
                             case "编辑视频":
                                 goEdit();
                                 break;
+                            case "涂鸦与logo":
+                                testDoodleAndLogo();
+                                break;
                         }
                     }
                 }).create();

+ 11 - 0
media/app/src/main/java/com/kfzs/cfyl/media/api/FgtCreater.java

@@ -0,0 +1,11 @@
+package com.kfzs.cfyl.media.api;
+
+import android.support.v4.app.Fragment;
+
+/**
+ * Created by realicing on 2018/12/19.
+ * realicing@sina.com
+ */
+public interface FgtCreater {
+    Fragment newInstance();
+}

+ 62 - 0
media/app/src/main/java/com/kfzs/cfyl/media/bean/EditVideoType.java

@@ -0,0 +1,62 @@
+package com.kfzs.cfyl.media.bean;
+
+import android.support.v4.app.Fragment;
+
+import com.kfzs.cfyl.media.R;
+import com.kfzs.cfyl.media.api.FgtCreater;
+import com.kfzs.cfyl.media.fragment.FgtDoodle;
+
+/**
+ * Created by realicing on 2018/12/20.
+ * realicing@sina.com
+ */
+public enum EditVideoType implements FgtCreater {
+    Doodle("涂鸦", R.mipmap.media_ic_doodle){
+        @Override
+        public Fragment newInstance() {
+            return new FgtDoodle();
+        }
+
+        @Override
+        public boolean isDeveloping() {
+            return false;
+        }
+    },
+    Sticker("贴纸", R.mipmap.media_ic_sticker),
+    Text("文字", R.mipmap.media_ic_text),
+    Cover("封面", R.mipmap.media_ic_cover),
+    Music("音乐", R.mipmap.media_ic_music),
+    ;
+    private String title;
+    private int drawableId;
+
+    EditVideoType(String title, int drawableId) {
+        this.title = title;
+        this.drawableId = drawableId;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public int getDrawableId() {
+        return drawableId;
+    }
+
+    public void setDrawableId(int drawableId) {
+        this.drawableId = drawableId;
+    }
+
+    //该功能是否处于开发中
+    public boolean isDeveloping() {
+        return true;
+    }
+    @Override
+    public Fragment newInstance() {
+        return null;
+    }
+}

+ 17 - 15
media/app/src/main/java/com/kfzs/cfyl/media/customview/VideoFramesView.java

@@ -389,23 +389,25 @@ public class VideoFramesView extends RelativeLayout {
 
     public void setOnTimeChangeListener(Action1<Float> action1) {
         onTimeChangeListener = action1;
-        postDelayed(new Runnable() {
-            @Override
-            public void run() {
-                firstStartX = line_start.getX();
-                firstEndX = line_end.getX();
-                lineW = line_start.getWidth();
-                rvW = recyclerView.getWidth();
-                long duration = video.getDuration();
-                if (maxVideoDuration > 0) {
-                    if (duration > maxVideoDuration) {
-                        firstEndX = firstStartX + ((maxVideoDuration * 1.0f / duration) * (rvW - lineW));
-                        line_end.setX(firstEndX);
+        if(lineW == 0) {
+            postDelayed(new Runnable() {
+                @Override
+                public void run() {
+                    firstStartX = line_start.getX();
+                    firstEndX = line_end.getX();
+                    lineW = line_start.getWidth();
+                    rvW = recyclerView.getWidth();
+                    long duration = video.getDuration();
+                    if (maxVideoDuration > 0) {
+                        if (duration > maxVideoDuration) {
+                            firstEndX = firstStartX + ((maxVideoDuration * 1.0f / duration) * (rvW - lineW));
+                            line_end.setX(firstEndX);
+                        }
                     }
+                    onTimeChangeListener.call((float) getLineDuration());
                 }
-                onTimeChangeListener.call((float) duration);
-            }
-        }, 100);
+            }, 100);
+        }
     }
 
     //开始的时间,单位秒

+ 106 - 0
media/app/src/main/java/com/kfzs/cfyl/media/fragment/FgtColorList.java

@@ -0,0 +1,106 @@
+package com.kfzs.cfyl.media.fragment;
+
+
+import android.graphics.Color;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.GradientDrawable;
+import android.support.v7.widget.GridLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.view.View;
+import android.widget.ImageView;
+
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.BaseViewHolder;
+import com.kfzs.cfyl.media.BaseFragment;
+import com.kfzs.cfyl.media.R;
+import com.kfzs.cfyl.media.util.ListUtil;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import rx.functions.Action1;
+
+/**
+ * Created by realicing on 2018/12/20.
+ * realicing@sina.com
+ */
+public class FgtColorList extends BaseFragment {
+    @Override
+    public int getLayoutId() {
+        return R.layout.media_fgt_color_list;
+    }
+
+    private RecyclerView media_recyclerView;
+    private List<Integer> list = new ArrayList<>();
+    private List<Integer> colorList = new ArrayList<>();
+    private int curPosition;
+    @Override
+    public void onViewCreated() {
+        tryInitList();
+        media_recyclerView = findViewById(R.id.media_recyclerView);
+        media_recyclerView.setLayoutManager(new GridLayoutManager(media_recyclerView.getContext(), list.size()));
+        final BaseQuickAdapter<Integer, BaseViewHolder> baseQuickAdapter = new BaseQuickAdapter<Integer, BaseViewHolder>(R.layout.media_item_color, list) {
+
+            @Override
+            protected void convert(BaseViewHolder helper, Integer item) {
+                int position = helper.getAdapterPosition();
+                if(position == curPosition) {
+                    helper.setBackgroundRes(R.id.media_item_color_out_iv, R.drawable.media_shape_ring_white);
+                } else {
+                    helper.setBackgroundColor(R.id.media_item_color_out_iv, Color.TRANSPARENT);
+                }
+                helper.setBackgroundRes(R.id.media_item_color_in_iv, item);
+            }
+        };
+        baseQuickAdapter.bindToRecyclerView(media_recyclerView);
+        baseQuickAdapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() {
+            @Override
+            public void onItemClick(BaseQuickAdapter adapter, View view, int position) {
+               selectPosition(position);
+                int lastPosition = curPosition;
+                curPosition = position;
+                if(lastPosition != curPosition){
+                    baseQuickAdapter.notifyDataSetChanged();
+                }
+            }
+        });
+
+    }
+
+    private void selectPosition(int position) {
+        Integer item = ListUtil.getItem(colorList, position);
+        if(item != null){
+            if(selectColorAction1 != null){
+                selectColorAction1.call(item);
+            }
+        }
+    }
+
+    private Action1<Integer> selectColorAction1;
+    public FgtColorList loadData(Action1<Integer> selectColorAction1){
+        this.selectColorAction1 = selectColorAction1;
+        tryInitList();
+        return this;
+    }
+
+    private void tryInitList() {
+        if(list.isEmpty()){
+            list.add(R.drawable.media_shape_oval_white);
+            list.add(R.drawable.media_shape_oval_black);
+            list.add(R.drawable.media_shape_oval_red_ff1d11);
+            list.add(R.drawable.media_shape_oval_fbf606);
+            list.add(R.drawable.media_shape_oval_14e213);
+            list.add(R.drawable.media_shape_oval_1b9bff);
+            list.add(R.drawable.media_shape_oval_8c05ff);
+        }
+        if(colorList.isEmpty()){
+            colorList.add(Color.WHITE);
+            colorList.add(Color.BLACK);
+            colorList.add(Color.parseColor("#ff1d11"));
+            colorList.add(Color.parseColor("#fbf606"));
+            colorList.add(Color.parseColor("#14e213"));
+            colorList.add(Color.parseColor("#1b9bff"));
+            colorList.add(Color.parseColor("#8c05ff"));
+        }
+    }
+}

+ 50 - 5
media/app/src/main/java/com/kfzs/cfyl/media/fragment/FgtDiscoveryTopic.java

@@ -1,15 +1,23 @@
 package com.kfzs.cfyl.media.fragment;
 
+import android.app.Activity;
 import android.support.v7.widget.LinearLayoutManager;
 import android.support.v7.widget.RecyclerView;
+import android.view.KeyEvent;
 import android.view.View;
+import android.widget.ImageView;
+import android.widget.TextView;
 
 import com.chad.library.adapter.base.BaseQuickAdapter;
 import com.chad.library.adapter.base.BaseViewHolder;
 import com.kfzs.cfyl.media.BaseFragment;
+import com.kfzs.cfyl.media.BaseListFgtActivity;
 import com.kfzs.cfyl.media.R;
 import com.kfzs.cfyl.media.api.IdChooser;
 import com.kfzs.cfyl.media.util.G;
+import com.kfzs.cfyl.media.util.KeyEventUtil;
+import com.kfzs.cfyl.media.util.ListUtil;
+import com.kfzs.cfyl.media.util.ViewUtil;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -22,13 +30,31 @@ public class FgtDiscoveryTopic extends BaseFragment {
 
     @Override
     public int getLayoutId() {
-        return R.layout.media_common_rv;
+        return R.layout.media_fgt_dt;
     }
 
     private RecyclerView recyclerView;
+    private TextView edit_video_topic_tv;
     @Override
     public void onViewCreated() {
-        recyclerView = findViewById(R.id.recyclerView);
+        recyclerView = findViewById(R.id.media_recyclerView);
+        edit_video_topic_tv = findViewById(R.id.media_edit_video_topic_tv);
+
+        ImageView media_video_back_iv = findViewById(R.id.media_video_back_iv);
+        media_video_back_iv.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                onClickBackImg(view);
+            }
+        });
+
+        TextView edit_video_sure_tv = findViewById(R.id.media_edit_video_sure_tv);
+        edit_video_sure_tv.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                onClickNext(view);
+            }
+        });
         if(list != null){
             if(recyclerView == null){
                 G.showToast(getContext(), "初始化失败");
@@ -37,21 +63,40 @@ public class FgtDiscoveryTopic extends BaseFragment {
             initView();
         }
     }
-
+    //点击返回
+    public void onClickBackImg(View view) {
+        Activity activity = getActivity();
+        if(activity instanceof BaseListFgtActivity){
+            if(((BaseListFgtActivity) activity).switchLastFgt()){
+                return;
+            }
+        }
+        KeyEventUtil.sendKeyDownUp(KeyEvent.KEYCODE_BACK);
+    }
+    //点击下一步
+    public void onClickNext(View view) {
+        Activity activity = getActivity();
+        if(activity instanceof BaseListFgtActivity){
+            ((BaseListFgtActivity) activity).switchNextFgt();
+        }
+    }
     public void loadData(ArrayList<String> arrayList) {
         list = arrayList;
         if(recyclerView != null)
             initView();
     }
-    private BaseQuickAdapter<String, BaseViewHolder> baseQuickAdapter;
     private void initView(){
         recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
-        baseQuickAdapter = getAdapter();
+        BaseQuickAdapter<String, BaseViewHolder> baseQuickAdapter = getAdapter();
         baseQuickAdapter.bindToRecyclerView(recyclerView);
         baseQuickAdapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() {
             @Override
             public void onItemClick(BaseQuickAdapter adapter, View view, int position) {
                 if(getActivity() instanceof IdChooser){
+                    String item = ListUtil.getItem(list, position);
+                    if (item != null) {
+                        ViewUtil.setText(edit_video_topic_tv, "#%s#", item);
+                    }
                     ((IdChooser) getActivity()).onSelectId(position);
                 }
             }

+ 290 - 0
media/app/src/main/java/com/kfzs/cfyl/media/fragment/FgtDoodle.java

@@ -0,0 +1,290 @@
+package com.kfzs.cfyl.media.fragment;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.res.Configuration;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Color;
+import android.support.v4.app.Fragment;
+import android.support.v4.view.ViewPager;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+
+import com.kfzs.cfyl.media.BaseFragment;
+import com.kfzs.cfyl.media.BaseListFgtActivity;
+import com.kfzs.cfyl.media.R;
+import com.kfzs.cfyl.media.activity.ActCutVideo;
+import com.kfzs.cfyl.media.adapter.ViewPagerFragmentAdapter;
+import com.kfzs.cfyl.media.bean.Size;
+import com.kfzs.cfyl.media.util.BitmapUtil;
+import com.kfzs.cfyl.media.util.G;
+import com.kfzs.cfyl.media.util.ListUtil;
+import com.kfzs.cfyl.share_library.util.LogUtil;
+import com.sheep.gamegroup.model.entity.Video;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import cn.hzw.doodle.DoodleActivity;
+import cn.hzw.doodle.DoodleBitmap;
+import cn.hzw.doodle.DoodleColor;
+import cn.hzw.doodle.DoodleOnTouchGestureListener;
+import cn.hzw.doodle.DoodleParams;
+import cn.hzw.doodle.DoodlePen;
+import cn.hzw.doodle.DoodleShape;
+import cn.hzw.doodle.DoodleText;
+import cn.hzw.doodle.DoodleTouchDetector;
+import cn.hzw.doodle.DoodleView;
+import cn.hzw.doodle.IDoodleListener;
+import cn.hzw.doodle.core.IDoodle;
+import cn.hzw.doodle.core.IDoodleItem;
+import cn.hzw.doodle.core.IDoodlePen;
+import cn.hzw.doodle.core.IDoodleSelectableItem;
+import cn.hzw.doodle.core.IDoodleTouchDetector;
+import rx.functions.Action1;
+
+/**
+ * Created by realicing on 2018/12/20.
+ * realicing@sina.com
+ * 涂鸦功能
+ */
+public class FgtDoodle extends BaseFragment {
+    @Override
+    public int getLayoutId() {
+        return R.layout.media_fgt_doodle;
+    }
+
+    private ViewPager media_viewPager;
+    @Override
+    public void onViewCreated() {
+        media_viewPager = findViewById(R.id.media_viewPager);
+
+        List<Fragment> fragmentList = new ArrayList<>();
+        fragmentList.add(new FgtColorList().loadData(new Action1<Integer>() {
+            @Override
+            public void call(Integer color) {
+                selectColor(color);
+            }
+        }));
+        ViewPagerFragmentAdapter mViewPagerFragmentAdapter = new ViewPagerFragmentAdapter(getChildFragmentManager(), fragmentList);
+        media_viewPager.setAdapter(mViewPagerFragmentAdapter);
+        media_viewPager.setOffscreenPageLimit(mViewPagerFragmentAdapter.getCount());
+
+        ImageView media_video_back_iv = findViewById(R.id.media_video_back_iv);
+        media_video_back_iv.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                onClickBackImg(view);
+            }
+        });
+
+        View media_video_undo_tv = findViewById(R.id.media_video_undo_tv);
+        media_video_undo_tv.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                onClickUndo(view);
+            }
+        });
+
+        View media_video_redo_tv = findViewById(R.id.media_video_redo_tv);
+        media_video_redo_tv.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                onClickRedo(view);
+            }
+        });
+
+        View media_video_reset_tv = findViewById(R.id.media_video_reset_tv);
+        media_video_reset_tv.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                onClickReset(view);
+            }
+        });
+
+        View media_edit_video_sure_iv = findViewById(R.id.media_edit_video_sure_iv);
+        media_edit_video_sure_iv.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                onClickNext(view);
+            }
+        });
+    }
+
+    //点击返回
+    public void onClickBackImg(View view) {
+        Activity activity = getActivity();
+        if (activity instanceof BaseListFgtActivity) {
+            ((BaseListFgtActivity) activity).switchFgt(FgtEditVideoTypeList.POSITION, this);
+        }
+    }
+    //点击撤销
+    public void onClickUndo(View view) {
+        if(mDoodleView != null){
+            IDoodleItem lastItem = ListUtil.getLast(mDoodleView.getAllItem());
+            if(lastItem != null){
+                mDoodleView.removeItem(lastItem);
+                redoList.add(lastItem);
+            }
+        }
+    }
+    private List<IDoodleItem> redoList = new ArrayList<>();
+    //点击重做
+    public void onClickRedo(View view) {
+        if(mDoodleView != null){
+            IDoodleItem lastItem = ListUtil.getLast(redoList);
+            if(lastItem != null){
+                redoList.remove(lastItem);
+                mDoodleView.addItem(lastItem);
+            }
+        }
+    }
+    //点击重置
+    public void onClickReset(View view) {
+        if(mDoodleView != null){
+            mDoodleView.clear();
+            redoList.clear();
+        }
+    }
+
+    //点击保存
+    public void onClickNext(View view) {
+        if(mDoodleView != null){
+            mDoodleView.save();
+        }
+        onClickBackImg(view);
+    }
+
+
+    private void selectColor(Integer color) {
+        if(mDoodleView != null){
+            if(mDoodleView.getColor() instanceof DoodleColor){
+                ((DoodleColor) mDoodleView.getColor()).setColor(color);
+            }
+        }
+    }
+
+    public static File getDoodleFile(Context context){
+        File dir = context.getDir("png", Context.MODE_PRIVATE);
+        return new File(dir, "doodle.png");
+    }
+    private void initDoodleView(final ViewGroup media_fgt_doodle_container) {
+        // 涂鸦参数
+        mDoodleParams = new DoodleParams();
+        mDoodleParams.mIsFullScreen = true;
+        mDoodleParams.mIsDrawableOutside = true;
+        // 初始画笔大小
+        mDoodleParams.mPaintUnitSize = DoodleView.DEFAULT_SIZE;
+        final Context context = media_fgt_doodle_container.getContext();
+        final File doodleFile = getDoodleFile(context);
+        final Bitmap loadBitmap = BitmapUtil.getDefaultBitmap(getResources(), data);
+        doodleFile.deleteOnExit();//删除之前的图片
+        mDoodle = mDoodleView = new DoodleView(context, loadBitmap, new IDoodleListener() {
+            /*
+            called when save the doodled iamge.
+            保存涂鸦图像时调用
+             */
+            @Override
+            public void onSaved(IDoodle doodle, Bitmap bgBitmap, Runnable callback) {
+                Bitmap logo = BitmapFactory.decodeResource(context.getResources(), R.drawable.media_sheep_logo_3);
+                int w = bgBitmap.getWidth();
+                int h = bgBitmap.getHeight();
+                Size size = new Size().setWidth(w).setHeight(h).setX(w * 30 / 750).setY(w * 60 / 750);
+                Bitmap logoFull = BitmapUtil.createBigLogo(logo, size);
+                Bitmap result = BitmapUtil.mergeBitmap(bgBitmap, logoFull);
+                BitmapUtil.saveImage(result, doodleFile);
+                BitmapUtil.recycle(logo);
+                BitmapUtil.recycle(logoFull);
+                BitmapUtil.recycle(result);
+            }
+
+            /*
+             called when it is ready to doodle because the view has been measured. Now, you can set size, color, pen, shape, etc.
+             此时view已经测量完成,涂鸦前的准备工作已经完成,在这里可以设置大小、颜色、画笔、形状等。
+             */
+            @Override
+            public void onReady(IDoodle doodle) {
+                float size = mDoodleParams.mPaintUnitSize > 0 ? mDoodleParams.mPaintUnitSize * mDoodle.getUnitSize() : 0;
+                if (size <= 0) {
+                    size = mDoodleParams.mPaintPixelSize > 0 ? mDoodleParams.mPaintPixelSize : mDoodle.getSize();
+                }
+                // 设置初始值
+                mDoodle.setSize(size);
+                // 选择画笔
+                mDoodle.setPen(DoodlePen.BRUSH);
+                mDoodle.setShape(DoodleShape.HAND_WRITE);
+                if (mDoodleParams.mZoomerScale <= 0) {
+                    findViewById(cn.hzw.doodle.R.id.btn_zoomer).setVisibility(View.GONE);
+                }
+                mDoodle.setZoomerScale(mDoodleParams.mZoomerScale);
+
+                // 每个画笔的初始值
+                mPenSizeMap.put(DoodlePen.BRUSH, mDoodle.getSize());
+                mPenSizeMap.put(DoodlePen.COPY, DoodleActivity.DEFAULT_COPY_SIZE * mDoodle.getUnitSize());
+                mPenSizeMap.put(DoodlePen.ERASER, mDoodle.getSize());
+                mPenSizeMap.put(DoodlePen.TEXT, DoodleActivity.DEFAULT_TEXT_SIZE * mDoodle.getUnitSize());
+                mPenSizeMap.put(DoodlePen.BITMAP, DoodleActivity.DEFAULT_BITMAP_SIZE * mDoodle.getUnitSize());
+            }
+        });
+
+        mTouchGestureListener = new DoodleOnTouchGestureListener(mDoodleView, new DoodleOnTouchGestureListener.ISelectionListener() {
+            /*
+             called when the item(such as text, texture) is selected/unselected.
+             item(如文字,贴图)被选中或取消选中时回调
+             */
+            @Override
+            public void onSelectedItem(IDoodle doodle, IDoodleSelectableItem selectableItem, boolean selected) {
+                //do something
+            }
+
+            /*
+             called when you click the view to create a item(such as text, texture).
+             点击View中的某个点创建可选择的item(如文字,贴图)时回调
+             */
+            @Override
+            public void onCreateSelectableItem(IDoodle doodle, float x, float y) {
+                //do something
+                if (mDoodle.getPen() == DoodlePen.TEXT) {
+                    IDoodleSelectableItem item = new DoodleText(mDoodle, "hello", 20 * mDoodle.getUnitSize(), new DoodleColor(Color.RED), x, y);
+                    mDoodle.addItem(item);
+                } else if (mDoodle.getPen() == DoodlePen.BITMAP) {
+                    IDoodleSelectableItem item = new DoodleBitmap(mDoodle, loadBitmap, 80 * mDoodle.getUnitSize(), x, y);
+                    mDoodle.addItem(item);
+                }
+            }
+        });
+
+// create touch detector, which dectects the gesture of scoll, scale, single tap, etc.
+// 创建手势识别器,识别滚动,缩放,点击等手势
+        IDoodleTouchDetector detector = new DoodleTouchDetector(media_fgt_doodle_container.getContext(), mTouchGestureListener);
+        mDoodleView.setDefaultTouchDetector(detector);
+
+// Setting parameters.设置参数
+        mDoodleView.setPen(DoodlePen.TEXT);
+        mDoodleView.setShape(DoodleShape.HAND_WRITE);
+        mDoodleView.setColor(new DoodleColor(Color.WHITE));
+        mDoodle.setIsDrawableOutside(mDoodleParams.mIsDrawableOutside);
+
+        media_fgt_doodle_container.addView(mDoodleView, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
+    }
+
+    private DoodleView mDoodleView;
+    private IDoodle mDoodle;
+    private DoodleParams mDoodleParams;
+    private Map<IDoodlePen, Float> mPenSizeMap = new HashMap<>(); //保存每个画笔对应的最新大小
+    private DoodleOnTouchGestureListener mTouchGestureListener;
+
+    private Video data;
+    public void loadData(Video data) {
+        if(this.data == null) {
+            this.data = data;
+            ViewGroup media_fgt_doodle_container = findViewById(R.id.media_fgt_doodle_container);
+            initDoodleView(media_fgt_doodle_container);
+        }
+    }
+}

+ 129 - 0
media/app/src/main/java/com/kfzs/cfyl/media/fragment/FgtEditVideoTypeList.java

@@ -0,0 +1,129 @@
+package com.kfzs.cfyl.media.fragment;
+
+import android.app.Activity;
+import android.support.v7.widget.GridLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.view.KeyEvent;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.BaseViewHolder;
+import com.kfzs.cfyl.media.BaseListFgtActivity;
+import com.kfzs.cfyl.media.BaseListFgtFgt;
+import com.kfzs.cfyl.media.R;
+import com.kfzs.cfyl.media.api.FgtCreater;
+import com.kfzs.cfyl.media.bean.EditVideoType;
+import com.kfzs.cfyl.media.util.G;
+import com.kfzs.cfyl.media.util.KeyEventUtil;
+import com.kfzs.cfyl.media.util.ListUtil;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by realicing on 2018/12/6.
+ * realicing@sina.com
+ * 涂鸦、贴纸、文字、封面、音乐
+ */
+public class FgtEditVideoTypeList extends BaseListFgtFgt {
+
+    @Override
+    public int getLayoutId() {
+        return R.layout.media_fgt_edit_video_type_list;
+    }
+
+    public static final int POSITION = 1;
+    private RecyclerView recyclerView;
+
+    @Override
+    public void onViewCreated() {
+        recyclerView = findViewById(R.id.media_recyclerView);
+
+        ImageView media_video_back_iv = findViewById(R.id.media_video_back_iv);
+        media_video_back_iv.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                onClickBackImg(view);
+            }
+        });
+
+        TextView edit_video_sure_tv = findViewById(R.id.media_edit_video_sure_tv);
+        edit_video_sure_tv.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                onClickNext(view);
+            }
+        });
+        if (list != null) {
+            if (recyclerView == null) {
+                G.showToast(getContext(), "初始化失败");
+                return;
+            }
+            initView();
+        }
+    }
+
+    private void initView() {
+        recyclerView.setLayoutManager(new GridLayoutManager(getContext(), list.size()));
+        BaseQuickAdapter<EditVideoType, BaseViewHolder> baseQuickAdapter = getAdapter();
+        baseQuickAdapter.bindToRecyclerView(recyclerView);
+        baseQuickAdapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() {
+            @Override
+            public void onItemClick(BaseQuickAdapter adapter, View view, int index) {
+                if (getActivity() instanceof BaseListFgtActivity) {
+                    EditVideoType item = ListUtil.getItem(list, index);
+                    if (item != null) {
+                        if (item.isDeveloping()) {
+                            G.showToast(getActivity(), R.string.media_coming_soon);
+                            return;
+                        }
+                        switchFgt(index);
+                    }
+                }
+            }
+        });
+    }
+
+    private List<EditVideoType> list = ListUtil.asList(EditVideoType.values());
+
+    protected BaseQuickAdapter<EditVideoType, BaseViewHolder> getAdapter() {
+        return new BaseQuickAdapter<EditVideoType, BaseViewHolder>(R.layout.media_item_iv_tv, list) {
+            @Override
+            protected void convert(BaseViewHolder helper, EditVideoType item) {
+                helper.setText(R.id.media_item_tv, item.getTitle());
+                helper.setImageResource(R.id.media_item_iv, item.getDrawableId());
+            }
+        };
+    }
+
+    //点击返回
+    public void onClickBackImg(View view) {
+        Activity activity = getActivity();
+        if (activity instanceof BaseListFgtActivity) {
+            if (((BaseListFgtActivity) activity).switchLastFgt()) {
+                return;
+            }
+        }
+        KeyEventUtil.sendKeyDownUp(KeyEvent.KEYCODE_BACK);
+    }
+
+    //点击下一步
+    public void onClickNext(View view) {
+        Activity activity = getActivity();
+        if (activity instanceof BaseListFgtActivity) {
+            ((BaseListFgtActivity) activity).switchNextFgt();
+        }
+    }
+
+    @Override
+    protected List<FgtCreater> getFgtCreaterList() {
+        List<FgtCreater> fgtCreaterList = new ArrayList<>();
+        for (EditVideoType type : list) {
+            if (!type.isDeveloping())
+                fgtCreaterList.add(type);
+        }
+        return fgtCreaterList;
+    }
+}

+ 174 - 0
media/app/src/main/java/com/kfzs/cfyl/media/fragment/FgtVideoFrameList.java

@@ -0,0 +1,174 @@
+package com.kfzs.cfyl.media.fragment;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.net.Uri;
+import android.view.KeyEvent;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.kfzs.cfyl.media.BaseActivity;
+import com.kfzs.cfyl.media.BaseFragment;
+import com.kfzs.cfyl.media.BaseListFgtActivity;
+import com.kfzs.cfyl.media.R;
+import com.kfzs.cfyl.media.customview.VideoFramesView;
+import com.kfzs.cfyl.media.util.G;
+import com.kfzs.cfyl.media.util.KeyEventUtil;
+import com.kfzs.cfyl.media.util.VideoUtil;
+import com.kfzs.cfyl.share_library.util.LogUtil;
+import com.sheep.gamegroup.model.entity.Video;
+
+import java.text.DecimalFormat;
+
+import rx.functions.Action1;
+
+/**
+ * Created by realicing on 2018/12/19.
+ * realicing@sina.com
+ * 截取视频帧
+ */
+public class FgtVideoFrameList extends BaseFragment {
+    private VideoFramesView videoFramesView;
+    private TextView edit_video_time_tv;
+    private TextView edit_video_sure_tv;
+    @Override
+    public int getLayoutId() {
+        return R.layout.media_fgt_cut_video;
+    }
+
+    @Override
+    public void onViewCreated() {
+        videoFramesView = findViewById(R.id.media_videoFramesView);
+        edit_video_time_tv = findViewById(R.id.media_edit_video_time_tv);
+        edit_video_sure_tv = findViewById(R.id.media_edit_video_sure_tv);
+
+        ImageView media_video_back_iv = findViewById(R.id.media_video_back_iv);
+        media_video_back_iv.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                onClickBackImg(view);
+            }
+        });
+
+        edit_video_sure_tv.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                onClickNext(view);
+            }
+        });
+        tryInitVideoData();
+    }
+
+    private void tryInitVideoData() {
+        if(data != null && videoFramesView != null && getActivity() != null){
+            initVideoData();
+        }
+    }
+    public static final long MAX_VIDEO_DURATION = 15_000L;//视频最大时长,超过需要剪切
+    private Video data;
+    public void loadData(Video video){
+        data = video;
+    }
+
+    //
+    private void initVideoData() {
+        //视频帧
+        videoFramesView.initVideo(data).setMaxDuration(MAX_VIDEO_DURATION).showVideoList(getActivity());
+    }
+    public void tryCheckDuration(){
+//        checkDuration(videoFramesView.getLineDuration());
+        videoFramesView.setOnTimeChangeListener(new Action1<Float>() {
+            @Override
+            public void call(Float duration) {
+                if (duration == null)
+                    return;
+                if (videoFramesView.getVisibility() == View.VISIBLE)
+                    checkDuration(duration.longValue());
+                edit_video_time_tv.setText(getString(R.string.media_has_choose_x_second, new DecimalFormat("#.#").format(duration / 1000.0f)));
+//                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());
+            }
+        });
+    }
+    private static final String TAG = FgtVideoFrameList.class.getSimpleName();
+    //检查有没有设置剪切视频的时长
+    private void checkDuration(long duration) {
+        LogUtil.println(TAG, data.getDuration(), duration);
+        if ((data.getDuration() - duration) >= 500) {
+            edit_video_sure_tv.setText(BTN_TEXT_CUT);
+        } else {
+            edit_video_sure_tv.setText(BTN_TEXT_FINISH);
+        }
+    }
+
+    private void tryCut() {//其次完成编辑
+        Activity activity = getActivity();
+        if(activity instanceof BaseActivity) {
+            final BaseActivity baseActivity = (BaseActivity) activity;
+            baseActivity.showProgress().getTextView().setText("剪切视频中");
+            VideoUtil.tryCutVideoByMedia(data.getFilePath(), videoFramesView.getStartPoint() * 1000, videoFramesView.getLineDuration() * 1000, new Action1<Object>() {
+                @Override
+                public void call(final Object result) {
+                    baseActivity.runOnUiThread(new Runnable() {
+                        @Override
+                        public void run() {
+                            if (result instanceof Video) {
+                                Video video = (Video) result;
+                                data.setFilePath(video.getFilePath());
+                                data.setWidth(video.getWidth());
+                                data.setHeight(video.getHeight());
+                                data.setDuration(video.getDuration());
+                                baseActivity.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + video.getFilePath())));
+                                baseActivity.hideProgress();
+                                G.showToast(baseActivity.getApplicationContext(), "剪切完成");
+                                finishCut(baseActivity);
+                            } else if (result instanceof Throwable) {
+                                baseActivity.hideProgress();
+                                G.showToast(baseActivity.getApplicationContext(), ((Throwable) result).getMessage());
+                            }
+                        }
+                    });
+                }
+            });
+        }
+    }
+
+    //完成剪切
+    private void finishCut(BaseActivity baseActivity) {//完成剪切并返回数据
+        Intent intent = new Intent();
+        intent.putExtra(Video.class.getSimpleName(), data);
+        baseActivity.setResult(Activity.RESULT_OK, intent);
+        baseActivity.finish();
+    }
+    @Override
+    public void onDestroy() {
+        if (videoFramesView != null)
+            videoFramesView.onDestroy();
+        super.onDestroy();
+    }
+
+    private static final String BTN_TEXT_CUT = "剪切";
+    private static final String BTN_TEXT_FINISH = "完成";
+
+    //点击返回
+    public void onClickBackImg(View view) {
+        Activity activity = getActivity();
+        if(activity instanceof BaseListFgtActivity){
+            if(((BaseListFgtActivity) activity).switchLastFgt()){
+                return;
+            }
+        }
+        KeyEventUtil.sendKeyDownUp(KeyEvent.KEYCODE_BACK);
+    }
+    //点击下一步
+    public void onClickNext(View view) {
+        tryCut();
+    }
+}

+ 200 - 0
media/app/src/main/java/com/kfzs/cfyl/media/util/BitmapUtil.java

@@ -1,11 +1,22 @@
 package com.kfzs.cfyl.media.util;
 
+import android.content.res.Configuration;
+import android.content.res.Resources;
 import android.graphics.Bitmap;
 import android.graphics.Canvas;
 import android.graphics.Matrix;
 import android.graphics.Paint;
+import android.graphics.Rect;
 
 import com.kfzs.cfyl.media.bean.Size;
+import com.kfzs.cfyl.media.fragment.FgtDoodle;
+import com.kfzs.cfyl.share_library.util.LogUtil;
+import com.sheep.gamegroup.model.entity.Video;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
 
 
 /**
@@ -13,6 +24,125 @@ import com.kfzs.cfyl.media.bean.Size;
  * realicing@sina.com
  */
 public class BitmapUtil {
+    /**
+     * 把两个位图覆盖合成为一个位图,以底层位图的长宽为基准
+     * @param backBitmap 在底部的位图
+     * @param frontBitmap 盖在上面的位图
+     * @return
+     */
+    public static Bitmap mergeBitmap(Bitmap backBitmap, Bitmap frontBitmap) {
+
+        if (backBitmap == null || backBitmap.isRecycled()
+                || frontBitmap == null || frontBitmap.isRecycled()) {
+            LogUtil.println("backBitmap=" + backBitmap + ";frontBitmap=" + frontBitmap);
+            return null;
+        }
+        Bitmap bitmap = backBitmap.copy(Bitmap.Config.ARGB_8888, true);
+        Canvas canvas = new Canvas(bitmap);
+        Rect baseRect  = new Rect(0, 0, backBitmap.getWidth(), backBitmap.getHeight());
+        Rect frontRect = new Rect(0, 0, frontBitmap.getWidth(), frontBitmap.getHeight());
+        canvas.drawBitmap(frontBitmap, frontRect, baseRect, null);
+        return bitmap;
+    }
+
+    /**
+     * 把两个位图覆盖合成为一个位图,左右拼接
+     * @param leftBitmap
+     * @param rightBitmap
+     * @param isBaseMax 是否以宽度大的位图为准,true则小图等比拉伸,false则大图等比压缩
+     * @return
+     */
+    public static Bitmap mergeBitmap_LR(Bitmap leftBitmap, Bitmap rightBitmap, boolean isBaseMax) {
+
+        if (leftBitmap == null || leftBitmap.isRecycled()
+                || rightBitmap == null || rightBitmap.isRecycled()) {
+            LogUtil.println("leftBitmap=" + leftBitmap + ";rightBitmap=" + rightBitmap);
+            return null;
+        }
+        int height = 0; // 拼接后的高度,按照参数取大或取小
+        if (isBaseMax) {
+            height = leftBitmap.getHeight() > rightBitmap.getHeight() ? leftBitmap.getHeight() : rightBitmap.getHeight();
+        } else {
+            height = leftBitmap.getHeight() < rightBitmap.getHeight() ? leftBitmap.getHeight() : rightBitmap.getHeight();
+        }
+
+        // 缩放之后的bitmap
+        Bitmap tempBitmapL = leftBitmap;
+        Bitmap tempBitmapR = rightBitmap;
+
+        if (leftBitmap.getHeight() != height) {
+            tempBitmapL = Bitmap.createScaledBitmap(leftBitmap, (int)(leftBitmap.getWidth()*1f/leftBitmap.getHeight()*height), height, false);
+        } else if (rightBitmap.getHeight() != height) {
+            tempBitmapR = Bitmap.createScaledBitmap(rightBitmap, (int)(rightBitmap.getWidth()*1f/rightBitmap.getHeight()*height), height, false);
+        }
+
+        // 拼接后的宽度
+        int width = tempBitmapL.getWidth() + tempBitmapR.getWidth();
+
+        // 定义输出的bitmap
+        Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
+        Canvas canvas = new Canvas(bitmap);
+
+        // 缩放后两个bitmap需要绘制的参数
+        Rect leftRect = new Rect(0, 0, tempBitmapL.getWidth(), tempBitmapL.getHeight());
+        Rect rightRect  = new Rect(0, 0, tempBitmapR.getWidth(), tempBitmapR.getHeight());
+
+        // 右边图需要绘制的位置,往右边偏移左边图的宽度,高度是相同的
+        Rect rightRectT  = new Rect(tempBitmapL.getWidth(), 0, width, height);
+
+        canvas.drawBitmap(tempBitmapL, leftRect, leftRect, null);
+        canvas.drawBitmap(tempBitmapR, rightRect, rightRectT, null);
+        return bitmap;
+    }
+
+
+    /**
+     * 把两个位图覆盖合成为一个位图,上下拼接
+     * @param topBitmap
+     * @param bottomBitmap
+     * @param isBaseMax 是否以高度大的位图为准,true则小图等比拉伸,false则大图等比压缩
+     * @return
+     */
+    public static Bitmap mergeBitmap_TB(Bitmap topBitmap, Bitmap bottomBitmap, boolean isBaseMax) {
+
+        if (topBitmap == null || topBitmap.isRecycled()
+                || bottomBitmap == null || bottomBitmap.isRecycled()) {
+            LogUtil.println("topBitmap=" + topBitmap + ";bottomBitmap=" + bottomBitmap);
+            return null;
+        }
+        int width = 0;
+        if (isBaseMax) {
+            width = topBitmap.getWidth() > bottomBitmap.getWidth() ? topBitmap.getWidth() : bottomBitmap.getWidth();
+        } else {
+            width = topBitmap.getWidth() < bottomBitmap.getWidth() ? topBitmap.getWidth() : bottomBitmap.getWidth();
+        }
+        Bitmap tempBitmapT = topBitmap;
+        Bitmap tempBitmapB = bottomBitmap;
+
+        if (topBitmap.getWidth() != width) {
+            tempBitmapT = Bitmap.createScaledBitmap(topBitmap, width, (int)(topBitmap.getHeight()*1f/topBitmap.getWidth()*width), false);
+        } else if (bottomBitmap.getWidth() != width) {
+            tempBitmapB = Bitmap.createScaledBitmap(bottomBitmap, width, (int)(bottomBitmap.getHeight()*1f/bottomBitmap.getWidth()*width), false);
+        }
+
+        int height = tempBitmapT.getHeight() + tempBitmapB.getHeight();
+
+        Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
+        Canvas canvas = new Canvas(bitmap);
+
+        Rect topRect = new Rect(0, 0, tempBitmapT.getWidth(), tempBitmapT.getHeight());
+        Rect bottomRect  = new Rect(0, 0, tempBitmapB.getWidth(), tempBitmapB.getHeight());
+
+        Rect bottomRectT  = new Rect(0, tempBitmapT.getHeight(), width, height);
+
+        canvas.drawBitmap(tempBitmapT, topRect, topRect, null);
+        canvas.drawBitmap(tempBitmapB, bottomRect, bottomRectT, null);
+        return bitmap;
+    }
+    public static Bitmap createBigLogo(Bitmap bmp, Size size, Bitmap bgBitmap) {
+        Bitmap bitmap = createBigLogo(bmp, size);
+        return mergeBitmap(bgBitmap, bitmap);
+    }
     public static Bitmap createBigLogo(Bitmap bmp, Size size) {
         Bitmap result = Bitmap.createBitmap(size.getWidth(), size.getHeight(), Bitmap.Config.ARGB_4444);
         Canvas canvas = new Canvas(result);
@@ -32,4 +162,74 @@ public class BitmapUtil {
         canvas.drawBitmap(bmp, matrix, paint);
         return result;
     }
+
+    public static File saveImage(Bitmap bmp, String dir, String fileName) {
+        File appDir = new File(dir);
+        if (!appDir.exists()) {
+            appDir.mkdir();
+        }
+        File file = new File(appDir, fileName);
+        try {
+            FileOutputStream fos = new FileOutputStream(file);
+            bmp.compress(Bitmap.CompressFormat.PNG, 100, fos);
+            fos.flush();
+            fos.close();
+            return file;
+        } catch (FileNotFoundException e) {
+            e.printStackTrace();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+    public static void saveImage(Bitmap bitmap, File file) {
+        File appDir = file.getParentFile();
+        if (!appDir.exists()) {
+            appDir.mkdir();
+        }
+        try {
+            FileOutputStream fos = new FileOutputStream(file);
+            bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
+            fos.flush();
+            fos.close();
+        } catch (FileNotFoundException e) {
+            e.printStackTrace();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    public static Bitmap getDefaultBitmap(Resources resources, Video data) {
+        int a = G.WIDTH;
+        int b = G.HEIGHT;
+        if(data != null){
+            a = data.getWidth();
+            b = data.getHeight();
+        }
+        boolean needExchange = false;
+        if(resources.getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
+            LogUtil.println(FgtDoodle.class.getSimpleName(), "info", "landscape");
+            needExchange = b > a;
+        } else if (resources.getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
+            LogUtil.println(FgtDoodle.class.getSimpleName(), "info", "portrait");
+            needExchange = a > b;
+        }
+        if(needExchange) {
+            int tmp = b;
+            b = a;
+            a = tmp;
+        }
+        return Bitmap.createBitmap(a, b, Bitmap.Config.ARGB_4444);
+    }
+
+    //释放bitmap
+    public static void recycle(Bitmap bitmap) {
+        if(bitmap != null && !bitmap.isRecycled()){
+            try {
+                bitmap.recycle();
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+    }
 }

+ 36 - 0
media/app/src/main/java/com/kfzs/cfyl/media/util/VideoUtil.java

@@ -15,6 +15,9 @@ import com.sheep.gamegroup.model.entity.Video;
 import java.nio.ByteBuffer;
 import java.util.Locale;
 
+import VideoHandle.EpEditor;
+import VideoHandle.EpVideo;
+import VideoHandle.OnEditorListener;
 import cn.finalteam.rxgalleryfinal.utils.MediaUtils;
 import rx.functions.Action1;
 //import wseemann.media.FFmpegMediaMetadataRetriever;
@@ -179,6 +182,39 @@ public class VideoUtil {
     }
 
     private static final String TAG = VideoUtil.class.getSimpleName();
+    public static void tryCutVideoByMedia(final String filePath, long clipPoint, final long clipDuration, final Action1<Object> action1) {
+        final Video video = new Video();
+        if (clipPoint < 0) {
+            Log.e(TAG, "clipPoint is error! but reset clipPoint " + clipPoint + "0 ");
+            clipPoint = 0;
+        }
+        LogUtil.println(TAG, filePath, clipPoint, clipDuration);
+        String outFilePath = getCutVideoFilePath(filePath, clipPoint, clipDuration);
+        video.setFilePath(outFilePath);
+        //开始剪切
+        EpVideo epVideo = new EpVideo(filePath);
+//输出选项,参数为输出文件路径(目前仅支持mp4格式输出)
+        EpEditor.OutputOption outputOption = new EpEditor.OutputOption(outFilePath);
+        outputOption.frameRate = 10;//输出视频帧率,默认30
+        outputOption.bitRate = 1;//输出视频码率,默认10
+        epVideo.clip(clipPoint / 1000_000f, clipDuration / 1000_000f);//此处单位为秒
+        EpEditor.exec(epVideo, outputOption, new OnEditorListener() {
+            @Override
+            public void onSuccess() {
+                action1.call(video);
+            }
+
+            @Override
+            public void onFailure() {
+                action1.call(new Throwable("剪切失败"));
+            }
+
+            @Override
+            public void onProgress(float progress) {
+
+            }
+        });
+    }
     /**
      * 剪切视频
      *

+ 21 - 0
media/app/src/main/java/com/kfzs/cfyl/media/util/ViewUtil.java

@@ -1,5 +1,6 @@
 package com.kfzs.cfyl.media.util;
 
+import android.graphics.drawable.GradientDrawable;
 import android.support.annotation.StringRes;
 import android.support.v7.widget.RecyclerView;
 import android.text.TextUtils;
@@ -109,4 +110,24 @@ public class ViewUtil {
         if (recyclerView != null && recyclerView.getAdapter() != null)
             recyclerView.getAdapter().notifyDataSetChanged();
     }
+
+    public static void setShapeStrokeColor(ImageView imageView, int width, int color) {
+        if(imageView != null){
+            if(imageView.getDrawable() instanceof GradientDrawable){
+                GradientDrawable gradientDrawable = ((GradientDrawable) imageView.getDrawable());
+                gradientDrawable.setStroke(width, color);
+                imageView.setImageDrawable(gradientDrawable);
+            }
+        }
+    }
+
+    public static void setShapeSolidColor(ImageView imageView, int color) {
+        if(imageView != null){
+            if(imageView.getDrawable() instanceof GradientDrawable){
+                GradientDrawable gradientDrawable = ((GradientDrawable) imageView.getDrawable());
+                gradientDrawable.setColor(color);
+                imageView.setImageDrawable(gradientDrawable);
+            }
+        }
+    }
 }

+ 7 - 0
media/app/src/main/res/drawable/media_shape_oval_14e213.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <corners android:radius="20dp" />
+
+    <solid android:color="#14e213" />
+</shape>

+ 7 - 0
media/app/src/main/res/drawable/media_shape_oval_1b9bff.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <corners android:radius="20dp" />
+
+    <solid android:color="#1b9bff" />
+</shape>

+ 7 - 0
media/app/src/main/res/drawable/media_shape_oval_8c05ff.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <corners android:radius="20dp" />
+
+    <solid android:color="#8c05ff" />
+</shape>

+ 7 - 0
media/app/src/main/res/drawable/media_shape_oval_black.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <corners android:radius="20dp" />
+
+    <solid android:color="#000000" />
+</shape>

+ 7 - 0
media/app/src/main/res/drawable/media_shape_oval_fbf606.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <corners android:radius="20dp" />
+
+    <solid android:color="#fbf606" />
+</shape>

+ 7 - 0
media/app/src/main/res/drawable/media_shape_oval_red_ff1d11.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <corners android:radius="20dp" />
+
+    <solid android:color="#ff1d11" />
+</shape>

+ 9 - 0
media/app/src/main/res/drawable/media_shape_ring_tra.xml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="oval">
+    <corners android:radius="20dp" />
+
+    <stroke
+        android:width="2dp"
+        android:color="#00000000" />
+</shape>

+ 9 - 0
media/app/src/main/res/drawable/media_shape_ring_white.xml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="oval">
+    <corners android:radius="20dp" />
+
+    <stroke
+        android:width="2dp"
+        android:color="@color/media_white" />
+</shape>

+ 7 - 5
media/app/src/main/res/layout/main_activity.xml

@@ -1,17 +1,19 @@
 <?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     xmlns:tools="http://schemas.android.com/tools"
-    android:orientation="vertical"
     tools:context=".activity.MainActivity">
 
+    <ImageView
+        android:id="@+id/media_act_main_iv"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent" />
     <TextView
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:layout_marginTop="100dp"
-        android:layout_gravity="center"
+        android:layout_centerInParent="true"
         android:gravity="center"
         android:onClick="onClickHelloWorld"
         android:text="HelloWorld" />
-</LinearLayout>
+</RelativeLayout>

+ 1 - 75
media/app/src/main/res/layout/media_act_cut_video.xml

@@ -18,85 +18,11 @@
             android:layout_height="match_parent" />
     </FrameLayout>
 
-    <View
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:background="#99000000" />
-
-    <ImageView
-        android:id="@+id/media_video_back_iv"
-        android:layout_width="?attr/actionBarSize"
-        android:layout_height="?attr/actionBarSize"
-        android:layout_marginTop="20dp"
-        android:onClick="onClickBackImg"
-        android:scaleType="centerInside"
-        android:src="@drawable/media_narrow_back_white"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toTopOf="parent" />
-
-    <TextView
-        android:id="@+id/media_edit_video_topic_tv"
-        android:layout_width="0dp"
-        android:layout_height="30dp"
-        android:background="@drawable/media_shape_white_20_solid_rectangle_15"
-        android:gravity="center|start"
-        android:maxLength="100"
-        android:onClick="onClickTopic"
-        android:paddingStart="18dp"
-        android:paddingEnd="18dp"
-        android:text="#添加话题#"
-        android:textColor="#FEFFFF"
-        android:textSize="13sp"
-        app:layout_constraintBottom_toBottomOf="@id/media_video_back_iv"
-        app:layout_constraintEnd_toStartOf="@id/media_edit_video_sure_tv"
-        app:layout_constraintStart_toEndOf="@id/media_video_back_iv"
-        app:layout_constraintTop_toTopOf="@id/media_video_back_iv" />
-
-    <TextView
-        android:id="@+id/media_edit_video_sure_tv"
-        android:layout_width="75dp"
-        android:layout_height="wrap_content"
-        android:layout_marginStart="31dp"
-        android:layout_marginEnd="16dp"
-        android:background="@drawable/media_selector_button_full_main"
-        android:gravity="center"
-        android:onClick="onClickSure"
-        android:paddingTop="6dp"
-        android:paddingBottom="6dp"
-        android:text="下一步"
-        android:textColor="#FEFFFF"
-        android:textSize="15sp"
-        app:layout_constraintBottom_toBottomOf="@id/media_video_back_iv"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintStart_toEndOf="@id/media_edit_video_topic_tv"
-        app:layout_constraintTop_toTopOf="@id/media_video_back_iv" />
-
     <FrameLayout
         android:id="@+id/media_frame_container"
         android:layout_width="match_parent"
         android:layout_height="0dp"
-        android:layout_marginTop="27dp"
         app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintTop_toBottomOf="@id/media_edit_video_topic_tv" />
-
-    <com.kfzs.cfyl.media.customview.VideoFramesView
-        android:id="@+id/media_videoFramesView"
-        android:layout_width="match_parent"
-        android:layout_height="69dp"
-        android:layout_marginStart="36dp"
-        android:layout_marginEnd="36dp"
-        android:layout_marginBottom="17dp"
-        app:layout_constraintBottom_toBottomOf="parent" />
+        app:layout_constraintTop_toTopOf="parent" />
 
-    <TextView
-        android:id="@+id/media_edit_video_time_tv"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_marginStart="15dp"
-        android:layout_marginBottom="100dp"
-        android:text="@string/media_has_choose_x_second"
-        android:textColor="#ffffffff"
-        android:textSize="12sp"
-        app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintStart_toStartOf="parent" />
 </android.support.constraint.ConstraintLayout>

+ 4 - 1
media/app/src/main/res/layout/media_act_edit_video.xml

@@ -54,7 +54,10 @@
 
         </LinearLayout>
     </HorizontalScrollView>
-
+    <ImageView
+        android:id="@+id/act_edit_video_doodle_iv"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent" />
     <FrameLayout
         android:id="@+id/media_frame_container"
         android:layout_width="match_parent"

+ 0 - 6
media/app/src/main/res/layout/media_common_rv.xml

@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/recyclerView"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:descendantFocusability="blocksDescendants" />

+ 14 - 0
media/app/src/main/res/layout/media_fgt_color_list.xml

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <android.support.v7.widget.RecyclerView
+        android:id="@+id/media_recyclerView"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:paddingStart="20dp"
+        android:paddingEnd="20dp"
+        android:layout_centerInParent="true"
+        android:descendantFocusability="blocksDescendants" />
+</RelativeLayout>

+ 53 - 0
media/app/src/main/res/layout/media_fgt_cut_video.xml

@@ -0,0 +1,53 @@
+<?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"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <ImageView
+        android:id="@+id/media_video_back_iv"
+        android:layout_width="?attr/actionBarSize"
+        android:layout_height="?attr/actionBarSize"
+        android:layout_marginTop="20dp"
+        android:scaleType="centerInside"
+        android:src="@drawable/media_narrow_back_white"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+    <TextView
+        android:id="@+id/media_edit_video_sure_tv"
+        android:layout_width="75dp"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="31dp"
+        android:layout_marginEnd="16dp"
+        android:background="@drawable/media_selector_button_full_main"
+        android:gravity="center"
+        android:paddingTop="6dp"
+        android:paddingBottom="6dp"
+        android:text="下一步"
+        android:textColor="#FEFFFF"
+        android:textSize="15sp"
+        app:layout_constraintBottom_toBottomOf="@id/media_video_back_iv"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintTop_toTopOf="@id/media_video_back_iv" />
+    <com.kfzs.cfyl.media.customview.VideoFramesView
+        android:id="@+id/media_videoFramesView"
+        android:layout_width="match_parent"
+        android:layout_height="69dp"
+        android:layout_marginStart="36dp"
+        android:layout_marginEnd="36dp"
+        android:layout_marginBottom="17dp"
+        app:layout_constraintBottom_toBottomOf="parent" />
+
+    <TextView
+        android:id="@+id/media_edit_video_time_tv"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="15dp"
+        android:layout_marginBottom="100dp"
+        android:text="@string/media_has_choose_x_second"
+        android:textColor="#ffffffff"
+        android:textSize="12sp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintStart_toStartOf="parent" />
+
+</android.support.constraint.ConstraintLayout>

+ 88 - 0
media/app/src/main/res/layout/media_fgt_doodle.xml

@@ -0,0 +1,88 @@
+<?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"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <FrameLayout
+        android:id="@+id/media_fgt_doodle_container"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent" />
+
+    <ImageView
+        android:id="@+id/media_video_back_iv"
+        android:layout_width="?attr/actionBarSize"
+        android:layout_height="?attr/actionBarSize"
+        android:layout_marginTop="20dp"
+        android:scaleType="centerInside"
+        android:src="@drawable/media_narrow_back_white"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+    <TextView
+        android:id="@+id/media_video_undo_tv"
+        android:layout_width="wrap_content"
+        android:layout_height="?attr/actionBarSize"
+        android:layout_marginTop="20dp"
+        android:text="撤销"
+        android:textColor="@color/media_white"
+        android:textSize="15sp"
+        android:gravity="center"
+        android:paddingStart="10dp"
+        android:paddingEnd="10dp"
+        app:layout_constraintStart_toEndOf="@id/media_video_back_iv"
+        app:layout_constraintTop_toTopOf="parent"/>
+    <TextView
+        android:id="@+id/media_video_redo_tv"
+        android:layout_width="wrap_content"
+        android:layout_height="?attr/actionBarSize"
+        android:layout_marginTop="20dp"
+        android:text="重做"
+        android:textColor="@color/media_white"
+        android:textSize="15sp"
+        android:gravity="center"
+        android:paddingStart="10dp"
+        android:paddingEnd="10dp"
+        app:layout_constraintStart_toEndOf="@id/media_video_undo_tv"
+        app:layout_constraintTop_toTopOf="parent"/>
+    <TextView
+        android:id="@+id/media_video_reset_tv"
+        android:layout_width="wrap_content"
+        android:layout_height="?attr/actionBarSize"
+        android:layout_marginTop="20dp"
+        android:text="重置"
+        android:textColor="@color/media_white"
+        android:textSize="15sp"
+        android:gravity="center"
+        android:paddingStart="10dp"
+        android:paddingEnd="10dp"
+        app:layout_constraintStart_toEndOf="@id/media_video_redo_tv"
+        app:layout_constraintTop_toTopOf="parent"/>
+
+    <ImageView
+        android:id="@+id/media_edit_video_sure_iv"
+        android:layout_width="30dp"
+        android:layout_height="30dp"
+        android:layout_marginTop="27dp"
+        android:layout_marginEnd="16dp"
+        android:background="@drawable/media_shape_oval_main"
+        android:onClick="onClickCommit"
+        android:padding="5dp"
+        android:src="@drawable/media_qiandao"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <ImageView
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="10dp"
+        android:layout_marginTop="10dp"
+        android:src="@drawable/media_sheep_logo_3"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/media_video_back_iv" />
+
+    <android.support.v4.view.ViewPager
+        android:id="@+id/media_viewPager"
+        android:layout_width="match_parent"
+        android:layout_height="100dp"
+        app:layout_constraintBottom_toBottomOf="parent" />
+</android.support.constraint.ConstraintLayout>

+ 59 - 0
media/app/src/main/res/layout/media_fgt_dt.xml

@@ -0,0 +1,59 @@
+<?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"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="#99000000">
+
+    <TextView
+        android:id="@+id/media_edit_video_topic_tv"
+        android:layout_width="0dp"
+        android:layout_height="30dp"
+        android:background="@drawable/media_shape_white_20_solid_rectangle_15"
+        android:gravity="center|start"
+        android:maxLength="100"
+        android:paddingStart="18dp"
+        android:paddingEnd="18dp"
+        android:text="#添加话题#"
+        android:textColor="#FEFFFF"
+        android:textSize="13sp"
+        app:layout_constraintBottom_toBottomOf="@id/media_video_back_iv"
+        app:layout_constraintEnd_toStartOf="@id/media_edit_video_sure_tv"
+        app:layout_constraintStart_toEndOf="@id/media_video_back_iv"
+        app:layout_constraintTop_toTopOf="@id/media_video_back_iv" />
+
+    <ImageView
+        android:id="@+id/media_video_back_iv"
+        android:layout_width="?attr/actionBarSize"
+        android:layout_height="?attr/actionBarSize"
+        android:layout_marginTop="20dp"
+        android:scaleType="centerInside"
+        android:src="@drawable/media_narrow_back_white"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+    <TextView
+        android:id="@+id/media_edit_video_sure_tv"
+        android:layout_width="75dp"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="31dp"
+        android:layout_marginEnd="16dp"
+        android:background="@drawable/media_selector_button_full_main"
+        android:gravity="center"
+        android:paddingTop="6dp"
+        android:paddingBottom="6dp"
+        android:text="下一步"
+        android:textColor="#FEFFFF"
+        android:textSize="15sp"
+        app:layout_constraintBottom_toBottomOf="@id/media_video_back_iv"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toEndOf="@id/media_edit_video_topic_tv"
+        app:layout_constraintTop_toTopOf="@id/media_video_back_iv" />
+
+    <android.support.v7.widget.RecyclerView
+        android:id="@+id/media_recyclerView"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="80dp"
+        android:descendantFocusability="blocksDescendants"
+        app:layout_constraintTop_toTopOf="parent" />
+</android.support.constraint.ConstraintLayout>

+ 41 - 0
media/app/src/main/res/layout/media_fgt_edit_video_type_list.xml

@@ -0,0 +1,41 @@
+<?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"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="#99000000">
+
+    <ImageView
+        android:id="@+id/media_video_back_iv"
+        android:layout_width="?attr/actionBarSize"
+        android:layout_height="?attr/actionBarSize"
+        android:layout_marginTop="20dp"
+        android:scaleType="centerInside"
+        android:src="@drawable/media_narrow_back_white"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+    <TextView
+        android:id="@+id/media_edit_video_sure_tv"
+        android:layout_width="75dp"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="31dp"
+        android:layout_marginEnd="16dp"
+        android:background="@drawable/media_selector_button_full_main"
+        android:gravity="center"
+        android:paddingTop="6dp"
+        android:paddingBottom="6dp"
+        android:text="下一步"
+        android:textColor="#FEFFFF"
+        android:textSize="15sp"
+        app:layout_constraintBottom_toBottomOf="@id/media_video_back_iv"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintTop_toTopOf="@id/media_video_back_iv" />
+
+    <android.support.v7.widget.RecyclerView
+        android:id="@+id/media_recyclerView"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:descendantFocusability="blocksDescendants"
+        android:background="#000000"
+        app:layout_constraintBottom_toBottomOf="parent" />
+</android.support.constraint.ConstraintLayout>

+ 19 - 0
media/app/src/main/res/layout/media_item_color.xml

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <View
+        android:id="@+id/media_item_color_out_iv"
+        android:layout_width="20dp"
+        android:layout_height="20dp"
+        android:layout_centerInParent="true"
+        android:background="@drawable/media_shape_ring_white" />
+
+    <View
+        android:id="@+id/media_item_color_in_iv"
+        android:layout_width="16dp"
+        android:layout_height="16dp"
+        android:layout_centerInParent="true"
+        android:background="@drawable/media_shape_oval_red" />
+</RelativeLayout>

+ 25 - 0
media/app/src/main/res/layout/media_item_iv_tv.xml

@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:gravity="center"
+    android:orientation="vertical"
+    android:paddingTop="16dp"
+    android:paddingBottom="16dp">
+
+
+    <ImageView
+        android:id="@+id/media_item_iv"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content" />
+
+    <TextView
+        android:id="@+id/media_item_tv"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="5dp"
+        android:gravity="center"
+        android:text="@string/app_name"
+        android:textColor="#B3B3B3"
+        android:textSize="13sp" />
+</LinearLayout>

BIN
media/app/src/main/res/mipmap-xxhdpi/media_ic_cover.png


BIN
media/app/src/main/res/mipmap-xxhdpi/media_ic_doodle.png


BIN
media/app/src/main/res/mipmap-xxhdpi/media_ic_music.png


BIN
media/app/src/main/res/mipmap-xxhdpi/media_ic_sticker.png


BIN
media/app/src/main/res/mipmap-xxhdpi/media_ic_text.png


+ 3 - 1
media/settings.gradle

@@ -1 +1,3 @@
-include ':app', ':share_library'//, ':view', ':ucrop', ':WaterWaveProgress'//, ':media/app'//, ':RxGalleryFinal', ':Aria', ':datashare', ':AriaAnnotations'
+include ':app', ':share_library', ':joevideolib'//, ':view', ':ucrop', ':WaterWaveProgress'//, ':media/app'//, ':RxGalleryFinal', ':Aria', ':datashare', ':AriaAnnotations'
+
+project(':joevideolib').projectDir = new File('../joevideolib')

+ 1 - 0
media/share_library/build.gradle

@@ -25,4 +25,5 @@ android {
 dependencies {
     //fast json
     compileOnly 'com.alibaba:fastjson:1.2.52'
+    api project(':joevideolib')
 }