Commit 8fdbf84becbadc6439242f1edd3758435c4bfa79

Authored by 王琳
1 parent dd835253

添加短视频编辑页面,添加视频列表接口及短视频播放页面

Showing 65 changed files with 1800 additions and 270 deletions
app/libs/libcnliveshortvideo.jar
No preview for this file type
app/src/main/AndroidManifest.xml
@@ -113,9 +113,22 @@ @@ -113,9 +113,22 @@
113 android:name="io.rong.imlib.HeartbeatReceiver" 113 android:name="io.rong.imlib.HeartbeatReceiver"
114 android:process=":ipc" /> 114 android:process=":ipc" />
115 115
116 - <activity android:name=".shortvideo.activity.MyVideoActivity" />  
117 - <activity android:name=".shortvideo.activity.ShortVideoActivity" />  
118 - <activity android:name=".shortvideo.activity.EditActivity" /> 116 + <activity
  117 + android:name=".shortvideo.activity.MyVideoActivity"
  118 + android:configChanges="orientation|keyboardHidden|screenSize"
  119 + android:screenOrientation="portrait"
  120 + android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
  121 + <activity
  122 + android:name=".shortvideo.activity.ShortVideoActivity"
  123 + android:configChanges="orientation|keyboardHidden|screenSize"
  124 + android:screenOrientation="portrait"
  125 + android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
  126 + <activity
  127 + android:name=".shortvideo.activity.EditActivity"
  128 + android:configChanges="orientation|keyboardHidden|screenSize"
  129 + android:screenOrientation="portrait"
  130 + android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
  131 + <activity android:name=".shortvideo.activity.ShortVideoPlayActivity"></activity>
119 </application> 132 </application>
120 133
121 </manifest> 134 </manifest>
122 \ No newline at end of file 135 \ No newline at end of file
app/src/main/java/com/cnlive/gundam/data/network/ApiService.java
@@ -3,6 +3,7 @@ package com.cnlive.gundam.data.network; @@ -3,6 +3,7 @@ package com.cnlive.gundam.data.network;
3 import com.cnlive.gundam.main.model.ActiveListModel; 3 import com.cnlive.gundam.main.model.ActiveListModel;
4 import com.cnlive.gundam.main.model.ActivePlayInfo; 4 import com.cnlive.gundam.main.model.ActivePlayInfo;
5 import com.cnlive.gundam.main.model.VodListPage; 5 import com.cnlive.gundam.main.model.VodListPage;
  6 +import com.cnlive.gundam.shortvideo.model.ShortVideoDataModel;
6 import com.cnlive.gundam.stream.model.ChannelInfoModel; 7 import com.cnlive.gundam.stream.model.ChannelInfoModel;
7 8
8 import java.util.Map; 9 import java.util.Map;
@@ -33,4 +34,8 @@ public interface ApiService { @@ -33,4 +34,8 @@ public interface ApiService {
33 //主播信息接口 34 //主播信息接口
34 @GET("live_epg/channel/info4App") 35 @GET("live_epg/channel/info4App")
35 Call<ChannelInfoModel> getChannelInfo(@QueryMap Map<String, String> params); 36 Call<ChannelInfoModel> getChannelInfo(@QueryMap Map<String, String> params);
  37 +
  38 + //获取SP下的短视频列表
  39 + @GET("vod_epg/sp/shortVideoList4APP")
  40 + Call<ShortVideoDataModel> getShortVideoList(@QueryMap Map<String, String> params);
36 } 41 }
app/src/main/java/com/cnlive/gundam/shortvideo/activity/EditActivity.java
@@ -11,15 +11,11 @@ import android.graphics.Bitmap; @@ -11,15 +11,11 @@ import android.graphics.Bitmap;
11 import android.graphics.BitmapFactory; 11 import android.graphics.BitmapFactory;
12 import android.graphics.Color; 12 import android.graphics.Color;
13 import android.graphics.Paint; 13 import android.graphics.Paint;
14 -import android.opengl.GLSurfaceView;  
15 import android.os.Bundle; 14 import android.os.Bundle;
16 import android.os.Handler; 15 import android.os.Handler;
17 import android.support.v4.app.ActivityCompat; 16 import android.support.v4.app.ActivityCompat;
18 import android.support.v7.app.AppCompatActivity; 17 import android.support.v7.app.AppCompatActivity;
19 -import android.support.v7.widget.AppCompatSeekBar;  
20 -import android.support.v7.widget.AppCompatSpinner;  
21 import android.support.v7.widget.LinearLayoutManager; 18 import android.support.v7.widget.LinearLayoutManager;
22 -import android.support.v7.widget.RecyclerView;  
23 import android.text.Editable; 19 import android.text.Editable;
24 import android.text.TextPaint; 20 import android.text.TextPaint;
25 import android.text.TextUtils; 21 import android.text.TextUtils;
@@ -38,7 +34,7 @@ import android.view.WindowManager; @@ -38,7 +34,7 @@ import android.view.WindowManager;
38 import android.view.inputmethod.InputMethodManager; 34 import android.view.inputmethod.InputMethodManager;
39 import android.widget.AdapterView; 35 import android.widget.AdapterView;
40 import android.widget.ArrayAdapter; 36 import android.widget.ArrayAdapter;
41 -import android.widget.CheckBox; 37 +import android.widget.Button;
42 import android.widget.CompoundButton; 38 import android.widget.CompoundButton;
43 import android.widget.EditText; 39 import android.widget.EditText;
44 import android.widget.ImageView; 40 import android.widget.ImageView;
@@ -51,7 +47,6 @@ import android.widget.Toast; @@ -51,7 +47,6 @@ import android.widget.Toast;
51 47
52 import com.cnlive.gundam.R; 48 import com.cnlive.gundam.R;
53 import com.cnlive.gundam.databinding.ActivityEditBinding; 49 import com.cnlive.gundam.databinding.ActivityEditBinding;
54 -import com.cnlive.gundam.shortvideo.dialog.ShortVideoConfigDialog;  
55 import com.cnlive.gundam.shortvideo.sticker.StickerAdapter; 50 import com.cnlive.gundam.shortvideo.sticker.StickerAdapter;
56 import com.cnlive.gundam.shortvideo.util.ColorPicker; 51 import com.cnlive.gundam.shortvideo.util.ColorPicker;
57 import com.cnlive.gundam.shortvideo.videorange.HorizontalListView; 52 import com.cnlive.gundam.shortvideo.videorange.HorizontalListView;
@@ -62,7 +57,6 @@ import com.cnlive.lib.upload.listener.CNPutObjectResponseListener; @@ -62,7 +57,6 @@ import com.cnlive.lib.upload.listener.CNPutObjectResponseListener;
62 import com.cnlive.lib.upload.model.UploadError; 57 import com.cnlive.lib.upload.model.UploadError;
63 import com.cnlive.libs.shortvideo.kit.CNEditKit; 58 import com.cnlive.libs.shortvideo.kit.CNEditKit;
64 import com.cnlive.libs.shortvideo.utils.base.ShortVideoConstants; 59 import com.cnlive.libs.shortvideo.utils.base.ShortVideoConstants;
65 -import com.cnlive.libs.shortvideo.view.CNStickerView;  
66 import com.cnlive.libs.shortvideo.view.CNTextView; 60 import com.cnlive.libs.shortvideo.view.CNTextView;
67 import com.cnlive.libs.shortvideo.view.base.ICNTextView; 61 import com.cnlive.libs.shortvideo.view.base.ICNTextView;
68 import com.cnlive.libs.shortvideo.view.info.CNStickerHelpBoxInfo; 62 import com.cnlive.libs.shortvideo.view.info.CNStickerHelpBoxInfo;
@@ -75,12 +69,14 @@ import com.cnlive.libs.util.Config; @@ -75,12 +69,14 @@ import com.cnlive.libs.util.Config;
75 import com.cnlive.libs.video.video.MediaPlayer; 69 import com.cnlive.libs.video.video.MediaPlayer;
76 import com.cnlive.libs.video.video.base.IDataSource; 70 import com.cnlive.libs.video.video.base.IDataSource;
77 import com.cnlive.libs.video.video.base.IMediaPlayer; 71 import com.cnlive.libs.video.video.base.IMediaPlayer;
  72 +import com.googlecode.mp4parser.authoring.Edit;
78 73
79 import org.apache.http.Header; 74 import org.apache.http.Header;
80 75
81 import java.io.File; 76 import java.io.File;
82 import java.io.IOException; 77 import java.io.IOException;
83 import java.io.InputStream; 78 import java.io.InputStream;
  79 +import java.util.ArrayList;
84 import java.util.HashMap; 80 import java.util.HashMap;
85 import java.util.LinkedList; 81 import java.util.LinkedList;
86 import java.util.List; 82 import java.util.List;
@@ -127,6 +123,14 @@ public class EditActivity extends AppCompatActivity implements ActivityCompat.On @@ -127,6 +123,14 @@ public class EditActivity extends AppCompatActivity implements ActivityCompat.On
127 private SeekBarChangedObserver mSeekBarChangedObserver; 123 private SeekBarChangedObserver mSeekBarChangedObserver;
128 124
129 public final static String SRC_URL = "srcurl"; 125 public final static String SRC_URL = "srcurl";
  126 + public final static String DURATION = "duration";
  127 + public final static String FRAME_RATE = "framerate";
  128 + public final static String VIDEO_BITRATE = "video_bitrate";
  129 + public final static String AUDIO_BITRATE = "audio_bitrate";
  130 + public final static String VIDEO_RESOLUTION = "video_resolution";
  131 + public final static String ENCODE_TYPE = "encode_type";
  132 + public final static String ENCODE_METHOD = "encode_method";
  133 + public final static String ENCODE_PROFILE = "encode_profile";
130 134
131 private String mLogoPath = "assets://Logo/cnlive_logo.png"; 135 private String mLogoPath = "assets://Logo/cnlive_logo.png";
132 private String mBgmPath = "/sdcard/uncle.mp3"; 136 private String mBgmPath = "/sdcard/uncle.mp3";
@@ -153,13 +157,32 @@ public class EditActivity extends AppCompatActivity implements ActivityCompat.On @@ -153,13 +157,32 @@ public class EditActivity extends AppCompatActivity implements ActivityCompat.On
153 157
154 // private ImageView screenShot; 158 // private ImageView screenShot;
155 159
  160 + private int duration;
  161 + private int frameRate;
  162 + private int videoBitrate;
  163 + private int audioBitrate;
  164 + private int videoResolution;
  165 + private int encode_type;
  166 + private int encode_method;
  167 + private int encodeProfile;
156 private ActivityEditBinding binding; 168 private ActivityEditBinding binding;
157 169
158 - public static void startActivity(Context context, String srcUrl) { 170 + public static void startActivity(Context context, String srcUrl, int duration, int frameRate,
  171 + int videoBitrate, int audioBitrate,
  172 + int videoResolution,
  173 + int encodeType, int encodeMethod, int encodeProfile) {
159 Intent intent = new Intent(context, EditActivity.class); 174 Intent intent = new Intent(context, EditActivity.class);
160 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 175 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
161 176
162 intent.putExtra(SRC_URL, srcUrl); 177 intent.putExtra(SRC_URL, srcUrl);
  178 + intent.putExtra(DURATION, duration);
  179 + intent.putExtra(FRAME_RATE, frameRate);
  180 + intent.putExtra(VIDEO_BITRATE, videoBitrate);
  181 + intent.putExtra(AUDIO_BITRATE, audioBitrate);
  182 + intent.putExtra(VIDEO_RESOLUTION, videoResolution);
  183 + intent.putExtra(ENCODE_TYPE, encodeType);
  184 + intent.putExtra(ENCODE_METHOD, encodeMethod);
  185 + intent.putExtra(ENCODE_PROFILE, encodeProfile);
163 context.startActivity(intent); 186 context.startActivity(intent);
164 } 187 }
165 188
@@ -174,8 +197,8 @@ public class EditActivity extends AppCompatActivity implements ActivityCompat.On @@ -174,8 +197,8 @@ public class EditActivity extends AppCompatActivity implements ActivityCompat.On
174 getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 197 getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
175 198
176 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 199 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
177 - initView();  
178 initEditKit(); 200 initEditKit();
  201 + initView();
179 mInputMethodManager = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE); 202 mInputMethodManager = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
180 } 203 }
181 204
@@ -236,6 +259,7 @@ public class EditActivity extends AppCompatActivity implements ActivityCompat.On @@ -236,6 +259,7 @@ public class EditActivity extends AppCompatActivity implements ActivityCompat.On
236 259
237 binding.clickToPause.getDrawable().setLevel(2); 260 binding.clickToPause.getDrawable().setLevel(2);
238 261
  262 + binding.hint.setText("上传视频最大长度为 " + duration + "s");
239 binding.editBarBottom.clickToFilter.setActivated(true); 263 binding.editBarBottom.clickToFilter.setActivated(true);
240 binding.editBarBottom.beautyChoose.getRoot().setVisibility(View.VISIBLE); 264 binding.editBarBottom.beautyChoose.getRoot().setVisibility(View.VISIBLE);
241 BottomViewInfo filterView = new BottomViewInfo(binding.editBarBottom.clickToFilter, binding.editBarBottom.beautyChoose.getRoot()); 265 BottomViewInfo filterView = new BottomViewInfo(binding.editBarBottom.clickToFilter, binding.editBarBottom.beautyChoose.getRoot());
@@ -321,6 +345,14 @@ public class EditActivity extends AppCompatActivity implements ActivityCompat.On @@ -321,6 +345,14 @@ public class EditActivity extends AppCompatActivity implements ActivityCompat.On
321 private void initData() { 345 private void initData() {
322 Bundle bundle = getIntent().getExtras(); 346 Bundle bundle = getIntent().getExtras();
323 String url = bundle.getString(SRC_URL); 347 String url = bundle.getString(SRC_URL);
  348 + duration = bundle.getInt(DURATION, 0);
  349 + frameRate = bundle.getInt(FRAME_RATE, 0);
  350 + videoBitrate = bundle.getInt(VIDEO_BITRATE, 0);
  351 + audioBitrate = bundle.getInt(AUDIO_BITRATE, 0);
  352 + videoResolution = bundle.getInt(VIDEO_RESOLUTION, 0);
  353 + encode_type = bundle.getInt(ENCODE_TYPE);
  354 + encode_method = bundle.getInt(ENCODE_METHOD);
  355 + encodeProfile = bundle.getInt(ENCODE_PROFILE);
324 if (!TextUtils.isEmpty(url)) { 356 if (!TextUtils.isEmpty(url)) {
325 mEditKit.setEditPreviewUrl(url); 357 mEditKit.setEditPreviewUrl(url);
326 } 358 }
@@ -547,43 +579,28 @@ public class EditActivity extends AppCompatActivity implements ActivityCompat.On @@ -547,43 +579,28 @@ public class EditActivity extends AppCompatActivity implements ActivityCompat.On
547 579
548 private void onNextClick() { 580 private void onNextClick() {
549 //配置合成参数 581 //配置合成参数
550 - final ShortVideoConfigDialog configDialog = new ShortVideoConfigDialog(this,  
551 - ShortVideoConfigDialog  
552 - .SHORTVIDEOCONFIG_TYPE_COMPOSE);  
553 - configDialog.setCancelable(false);  
554 - configDialog.show();  
555 - configDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {  
556 - @Override  
557 - public void onDismiss(DialogInterface dialogInterface) {  
558 - ShortVideoConfigDialog.ShortVideoConfig config = configDialog.getShortVideoConfig();  
559 - if (config != null) {  
560 - //配置合成参数  
561 - mEditKit.setTargetResolution(config.resolution);  
562 - mEditKit.setVideoFps(config.fps);  
563 - mEditKit.setVideoCodecId(config.encodeType);  
564 - mEditKit.setVideoEncodeProfile(config.encodeProfile);  
565 - mEditKit.setAudioKBitrate(config.audioBitrate);  
566 - mEditKit.setVideoKBitrate(config.videoBitrate);  
567 - //关闭上一次合成窗口  
568 - if (mComposeAlertDialog != null) {  
569 - mComposeAlertDialog.closeDialog();  
570 - } 582 + mEditKit.setTargetResolution(videoResolution);
  583 + mEditKit.setVideoFps(frameRate);
  584 + mEditKit.setVideoCodecId(encode_type);
  585 + mEditKit.setVideoEncodeProfile(encodeProfile);
  586 + mEditKit.setAudioKBitrate(audioBitrate);
  587 + mEditKit.setVideoKBitrate(videoBitrate);
  588 + //关闭上一次合成窗口
  589 + if (mComposeAlertDialog != null) {
  590 + mComposeAlertDialog.closeDialog();
  591 + }
571 592
572 - mComposeAlertDialog = new ComposeAlertDialog(EditActivity.this, R.style.dialog);  
573 - //设置合成路径 593 + mComposeAlertDialog = new ComposeAlertDialog(EditActivity.this, R.style.dialog);
  594 + //设置合成路径
574 595
575 - String fileFolder = "/sdcard/cn_sv_compose_test";  
576 - File file = new File(fileFolder);  
577 - if (!file.exists()) {  
578 - file.mkdir();  
579 - }  
580 - String composeUrl = fileFolder + "/" + System.currentTimeMillis() + ".mp4";  
581 - Log.d(TAG, "compose Url:" + composeUrl);  
582 - mEditKit.startCompose("test.mp4", "", composeUrl);  
583 - }  
584 -  
585 - }  
586 - }); 596 + String fileFolder = "/sdcard/cn_sv_compose_test";
  597 + File file = new File(fileFolder);
  598 + if (!file.exists()) {
  599 + file.mkdir();
  600 + }
  601 + String composeUrl = fileFolder + "/" + System.currentTimeMillis() + ".mp4";
  602 + Log.d(TAG, "compose Url:" + composeUrl);
  603 + mEditKit.startCompose(composeUrl);
587 604
588 } 605 }
589 606
@@ -803,7 +820,6 @@ public class EditActivity extends AppCompatActivity implements ActivityCompat.On @@ -803,7 +820,6 @@ public class EditActivity extends AppCompatActivity implements ActivityCompat.On
803 } 820 }
804 }; 821 };
805 822
806 -  
807 private CNEditKit.OnInfoListener mOnInfoListener = new CNEditKit.OnInfoListener() { 823 private CNEditKit.OnInfoListener mOnInfoListener = new CNEditKit.OnInfoListener() {
808 @Override 824 @Override
809 public Object onInfo(int type, Bitmap bitmap, final String... strings) { 825 public Object onInfo(int type, Bitmap bitmap, final String... strings) {
@@ -828,11 +844,12 @@ public class EditActivity extends AppCompatActivity implements ActivityCompat.On @@ -828,11 +844,12 @@ public class EditActivity extends AppCompatActivity implements ActivityCompat.On
828 Log.e(TAG, bitmap + " : " + strings[0]); 844 Log.e(TAG, bitmap + " : " + strings[0]);
829 binding.editBarBottom.audioChoose.originAudioReverb.setSelection(0); 845 binding.editBarBottom.audioChoose.originAudioReverb.setSelection(0);
830 binding.editBarBottom.audioChoose.originAudioEffect.setSelection(0); 846 binding.editBarBottom.audioChoose.originAudioEffect.setSelection(0);
831 - if (mComposeAlertDialog != null) {  
832 - mComposeAlertDialog.composeFinished(strings[0]);  
833 - mComposeFinished = true;  
834 - }  
835 - mEditKit.getUploadInfo(3, strings[0], mPutObjectResponseListener); 847 +// if (mComposeAlertDialog != null) {
  848 +// mComposeAlertDialog.composeFinished(strings[0]);
  849 +// mComposeFinished = true;
  850 +// }
  851 +// mEditKit.getUploadInfo(strings[0], "test.mp4", "", mPutObjectResponseListener);
  852 + showVideoDialog(bitmap, strings[0]);
836 } 853 }
837 case ShortVideoConstants.SHORTVIDEO_COMPOSE_ABORTED: 854 case ShortVideoConstants.SHORTVIDEO_COMPOSE_ABORTED:
838 break; 855 break;
@@ -850,6 +867,56 @@ public class EditActivity extends AppCompatActivity implements ActivityCompat.On @@ -850,6 +867,56 @@ public class EditActivity extends AppCompatActivity implements ActivityCompat.On
850 } 867 }
851 }; 868 };
852 869
  870 + private AlertDialog uploadVideoMessageDialog;
  871 +
  872 + public void showVideoDialog(Bitmap bitmap, final String fileUrl) {
  873 + LayoutInflater layoutInflater = LayoutInflater.from(this);
  874 + View videoMesDialog = layoutInflater.inflate(R.layout.upload_video_dialog, null);
  875 +
  876 + ImageView imageView = videoMesDialog.findViewById(R.id.cover_img);
  877 + imageView.setImageBitmap(bitmap);
  878 + final EditText title = videoMesDialog.findViewById(R.id.video_title_edit);
  879 + final EditText des = videoMesDialog.findViewById(R.id.video_des_edit);
  880 + Button cancelBtn = videoMesDialog.findViewById(R.id.cancel_btn);
  881 + Button configBtn = videoMesDialog.findViewById(R.id.config_btn);
  882 +
  883 +
  884 + uploadVideoMessageDialog = new AlertDialog.Builder(EditActivity.this)
  885 + .setView(videoMesDialog)
  886 + .setCancelable(false)
  887 + .show();
  888 +
  889 + cancelBtn.setOnClickListener(new View.OnClickListener() {
  890 + @Override
  891 + public void onClick(View view) {
  892 + mComposeAlertDialog.closeDialog();
  893 + resumeEditPreview();
  894 + uploadVideoMessageDialog.dismiss();
  895 + }
  896 + });
  897 +
  898 + configBtn.setOnClickListener(new View.OnClickListener() {
  899 + @Override
  900 + public void onClick(View view) {
  901 + String titleStr = title.getText().toString();
  902 + String desStr = des.getText().toString();
  903 +
  904 + if (titleStr != null && !titleStr.equals("")) {
  905 + if (mComposeAlertDialog != null) {
  906 + mComposeAlertDialog.composeFinished(fileUrl);
  907 + mComposeFinished = true;
  908 + }
  909 + mEditKit.getUploadInfo(fileUrl, titleStr.concat(".mp4"), desStr, mPutObjectResponseListener);
  910 + uploadVideoMessageDialog.dismiss();
  911 + } else {
  912 + Toast.makeText(EditActivity.this, "标题不能为空哦~", Toast.LENGTH_SHORT).show();
  913 + }
  914 + }
  915 + });
  916 +
  917 +
  918 + }
  919 +
853 920
854 private StickerAdapter.OnStickerItemClick mOnStickerItemClick = new StickerAdapter.OnStickerItemClick() { 921 private StickerAdapter.OnStickerItemClick mOnStickerItemClick = new StickerAdapter.OnStickerItemClick() {
855 @Override 922 @Override
@@ -982,7 +1049,7 @@ public class EditActivity extends AppCompatActivity implements ActivityCompat.On @@ -982,7 +1049,7 @@ public class EditActivity extends AppCompatActivity implements ActivityCompat.On
982 public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 1049 public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
983 TextView textView = ((TextView) parent.getChildAt(0)); 1050 TextView textView = ((TextView) parent.getChildAt(0));
984 if (textView != null) { 1051 if (textView != null) {
985 - textView.setTextColor(getResources().getColor(R.color.colorAccent)); 1052 + textView.setTextColor(getResources().getColor(R.color.ffcc00));
986 } 1053 }
987 switch (position) { 1054 switch (position) {
988 case 0: 1055 case 0:
app/src/main/java/com/cnlive/gundam/shortvideo/activity/ShortVideoActivity.java
@@ -9,20 +9,27 @@ import android.content.Intent; @@ -9,20 +9,27 @@ import android.content.Intent;
9 import android.content.pm.PackageManager; 9 import android.content.pm.PackageManager;
10 import android.databinding.DataBindingUtil; 10 import android.databinding.DataBindingUtil;
11 import android.hardware.Camera; 11 import android.hardware.Camera;
  12 +import android.media.MediaMetadataRetriever;
12 import android.net.Uri; 13 import android.net.Uri;
13 import android.os.Build; 14 import android.os.Build;
14 import android.os.Environment; 15 import android.os.Environment;
15 import android.os.Handler; 16 import android.os.Handler;
  17 +import android.os.SystemClock;
  18 +import android.support.annotation.NonNull;
  19 +import android.support.annotation.Nullable;
16 import android.support.v4.app.ActivityCompat; 20 import android.support.v4.app.ActivityCompat;
17 import android.support.v7.app.AppCompatActivity; 21 import android.support.v7.app.AppCompatActivity;
18 import android.os.Bundle; 22 import android.os.Bundle;
19 import android.util.Log; 23 import android.util.Log;
20 import android.util.SparseArray; 24 import android.util.SparseArray;
  25 +import android.view.DragEvent;
21 import android.view.KeyEvent; 26 import android.view.KeyEvent;
22 import android.view.View; 27 import android.view.View;
  28 +import android.view.ViewGroup;
23 import android.view.WindowManager; 29 import android.view.WindowManager;
24 import android.widget.AdapterView; 30 import android.widget.AdapterView;
25 import android.widget.ArrayAdapter; 31 import android.widget.ArrayAdapter;
  32 +import android.widget.Chronometer;
26 import android.widget.ImageView; 33 import android.widget.ImageView;
27 import android.widget.RelativeLayout; 34 import android.widget.RelativeLayout;
28 import android.widget.SeekBar; 35 import android.widget.SeekBar;
@@ -31,6 +38,7 @@ import android.widget.Toast; @@ -31,6 +38,7 @@ import android.widget.Toast;
31 38
32 import com.cnlive.gundam.R; 39 import com.cnlive.gundam.R;
33 import com.cnlive.gundam.databinding.ActivityShortVideoBinding; 40 import com.cnlive.gundam.databinding.ActivityShortVideoBinding;
  41 +import com.cnlive.gundam.databinding.SpinnerItemLayoutBinding;
34 import com.cnlive.gundam.shortvideo.holder.BgmItemViewHolder; 42 import com.cnlive.gundam.shortvideo.holder.BgmItemViewHolder;
35 import com.cnlive.gundam.shortvideo.model.BottomTitleViewInfo; 43 import com.cnlive.gundam.shortvideo.model.BottomTitleViewInfo;
36 import com.cnlive.gundam.shortvideo.util.FaceUnityUtil; 44 import com.cnlive.gundam.shortvideo.util.FaceUnityUtil;
@@ -49,9 +57,11 @@ import com.cnlive.libs.stream.filter.CNAudioReverbFilter; @@ -49,9 +57,11 @@ import com.cnlive.libs.stream.filter.CNAudioReverbFilter;
49 import com.cnlive.libs.stream.util.ImgFaceunityFilter; 57 import com.cnlive.libs.stream.util.ImgFaceunityFilter;
50 58
51 import java.io.File; 59 import java.io.File;
  60 +import java.util.ArrayList;
52 import java.util.LinkedList; 61 import java.util.LinkedList;
53 import java.util.List; 62 import java.util.List;
54 63
  64 +import static android.view.View.inflate;
55 import static com.cnlive.libs.stream.model.Filters.BEAUTY_DISABLE; 65 import static com.cnlive.libs.stream.model.Filters.BEAUTY_DISABLE;
56 import static com.cnlive.libs.stream.model.Filters.BEAUTY_ILLUSION; 66 import static com.cnlive.libs.stream.model.Filters.BEAUTY_ILLUSION;
57 import static com.cnlive.libs.stream.model.Filters.BEAUTY_PRO; 67 import static com.cnlive.libs.stream.model.Filters.BEAUTY_PRO;
@@ -65,7 +75,6 @@ import static com.cnlive.libs.stream.model.Filters.SKIN_WHITEN; @@ -65,7 +75,6 @@ import static com.cnlive.libs.stream.model.Filters.SKIN_WHITEN;
65 public class ShortVideoActivity extends AppCompatActivity { 75 public class ShortVideoActivity extends AppCompatActivity {
66 private static final String TAG = "ShortVideoActivity"; 76 private static final String TAG = "ShortVideoActivity";
67 private final static int PERMISSION_REQUEST_CAMERA_AUDIOREC = 1; 77 private final static int PERMISSION_REQUEST_CAMERA_AUDIOREC = 1;
68 - public static final int MAX_DURATION = 1 * 60 * 1000;  
69 public static final int MIN_DURATION = 3 * 1000; 78 public static final int MIN_DURATION = 3 * 1000;
70 private static final int REQUEST_CODE_MUSIC = 10010; 79 private static final int REQUEST_CODE_MUSIC = 10010;
71 private static final int REQUEST_CODE_FILE = 6384; 80 private static final int REQUEST_CODE_FILE = 6384;
@@ -124,15 +133,74 @@ public class ShortVideoActivity extends AppCompatActivity { @@ -124,15 +133,74 @@ public class ShortVideoActivity extends AppCompatActivity {
124 private SeekBarChangedObserver mSeekBarChangedObserver; 133 private SeekBarChangedObserver mSeekBarChangedObserver;
125 134
126 private Handler mMainHandler; 135 private Handler mMainHandler;
  136 + private Bundle bundle;
  137 + private static int duration;
  138 +
  139 + public final static String FRAME_RATE = "framerate";
  140 + public final static String VIDEO_BITRATE = "video_bitrate";
  141 + public final static String AUDIO_BITRATE = "audio_bitrate";
  142 + public final static String VIDEO_RESOLUTION = "video_resolution";
  143 + public final static String ENCODE_TYPE = "encode_type";
  144 + public final static String ENCODE_METHOD = "encode_method";
  145 + public final static String ENCODE_PROFILE = "encode_profile";
  146 + public final static String DURATION = "duration";
  147 +
  148 + private int frameRate;
  149 + private int videoBitrate;
  150 + private int audioBitrate;
  151 + private int videoResolution;
  152 + private int encode_type;
  153 + private int encode_method;
  154 + private int encodeProfile;
  155 +
  156 + private List<String> recordUrlList;
  157 + private long recordingTime = 0;//记录下来的总时间
  158 +
  159 + public static void startActivity(Context context, int frameRate,
  160 + int videoBitrate, int audioBitrate,
  161 + int videoResolution,
  162 + int encodeType, int encodeMethod, int encodeProfile, int duration) {
  163 + Intent intent = new Intent(context, ShortVideoActivity.class);
  164 + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  165 +
  166 + intent.putExtra(FRAME_RATE, frameRate);
  167 + intent.putExtra(VIDEO_BITRATE, videoBitrate);
  168 + intent.putExtra(AUDIO_BITRATE, audioBitrate);
  169 + intent.putExtra(VIDEO_RESOLUTION, videoResolution);
  170 + intent.putExtra(ENCODE_TYPE, encodeType);
  171 + intent.putExtra(ENCODE_METHOD, encodeMethod);
  172 + intent.putExtra(ENCODE_PROFILE, encodeProfile);
  173 + intent.putExtra(DURATION, duration);
  174 + context.startActivity(intent);
  175 + }
127 176
128 @Override 177 @Override
129 protected void onCreate(Bundle savedInstanceState) { 178 protected void onCreate(Bundle savedInstanceState) {
130 super.onCreate(savedInstanceState); 179 super.onCreate(savedInstanceState);
131 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 180 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
132 getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 181 getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
  182 + initData();
133 binding = DataBindingUtil.setContentView(this, R.layout.activity_short_video); 183 binding = DataBindingUtil.setContentView(this, R.layout.activity_short_video);
  184 + recordUrlList = new ArrayList<>();
134 initView(); 185 initView();
135 initRecordKit(); 186 initRecordKit();
  187 + Toast.makeText(this, "视频上传时长需要在3s - " + duration + "s之间", Toast.LENGTH_LONG).show();
  188 + }
  189 +
  190 + public static int getMaxDuration() {
  191 + return duration * 1000;
  192 + }
  193 +
  194 + private void initData() {
  195 + bundle = getIntent().getExtras();
  196 + duration = bundle.getInt(DURATION, 0);
  197 + frameRate = bundle.getInt(FRAME_RATE, 0);
  198 + videoBitrate = bundle.getInt(VIDEO_BITRATE, 0);
  199 + audioBitrate = bundle.getInt(AUDIO_BITRATE, 0);
  200 + videoResolution = bundle.getInt(VIDEO_RESOLUTION, 0);
  201 + encode_type = bundle.getInt(ENCODE_TYPE);
  202 + encode_method = bundle.getInt(ENCODE_METHOD);
  203 + encodeProfile = bundle.getInt(ENCODE_PROFILE);
136 } 204 }
137 205
138 @Override 206 @Override
@@ -164,6 +232,7 @@ public class ShortVideoActivity extends AppCompatActivity { @@ -164,6 +232,7 @@ public class ShortVideoActivity extends AppCompatActivity {
164 mRecordProgressCtl.release(); 232 mRecordProgressCtl.release();
165 mRecordKit.setOnLogEventListener((IStreamer.OnLogEventListener) null); 233 mRecordKit.setOnLogEventListener((IStreamer.OnLogEventListener) null);
166 mRecordKit.release(); 234 mRecordKit.release();
  235 + recordUrlList.clear();
167 } 236 }
168 237
169 private void initView() { 238 private void initView() {
@@ -236,26 +305,37 @@ public class ShortVideoActivity extends AppCompatActivity { @@ -236,26 +305,37 @@ public class ShortVideoActivity extends AppCompatActivity {
236 } 305 }
237 } 306 }
238 307
  308 +
239 private void initRecordKit() { 309 private void initRecordKit() {
240 mMainHandler = new Handler(); 310 mMainHandler = new Handler();
241 mRecordKit = new CNRecordKit(this); 311 mRecordKit = new CNRecordKit(this);
242 - //设置预览编码帧率  
243 - mRecordKit.setPreviewFps(20);  
244 - //设置录制编码帧率  
245 - mRecordKit.setTargetFps(20);  
246 - //设置视频码率  
247 - mRecordKit.setVideoKBitrate(1000);  
248 - //设置音频编码码率  
249 - mRecordKit.setAudioKBitrate(64);  
250 - //设置预览分辨率  
251 - mRecordKit.setPreviewResolution(IStreamer.VIDEO_RESOLUTION_540P);  
252 - //设置录制分辨率  
253 - mRecordKit.setTargetResolution(IStreamer.VIDEO_RESOLUTION_540P);  
254 - //设置编码模式  
255 - mRecordKit.setVideoEncodeMethod(IStreamer.ENCODE_METHOD_SOFTWARE);  
256 - mRecordKit.setVideoEncodeProfile(IStreamer.ENCODE_PROFILE_BALANCE);  
257 - //设置竖屏  
258 - mRecordKit.setRotateDegrees(0); 312 + if (bundle != null) {
  313 +
  314 + if (frameRate > 0) {
  315 + mRecordKit.setPreviewFps(frameRate);
  316 + mRecordKit.setTargetFps(frameRate);
  317 + }
  318 +
  319 +
  320 + if (videoBitrate > 0) {
  321 + mRecordKit.setVideoKBitrate(videoBitrate);
  322 + }
  323 +
  324 + if (audioBitrate > 0) {
  325 + mRecordKit.setAudioKBitrate(audioBitrate);
  326 + }
  327 +
  328 + mRecordKit.setPreviewResolution(videoResolution);
  329 + mRecordKit.setTargetResolution(videoResolution);
  330 +
  331 + mRecordKit.setVideoCodecId(encode_type);
  332 +
  333 + mRecordKit.setEncodeMethod(encode_method);
  334 +
  335 + mRecordKit.setVideoEncodeProfile(encodeProfile);
  336 +
  337 + mRecordKit.setRotateDegrees(0);
  338 + }
259 //设置预览view 339 //设置预览view
260 mRecordKit.setDisplayPreview(binding.shortVideoPreview); 340 mRecordKit.setDisplayPreview(binding.shortVideoPreview);
261 mRecordKit.setFilter(DENOISE.getFilter()); 341 mRecordKit.setFilter(DENOISE.getFilter());
@@ -268,6 +348,7 @@ public class ShortVideoActivity extends AppCompatActivity { @@ -268,6 +348,7 @@ public class ShortVideoActivity extends AppCompatActivity {
268 mRecordKit.setOnLogEventListener(mLogEventListener); 348 mRecordKit.setOnLogEventListener(mLogEventListener);
269 initBeautyUI(); 349 initBeautyUI();
270 initStickerUI(); 350 initStickerUI();
  351 + initFaceunity();
271 initBgmUI(); 352 initBgmUI();
272 initBottomTitleUI(); 353 initBottomTitleUI();
273 354
@@ -288,9 +369,8 @@ public class ShortVideoActivity extends AppCompatActivity { @@ -288,9 +369,8 @@ public class ShortVideoActivity extends AppCompatActivity {
288 break; 369 break;
289 case IStreamer.cnstream_open_file_success: 370 case IStreamer.cnstream_open_file_success:
290 Log.i(TAG, "cnstream_open_file_success"); 371 Log.i(TAG, "cnstream_open_file_success");
291 - // TODO: 2017/7/10  
292 -// mChronometer.setBase(SystemClock.elapsedRealtime());  
293 -// mChronometer.start(); 372 + binding.chronometer.setBase(SystemClock.elapsedRealtime() - recordingTime);
  373 + binding.chronometer.start();
294 mRecordProgressCtl.startRecording(); 374 mRecordProgressCtl.startRecording();
295 break; 375 break;
296 default: 376 default:
@@ -520,7 +600,6 @@ public class ShortVideoActivity extends AppCompatActivity { @@ -520,7 +600,6 @@ public class ShortVideoActivity extends AppCompatActivity {
520 onNextClick(); 600 onNextClick();
521 601
522 } else if (binding.shortVideoRecordBottomLayout.shortVideoRecordRightImg.getDrawable().getLevel() == 1) { 602 } else if (binding.shortVideoRecordBottomLayout.shortVideoRecordRightImg.getDrawable().getLevel() == 1) {
523 - // TODO: 2017/7/11 选择文件  
524 importVideoFile(); 603 importVideoFile();
525 } 604 }
526 break; 605 break;
@@ -897,12 +976,18 @@ public class ShortVideoActivity extends AppCompatActivity { @@ -897,12 +976,18 @@ public class ShortVideoActivity extends AppCompatActivity {
897 stopRecord(false); 976 stopRecord(false);
898 } 977 }
899 //删除录制文件 978 //删除录制文件
  979 + long duration = Long.parseLong(FileUtils.getDuration(mRecordKit.getLastRecordedFiles()));
  980 + recordingTime = recordingTime - duration;
900 binding.shortVideoRecordBottomLayout.shortVideoRecordLeftImg.getDrawable().setLevel(3); 981 binding.shortVideoRecordBottomLayout.shortVideoRecordLeftImg.getDrawable().setLevel(3);
  982 + recordUrlList.remove(mRecordKit.getLastRecordedFiles());
901 mRecordKit.deleteRecordFile(mRecordKit.getLastRecordedFiles()); 983 mRecordKit.deleteRecordFile(mRecordKit.getLastRecordedFiles());
902 mRecordProgressCtl.rollback(); 984 mRecordProgressCtl.rollback();
903 binding.shortVideoRecordBottomLayout.shortVideoRecordLeftImg.setEnabled(true); 985 binding.shortVideoRecordBottomLayout.shortVideoRecordLeftImg.setEnabled(true);
  986 +
904 } 987 }
905 } else { 988 } else {
  989 + binding.chronometer.stop();
  990 + // TODO: 2017/7/12 记录时间
906 isFileRecording = false; 991 isFileRecording = false;
907 binding.shortVideoRecordBottomLayout.shortVideoRecordLeftImg.getDrawable().setLevel(1); 992 binding.shortVideoRecordBottomLayout.shortVideoRecordLeftImg.getDrawable().setLevel(1);
908 binding.shortVideoRecordBottomLayout.shortVideoRecordLeftTextView.setVisibility(View.VISIBLE); 993 binding.shortVideoRecordBottomLayout.shortVideoRecordLeftTextView.setVisibility(View.VISIBLE);
@@ -916,6 +1001,7 @@ public class ShortVideoActivity extends AppCompatActivity { @@ -916,6 +1001,7 @@ public class ShortVideoActivity extends AppCompatActivity {
916 * start recording to a local file 1001 * start recording to a local file
917 */ 1002 */
918 private void startRecord() { 1003 private void startRecord() {
  1004 + binding.chronometer.setVisibility(View.VISIBLE);
919 binding.shortVideoRecordBottomLayout.shortVideoRecord.getDrawable().setLevel(2); 1005 binding.shortVideoRecordBottomLayout.shortVideoRecord.getDrawable().setLevel(2);
920 binding.shortVideoRecordBottomLayout.shortVideoRecordLeftTextView.setVisibility(View.GONE); 1006 binding.shortVideoRecordBottomLayout.shortVideoRecordLeftTextView.setVisibility(View.GONE);
921 binding.shortVideoRecordBottomLayout.shortVideoRecordLeftImg.getDrawable().setLevel(2); 1007 binding.shortVideoRecordBottomLayout.shortVideoRecordLeftImg.getDrawable().setLevel(2);
@@ -927,6 +1013,7 @@ public class ShortVideoActivity extends AppCompatActivity { @@ -927,6 +1013,7 @@ public class ShortVideoActivity extends AppCompatActivity {
927 file.mkdir(); 1013 file.mkdir();
928 } 1014 }
929 mRecordUrl = fileFolder + "/" + System.currentTimeMillis() + ".mp4"; 1015 mRecordUrl = fileFolder + "/" + System.currentTimeMillis() + ".mp4";
  1016 + recordUrlList.add(mRecordUrl);
930 float val = binding.shortVideoBgmLayout.bgmSelectLayout.recordMicAudioVolume.getProgress() / 100.f; 1017 float val = binding.shortVideoBgmLayout.bgmSelectLayout.recordMicAudioVolume.getProgress() / 100.f;
931 mRecordKit.setVoiceVolume(val); 1018 mRecordKit.setVoiceVolume(val);
932 mRecordKit.startRecord(mRecordUrl); 1019 mRecordKit.startRecord(mRecordUrl);
@@ -941,6 +1028,7 @@ public class ShortVideoActivity extends AppCompatActivity { @@ -941,6 +1028,7 @@ public class ShortVideoActivity extends AppCompatActivity {
941 private void stopRecord(boolean finished) { 1028 private void stopRecord(boolean finished) {
942 //录制完成进入编辑页面 1029 //录制完成进入编辑页面
943 //若录制文件大于1则需要出发文件合成 1030 //若录制文件大于1则需要出发文件合成
  1031 + binding.chronometer.setVisibility(View.GONE);
944 binding.shortVideoRecordBottomLayout.shortVideoRecordLeftImg.getDrawable().setLevel(3); 1032 binding.shortVideoRecordBottomLayout.shortVideoRecordLeftImg.getDrawable().setLevel(3);
945 binding.shortVideoRecordBottomLayout.shortVideoRecord.getDrawable().setLevel(1); 1033 binding.shortVideoRecordBottomLayout.shortVideoRecord.getDrawable().setLevel(1);
946 if (finished) { 1034 if (finished) {
@@ -960,7 +1048,7 @@ public class ShortVideoActivity extends AppCompatActivity { @@ -960,7 +1048,7 @@ public class ShortVideoActivity extends AppCompatActivity {
960 dialog.dismiss(); 1048 dialog.dismiss();
961 mRecordUrl = filePath; 1049 mRecordUrl = filePath;
962 //合成结束启动编辑 1050 //合成结束启动编辑
963 - EditActivity.startActivity(getApplicationContext(), mRecordUrl); 1051 + EditActivity.startActivity(getApplicationContext(), mRecordUrl, duration, frameRate, videoBitrate, audioBitrate, videoResolution, encode_type, encode_method, encodeProfile);
964 } 1052 }
965 }); 1053 });
966 } 1054 }
@@ -972,6 +1060,7 @@ public class ShortVideoActivity extends AppCompatActivity { @@ -972,6 +1060,7 @@ public class ShortVideoActivity extends AppCompatActivity {
972 mRecordProgressCtl.stopRecording(); 1060 mRecordProgressCtl.stopRecording();
973 binding.shortVideoRecordBottomLayout.shortVideoRecord.getDrawable().setLevel(1); 1061 binding.shortVideoRecordBottomLayout.shortVideoRecord.getDrawable().setLevel(1);
974 isFileRecording = false; 1062 isFileRecording = false;
  1063 + stopChronometer(finished);
975 } 1064 }
976 1065
977 1066
@@ -1007,7 +1096,9 @@ public class ShortVideoActivity extends AppCompatActivity { @@ -1007,7 +1096,9 @@ public class ShortVideoActivity extends AppCompatActivity {
1007 .setPositiveButton("是", new DialogInterface.OnClickListener() { 1096 .setPositiveButton("是", new DialogInterface.OnClickListener() {
1008 @Override 1097 @Override
1009 public void onClick(DialogInterface dialogInterface, int i) { 1098 public void onClick(DialogInterface dialogInterface, int i) {
1010 - mRecordKit.deleteRecordFile(mRecordUrl); 1099 + for (int i1 = 0; i1 < recordUrlList.size(); i1++) {
  1100 + mRecordKit.deleteRecordFile(recordUrlList.get(i1));
  1101 + }
1011 ShortVideoActivity.this.finish(); 1102 ShortVideoActivity.this.finish();
1012 } 1103 }
1013 }) 1104 })
@@ -1069,26 +1160,38 @@ public class ShortVideoActivity extends AppCompatActivity { @@ -1069,26 +1160,38 @@ public class ShortVideoActivity extends AppCompatActivity {
1069 final Uri uri = data.getData(); 1160 final Uri uri = data.getData();
1070 Log.i(TAG, "File Uri = " + uri.toString()); 1161 Log.i(TAG, "File Uri = " + uri.toString());
1071 final String path = FileUtils.getPath(this, uri); 1162 final String path = FileUtils.getPath(this, uri);
1072 - EditActivity.startActivity(this, path); 1163 + EditActivity.startActivity(this, path, duration, frameRate, videoBitrate, audioBitrate, videoResolution, encode_type, encode_method, encodeProfile);
1073 } 1164 }
1074 } 1165 }
1075 } 1166 }
1076 super.onActivityResult(requestCode, resultCode, data); 1167 super.onActivityResult(requestCode, resultCode, data);
1077 } 1168 }
1078 1169
  1170 +
1079 private void initBeautyUI() { 1171 private void initBeautyUI() {
1080 - String[] items = new String[]{"DISABLE", "BEAUTY_SOFT", "SKIN_WHITEN", "BEAUTY_ILLUSION", 1172 + final String[] items = new String[]{"DISABLE", "BEAUTY_SOFT", "SKIN_WHITEN", "BEAUTY_ILLUSION",
1081 "BEAUTY_DENOISE", "BEAUTY_SMOOTH", "BEAUTY_SOFT_EXT", "BEAUTY_SOFT_SHARPEN", "BEAUTY_PRO"}; 1173 "BEAUTY_DENOISE", "BEAUTY_SMOOTH", "BEAUTY_SOFT_EXT", "BEAUTY_SOFT_SHARPEN", "BEAUTY_PRO"};
1082 - ArrayAdapter<String> adapter = new ArrayAdapter<>(this,  
1083 - android.R.layout.simple_spinner_item, items);  
1084 - adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 1174 + ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
  1175 + R.layout.spinner_checked_layout, items) {
  1176 + @Override
  1177 + public View getDropDownView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
  1178 + View view = inflate(getContext(), R.layout.spinner_item_layout, null);
  1179 + TextView textView = view.findViewById(R.id.spinner_item_label);
  1180 + textView.setText(items[position]);
  1181 + if (binding.shortVideoBeautyLayout.recordBeautyChoose.beautySpin.getSelectedItemPosition() == position) {
  1182 + textView.setTextColor(getResources().getColor(R.color.ffcc00));
  1183 + }
  1184 + return view;
  1185 + }
  1186 + };
  1187 + adapter.setDropDownViewResource(R.layout.spinner_item_layout);
1085 binding.shortVideoBeautyLayout.recordBeautyChoose.beautySpin.setAdapter(adapter); 1188 binding.shortVideoBeautyLayout.recordBeautyChoose.beautySpin.setAdapter(adapter);
1086 binding.shortVideoBeautyLayout.recordBeautyChoose.beautySpin.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 1189 binding.shortVideoBeautyLayout.recordBeautyChoose.beautySpin.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
1087 @Override 1190 @Override
1088 public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 1191 public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
1089 TextView textView = ((TextView) parent.getChildAt(0)); 1192 TextView textView = ((TextView) parent.getChildAt(0));
1090 if (textView != null) { 1193 if (textView != null) {
1091 - textView.setTextColor(getResources().getColor(R.color.colorAccent)); 1194 + textView.setTextColor(getResources().getColor(R.color.ffcc00));
1092 } 1195 }
1093 switch (position) { 1196 switch (position) {
1094 case 0: 1197 case 0:
@@ -1184,25 +1287,36 @@ public class ShortVideoActivity extends AppCompatActivity { @@ -1184,25 +1287,36 @@ public class ShortVideoActivity extends AppCompatActivity {
1184 } 1287 }
1185 1288
1186 private void initStickerUI() { 1289 private void initStickerUI() {
1187 - String[] items = new String[]{"DISABLE", "BEAGLEDOG", "COLORCROWN", "DEER", 1290 + final String[] items = new String[]{"DISABLE", "BEAGLEDOG", "COLORCROWN", "DEER",
1188 "HAPPYRABBI", "HARTSHORN", "ITEM0204", "ITEM0208", 1291 "HAPPYRABBI", "HARTSHORN", "ITEM0204", "ITEM0208",
1189 "ITEM0210", "ITEM0501", "MOOD", "PRINCESSCROWN", "TIARA", "YELLOWEAR"}; 1292 "ITEM0210", "ITEM0501", "MOOD", "PRINCESSCROWN", "TIARA", "YELLOWEAR"};
1190 - ArrayAdapter<String> adapter = new ArrayAdapter<>(this,  
1191 - android.R.layout.simple_spinner_item, items);  
1192 - adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 1293 + ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.spinner_checked_layout, items) {
  1294 + @Override
  1295 + public View getDropDownView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
  1296 + View view = inflate(getContext(), R.layout.spinner_item_layout, null);
  1297 + TextView textView = view.findViewById(R.id.spinner_item_label);
  1298 + textView.setText(items[position]);
  1299 + if (binding.shortVideoBeautyLayout.recordStickerChoose.stickerSpin.getSelectedItemPosition() == position) {
  1300 + textView.setTextColor(getResources().getColor(R.color.ffcc00));
  1301 + }
  1302 + return view;
  1303 + }
  1304 + };
  1305 + adapter.setDropDownViewResource(R.layout.spinner_item_layout);
1193 binding.shortVideoBeautyLayout.recordStickerChoose.stickerSpin.setAdapter(adapter); 1306 binding.shortVideoBeautyLayout.recordStickerChoose.stickerSpin.setAdapter(adapter);
1194 binding.shortVideoBeautyLayout.recordStickerChoose.stickerSpin.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 1307 binding.shortVideoBeautyLayout.recordStickerChoose.stickerSpin.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
1195 @Override 1308 @Override
1196 public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 1309 public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
1197 TextView textView = ((TextView) parent.getChildAt(0)); 1310 TextView textView = ((TextView) parent.getChildAt(0));
1198 if (textView != null) { 1311 if (textView != null) {
1199 - textView.setTextColor(getResources().getColor(R.color.colorAccent)); 1312 + textView.setTextColor(getResources().getColor(R.color.ffcc00));
1200 } 1313 }
1201 if (position == 0) { 1314 if (position == 0) {
1202 //disable 1315 //disable
1203 if (mImgFaceunityFilter != null) { 1316 if (mImgFaceunityFilter != null) {
1204 mImgFaceunityFilter.setPropType(-1); 1317 mImgFaceunityFilter.setPropType(-1);
1205 } 1318 }
  1319 +
1206 } else { 1320 } else {
1207 mImgFaceunityFilter.setPropType(position - 1); 1321 mImgFaceunityFilter.setPropType(position - 1);
1208 } 1322 }
@@ -1217,6 +1331,17 @@ public class ShortVideoActivity extends AppCompatActivity { @@ -1217,6 +1331,17 @@ public class ShortVideoActivity extends AppCompatActivity {
1217 binding.shortVideoBeautyLayout.recordStickerChoose.stickerSpin.setSelection(0); 1331 binding.shortVideoBeautyLayout.recordStickerChoose.stickerSpin.setSelection(0);
1218 } 1332 }
1219 1333
  1334 + private void stopChronometer(boolean finished) {
  1335 + if (isFileRecording) {
  1336 + return;
  1337 + }
  1338 + if (finished) {
  1339 + binding.chronometer.setBase(SystemClock.elapsedRealtime());
  1340 + }
  1341 + binding.chronometer.stop();
  1342 + recordingTime = SystemClock.elapsedRealtime() - binding.chronometer.getBase();
  1343 + }
  1344 +
1220 private class MegerFilesAlertDialog extends AlertDialog { 1345 private class MegerFilesAlertDialog extends AlertDialog {
1221 1346
1222 protected MegerFilesAlertDialog(Context context, int themID) { 1347 protected MegerFilesAlertDialog(Context context, int themID) {
app/src/main/java/com/cnlive/gundam/shortvideo/activity/ShortVideoPlayActivity.java 0 → 100644
  1 +package com.cnlive.gundam.shortvideo.activity;
  2 +
  3 +import android.content.Context;
  4 +import android.content.Intent;
  5 +import android.databinding.DataBindingUtil;
  6 +import android.os.Handler;
  7 +import android.os.Message;
  8 +import android.support.v7.app.AppCompatActivity;
  9 +import android.os.Bundle;
  10 +import android.util.Log;
  11 +import android.view.KeyEvent;
  12 +import android.view.MotionEvent;
  13 +import android.view.View;
  14 +import android.widget.ImageView;
  15 +import android.widget.LinearLayout;
  16 +import android.widget.RelativeLayout;
  17 +import android.widget.SeekBar;
  18 +import android.widget.TextView;
  19 +import android.widget.Toast;
  20 +
  21 +import com.cnlive.gundam.R;
  22 +import com.cnlive.gundam.databinding.ActivityShortVideoPlayBinding;
  23 +import com.cnlive.libs.util.Config;
  24 +import com.cnlive.libs.video.video.MediaPlayer;
  25 +import com.cnlive.libs.video.video.VideoView;
  26 +import com.cnlive.libs.video.video.base.IDataSource;
  27 +import com.cnlive.libs.video.video.base.IMediaPlayer;
  28 +
  29 +import java.text.DecimalFormat;
  30 +import java.text.NumberFormat;
  31 +import java.util.Locale;
  32 +
  33 +
  34 +public class ShortVideoPlayActivity extends AppCompatActivity {
  35 + private static final String TAG = "VideoPlayerActivity";
  36 +
  37 + public static final int UPDATE_SEEKBAR = 0;
  38 + public static final int HIDDEN_SEEKBAR = 1;
  39 +
  40 + private Context mContext;
  41 + private VideoView mVideoView;
  42 + private LinearLayout mPlayerPanel;
  43 + private ImageView mPlayerStartBtn;
  44 + private SeekBar mPlayerSeekbar;
  45 + private TextView mPlayerPosition;
  46 + private TextView mLoadText;
  47 +
  48 + private LinearLayout toppanel;
  49 +
  50 + private boolean mPlayerPanelShow = false;
  51 + private boolean mPause = false;
  52 +
  53 + private int mVideoWidth = 0;
  54 + private int mVideoHeight = 0;
  55 +
  56 + private Handler mHandler;
  57 +
  58 + private final static String VIDEO_ID = "videoId";
  59 + private final static String NAME = "name";
  60 + private final static String DES = "des";
  61 + private String videoId;
  62 + private String name;
  63 + private String des;
  64 + private ActivityShortVideoPlayBinding playBinding;
  65 +
  66 + public static void startActivity(Context context, String videoId, String name, String des) {
  67 + Intent intent = new Intent(context, ShortVideoPlayActivity.class);
  68 + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  69 + intent.putExtra(VIDEO_ID, videoId);
  70 + intent.putExtra(NAME, name);
  71 + intent.putExtra(DES, des);
  72 + context.startActivity(intent);
  73 + }
  74 +
  75 + @Override
  76 + protected void onCreate(Bundle savedInstanceState) {
  77 + super.onCreate(savedInstanceState);
  78 + mContext = this.getApplicationContext();
  79 + playBinding = DataBindingUtil.setContentView(this, R.layout.activity_short_video_play);
  80 + initData();
  81 + initView();
  82 + initVideoView();
  83 +
  84 + }
  85 +
  86 + private void initData() {
  87 + Bundle bundle = getIntent().getExtras();
  88 + videoId = bundle.getString(VIDEO_ID);
  89 + name = bundle.getString(NAME);
  90 + des = bundle.getString(DES);
  91 + }
  92 +
  93 + private void initVideoView() {
  94 + mHandler = new Handler() {
  95 + @Override
  96 + public void handleMessage(Message msg) {
  97 + super.handleMessage(msg);
  98 + switch (msg.what) {
  99 + case UPDATE_SEEKBAR:
  100 + setVideoProgress(0);
  101 + break;
  102 + case HIDDEN_SEEKBAR:
  103 + mPlayerPanelShow = false;
  104 + mPlayerPanel.setVisibility(View.GONE);
  105 + toppanel.setVisibility(View.GONE);
  106 + break;
  107 + }
  108 +
  109 + }
  110 + };
  111 + mVideoView.setOnPreparedListener(mOnPreparedListener);
  112 + mVideoView.setOnCompletionListener(mOnCompletionListener);
  113 + mVideoView.setOnErrorListener(mOnErrorListener);
  114 + mVideoView.setOnInfoListener(mOnInfoListener);
  115 + mVideoView.setOnPlayStateListener(mOnPlayStateListener);
  116 + mVideoView.setOnBufferingUpdateListener(mOnBufferingUpdateListener);
  117 + mVideoView.setOnVideoSizeChangedListener(mOnVideoSizeChangeListener);
  118 + mVideoView.setOnTouchListener(mTouchListener);
  119 +
  120 + mVideoView.setDataSource(new IDataSource() {
  121 + @Override
  122 + public String getDataSourceId() {
  123 + return videoId;
  124 + }
  125 +
  126 + @Override
  127 + public String getDataSourceType() {
  128 + return Config.TYPE_VOD;
  129 + }
  130 +
  131 + @Override
  132 + public String getDataSourceRate() {
  133 + return Config.TYPE_PLAY_RATE_2;
  134 + }
  135 + });
  136 + }
  137 +
  138 + @Override
  139 + protected void onDestroy() {
  140 + super.onDestroy();
  141 + }
  142 +
  143 + @Override
  144 + protected void onPause() {
  145 + super.onPause();
  146 +
  147 + if (mVideoView != null) {
  148 + mVideoView.pause();
  149 + mPause = true;
  150 + }
  151 + }
  152 +
  153 + @Override
  154 + protected void onResume() {
  155 + super.onResume();
  156 + if (mVideoView != null) {
  157 + mVideoView.start();
  158 + mPause = false;
  159 + }
  160 + }
  161 +
  162 + @Override
  163 + public boolean onKeyDown(int keyCode, KeyEvent event) {
  164 + if (keyCode == KeyEvent.KEYCODE_BACK) {
  165 + videoPlayEnd();
  166 + }
  167 +
  168 + return super.onKeyDown(keyCode, event);
  169 + }
  170 +
  171 + private void initView() {
  172 + mVideoView = playBinding.videoView;
  173 + mPlayerPanel = playBinding.playerPanel;
  174 + mPlayerStartBtn = playBinding.playerStart;
  175 + mPlayerSeekbar = playBinding.playerSeekbar;
  176 + mPlayerPosition = playBinding.playerTime;
  177 + mLoadText = playBinding.loadingText;
  178 + toppanel = playBinding.topPlayerPanel;
  179 + playBinding.videoTitle.setText(name);
  180 + playBinding.videoDescription.setText(des);
  181 + }
  182 +
  183 + private MediaPlayer.OnPreparedListener mOnPreparedListener = new MediaPlayer.OnPreparedListener() {
  184 + @Override
  185 + public void onPrepared(IMediaPlayer mediaplayer) {
  186 + mVideoWidth = mVideoView.getVideoWidth();
  187 + mVideoHeight = mVideoView.getVideoHeight();
  188 +
  189 + // Set Video Scaling Mode
  190 + mVideoView.setVideoScalingMode(MediaPlayer.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING);
  191 +
  192 + //start player
  193 + mVideoView.start();
  194 +
  195 + //set progress
  196 + setVideoProgress(0);
  197 +
  198 + mPlayerPosition.setVisibility(View.VISIBLE);
  199 + mLoadText.setVisibility(View.VISIBLE);
  200 +
  201 + mHandler.removeMessages(HIDDEN_SEEKBAR);
  202 + Message msg = new Message();
  203 + msg.what = HIDDEN_SEEKBAR;
  204 + mHandler.sendMessageDelayed(msg, 3000);
  205 + }
  206 + };
  207 +
  208 + private IMediaPlayer.OnBufferingUpdateListener mOnBufferingUpdateListener = new IMediaPlayer.OnBufferingUpdateListener() {
  209 + @Override
  210 + public void onBufferingUpdate(IMediaPlayer mp, int percent) {
  211 + long duration = mVideoView.getDuration();
  212 + long progress = duration * percent / 100;
  213 + mPlayerSeekbar.setSecondaryProgress((int) progress);
  214 + }
  215 + };
  216 +
  217 + private IMediaPlayer.OnVideoSizeChangedListener mOnVideoSizeChangeListener = new IMediaPlayer.OnVideoSizeChangedListener() {
  218 + @Override
  219 + public void onVideoSizeChanged(IMediaPlayer mp, int width, int height, int sarNum, int sarDen) {
  220 + if (mVideoWidth > 0 && mVideoHeight > 0) {
  221 + if (width != mVideoWidth || height != mVideoHeight) {
  222 + mVideoWidth = mp.getVideoWidth();
  223 + mVideoHeight = mp.getVideoHeight();
  224 +
  225 + if (mVideoView != null)
  226 + mVideoView.setVideoScalingMode(MediaPlayer.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING);
  227 + }
  228 + }
  229 + }
  230 + };
  231 +
  232 + private IMediaPlayer.OnSeekCompleteListener mOnSeekCompletedListener = new IMediaPlayer.OnSeekCompleteListener() {
  233 + @Override
  234 + public void onSeekComplete(IMediaPlayer mp) {
  235 + Log.e(TAG, "onSeekComplete...............");
  236 + }
  237 + };
  238 +
  239 + private IMediaPlayer.OnCompletionListener mOnCompletionListener = new IMediaPlayer.OnCompletionListener() {
  240 + @Override
  241 + public void onCompletion(IMediaPlayer mp) {
  242 + Toast.makeText(mContext, "OnCompletionListener, play complete.", Toast.LENGTH_LONG).show();
  243 + videoPlayEnd();
  244 + }
  245 + };
  246 +
  247 + private IMediaPlayer.OnErrorListener mOnErrorListener = new IMediaPlayer.OnErrorListener() {
  248 + @Override
  249 + public boolean onError(IMediaPlayer mp, int what, int extra) {
  250 + switch (what) {
  251 + case MediaPlayer.MEDIA_ERROR_UNKNOWN:
  252 + Log.e(TAG, "OnErrorListener, Error Unknown:" + what + ",extra:" + extra);
  253 + break;
  254 + default:
  255 + Log.e(TAG, "OnErrorListener, Error:" + what + ",extra:" + extra);
  256 + }
  257 +
  258 + videoPlayEnd();
  259 +
  260 + return false;
  261 + }
  262 + };
  263 +
  264 + public IMediaPlayer.OnInfoListener mOnInfoListener = new IMediaPlayer.OnInfoListener() {
  265 + @Override
  266 + public boolean onInfo(IMediaPlayer iMediaPlayer, int i, int i1) {
  267 + switch (i) {
  268 + case MediaPlayer.MEDIA_INFO_BUFFERING_START:
  269 + Log.d(TAG, "Buffering Start.");
  270 + break;
  271 + case MediaPlayer.MEDIA_INFO_BUFFERING_END:
  272 + Log.d(TAG, "Buffering End.");
  273 + break;
  274 + case MediaPlayer.MEDIA_INFO_AUDIO_RENDERING_START:
  275 + Toast.makeText(mContext, "Audio Rendering Start", Toast.LENGTH_SHORT).show();
  276 + break;
  277 + case MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START:
  278 + Toast.makeText(mContext, "Video Rendering Start", Toast.LENGTH_SHORT).show();
  279 + break;
  280 +// case MediaPlayer.MEDIA_INFO_SUGGEST_RELOAD:
  281 +// // Player find a new stream(video or audio), and we could reload the video.
  282 +// if (mVideoView != null)
  283 +// mVideoView.reload(mDataSource, false);
  284 +// break;
  285 + case MediaPlayer.MEDIA_INFO_RELOADED:
  286 + Toast.makeText(mContext, "Succeed to reload video.", Toast.LENGTH_SHORT).show();
  287 + Log.d(TAG, "Succeed to reload video.");
  288 + return false;
  289 + }
  290 + return false;
  291 + }
  292 + };
  293 +
  294 + private View.OnTouchListener mTouchListener = new View.OnTouchListener() {
  295 + @Override
  296 + public boolean onTouch(View v, MotionEvent event) {
  297 + dealTouchEvent(v, event);
  298 + return false;
  299 + }
  300 + };
  301 +
  302 + public IMediaPlayer.OnPlayStateListener mOnPlayStateListener = new IMediaPlayer.OnPlayStateListener() {
  303 + @Override
  304 + public void onPlayState(boolean played) {
  305 + mPlayerStartBtn.setBackgroundResource(played ? R.drawable.pause : R.drawable.play);
  306 + }
  307 + };
  308 +
  309 + private int mVideoProgress = 0;
  310 + private SeekBar.OnSeekBarChangeListener mSeekBarListener = new SeekBar.OnSeekBarChangeListener() {
  311 + @Override
  312 + public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
  313 + if (fromUser) {
  314 + mVideoProgress = progress;
  315 + mHandler.removeMessages(HIDDEN_SEEKBAR);
  316 + Message msg = new Message();
  317 + msg.what = HIDDEN_SEEKBAR;
  318 + mHandler.sendMessageDelayed(msg, 3000);
  319 + }
  320 + }
  321 +
  322 + @Override
  323 + public void onStartTrackingTouch(SeekBar seekBar) {
  324 +
  325 + }
  326 +
  327 + @Override
  328 + public void onStopTrackingTouch(SeekBar seekBar) {
  329 + mVideoView.seekTo(mVideoProgress);
  330 + setVideoProgress(mVideoProgress);
  331 + }
  332 + };
  333 +
  334 +
  335 + public int setVideoProgress(int currentProgress) {
  336 +
  337 + if (mVideoView == null)
  338 + return -1;
  339 +
  340 + long time = currentProgress > 0 ? currentProgress : mVideoView.getCurrentPosition();
  341 + long length = mVideoView.getDuration();
  342 +
  343 + // Update all view elements
  344 + mPlayerSeekbar.setMax((int) length);
  345 + mPlayerSeekbar.setProgress((int) time);
  346 +
  347 + if (time >= 0) {
  348 + String progress = millisToString(time, false) + "/" + millisToString(length, false);
  349 + mPlayerPosition.setText(progress);
  350 + }
  351 +
  352 + Message msg = new Message();
  353 + msg.what = UPDATE_SEEKBAR;
  354 +
  355 + if (mHandler != null)
  356 + mHandler.sendMessageDelayed(msg, 1000);
  357 + return (int) time;
  358 + }
  359 +
  360 + String millisToString(long millis, boolean text) {
  361 + boolean negative = millis < 0;
  362 + millis = Math.abs(millis);
  363 +
  364 + millis /= 1000;
  365 + int sec = (int) (millis % 60);
  366 + millis /= 60;
  367 + int min = (int) (millis % 60);
  368 + millis /= 60;
  369 + int hours = (int) millis;
  370 +
  371 + String time;
  372 + DecimalFormat format = (DecimalFormat) NumberFormat.getInstance(Locale.US);
  373 + format.applyPattern("00");
  374 + if (text) {
  375 + if (millis > 0)
  376 + time = (negative ? "-" : "") + hours + "h" + format.format(min) + "min";
  377 + else if (min > 0)
  378 + time = (negative ? "-" : "") + min + "min";
  379 + else
  380 + time = (negative ? "-" : "") + sec + "s";
  381 + } else {
  382 + if (millis > 0)
  383 + time = (negative ? "-" : "") + hours + ":" + format.format(min) + ":" + format.format(sec);
  384 + else
  385 + time = (negative ? "-" : "") + min + ":" + format.format(sec);
  386 + }
  387 + return time;
  388 + }
  389 +
  390 + private void videoPlayEnd() {
  391 + if (mVideoView != null) {
  392 + mVideoView.release();
  393 + mVideoView = null;
  394 + }
  395 +
  396 +
  397 + mHandler = null;
  398 +
  399 + finish();
  400 + }
  401 +
  402 + public void onClick(View view) {
  403 + mHandler.removeMessages(HIDDEN_SEEKBAR);
  404 + Message msg = new Message();
  405 + msg.what = HIDDEN_SEEKBAR;
  406 + mHandler.sendMessageDelayed(msg, 3000);
  407 + switch (view.getId()) {
  408 + case R.id.player_start:
  409 + onPlayBtnClick();
  410 + break;
  411 + }
  412 + }
  413 +
  414 + private void onPlayBtnClick() {
  415 + mPause = !mPause;
  416 + mHandler.removeMessages(HIDDEN_SEEKBAR);
  417 + Message msg = new Message();
  418 + msg.what = HIDDEN_SEEKBAR;
  419 + mHandler.sendMessageDelayed(msg, 3000);
  420 + if (mPause) {
  421 + mVideoView.pause();
  422 + } else {
  423 + mVideoView.start();
  424 + }
  425 + }
  426 +
  427 + // Maybe we could support gesture detect
  428 + private void dealTouchEvent(View view, MotionEvent event) {
  429 + mPlayerPanelShow = !mPlayerPanelShow;
  430 +
  431 + if (mPlayerPanelShow) {
  432 + mPlayerPanel.setVisibility(View.VISIBLE);
  433 + toppanel.setVisibility(View.VISIBLE);
  434 +
  435 + Message msg = new Message();
  436 + msg.what = HIDDEN_SEEKBAR;
  437 + mHandler.sendMessageDelayed(msg, 3000);
  438 + } else {
  439 + mPlayerPanel.setVisibility(View.GONE);
  440 + toppanel.setVisibility(View.GONE);
  441 + mHandler.removeMessages(HIDDEN_SEEKBAR);
  442 + }
  443 + }
  444 +
  445 +}
app/src/main/java/com/cnlive/gundam/shortvideo/dialog/ShortVideoConfigDialog.java
1 package com.cnlive.gundam.shortvideo.dialog; 1 package com.cnlive.gundam.shortvideo.dialog;
2 2
  3 +import android.app.Activity;
3 import android.app.Dialog; 4 import android.app.Dialog;
4 import android.content.Context; 5 import android.content.Context;
5 import android.os.Bundle; 6 import android.os.Bundle;
@@ -8,6 +9,8 @@ import android.text.InputType; @@ -8,6 +9,8 @@ import android.text.InputType;
8 import android.text.TextUtils; 9 import android.text.TextUtils;
9 import android.view.KeyEvent; 10 import android.view.KeyEvent;
10 import android.view.View; 11 import android.view.View;
  12 +import android.view.ViewGroup;
  13 +import android.view.WindowManager;
11 import android.widget.Button; 14 import android.widget.Button;
12 import android.widget.EditText; 15 import android.widget.EditText;
13 import android.widget.RadioButton; 16 import android.widget.RadioButton;
@@ -15,6 +18,7 @@ import android.widget.RadioGroup; @@ -15,6 +18,7 @@ import android.widget.RadioGroup;
15 import android.widget.TextView; 18 import android.widget.TextView;
16 19
17 import com.cnlive.gundam.R; 20 import com.cnlive.gundam.R;
  21 +import com.cnlive.gundam.shortvideo.activity.ShortVideoActivity;
18 import com.cnlive.libs.stream.base.IStreamer; 22 import com.cnlive.libs.stream.base.IStreamer;
19 23
20 /** 24 /**
@@ -43,12 +47,15 @@ public class ShortVideoConfigDialog extends Dialog { @@ -43,12 +47,15 @@ public class ShortVideoConfigDialog extends Dialog {
43 private EditText mAudioBitRateEditText; 47 private EditText mAudioBitRateEditText;
44 private TextView mConfigTitle; 48 private TextView mConfigTitle;
45 49
  50 + private Context mContext;
  51 +
46 private ShortVideoConfig mShortVideoConfig; 52 private ShortVideoConfig mShortVideoConfig;
47 private int mConfigType = SHORTVIDEOCONFIG_TYPE_RECORD; 53 private int mConfigType = SHORTVIDEOCONFIG_TYPE_RECORD;
48 54
49 - public ShortVideoConfigDialog(@NonNull Context context, int type) {  
50 - super(context); 55 + public ShortVideoConfigDialog(@NonNull Context context, int type, int theme) {
  56 + super(context, theme);
51 this.mConfigType = type; 57 this.mConfigType = type;
  58 + this.mContext = context;
52 } 59 }
53 60
54 @Override 61 @Override
app/src/main/java/com/cnlive/gundam/shortvideo/fragment/MyVideoFragment.java
1 package com.cnlive.gundam.shortvideo.fragment; 1 package com.cnlive.gundam.shortvideo.fragment;
2 2
  3 +import android.content.DialogInterface;
3 import android.content.Intent; 4 import android.content.Intent;
4 -import android.database.DatabaseUtils;  
5 import android.databinding.DataBindingUtil; 5 import android.databinding.DataBindingUtil;
6 import android.os.Bundle; 6 import android.os.Bundle;
7 import android.os.Handler; 7 import android.os.Handler;
8 import android.support.annotation.Nullable; 8 import android.support.annotation.Nullable;
9 import android.support.v4.app.Fragment; 9 import android.support.v4.app.Fragment;
  10 +import android.support.v4.widget.SwipeRefreshLayout;
  11 +import android.support.v7.widget.LinearLayoutManager;
  12 +import android.util.Log;
10 import android.view.LayoutInflater; 13 import android.view.LayoutInflater;
11 import android.view.View; 14 import android.view.View;
12 import android.view.ViewGroup; 15 import android.view.ViewGroup;
  16 +import android.view.Window;
  17 +import android.view.WindowManager;
13 import android.widget.Toast; 18 import android.widget.Toast;
14 19
  20 +import com.cnlive.gundam.BR;
15 import com.cnlive.gundam.R; 21 import com.cnlive.gundam.R;
  22 +import com.cnlive.gundam.data.network.RetrofitUtil;
  23 +import com.cnlive.gundam.data.network.util.SignUtil;
16 import com.cnlive.gundam.databinding.FragmentMyVideoBinding; 24 import com.cnlive.gundam.databinding.FragmentMyVideoBinding;
  25 +import com.cnlive.gundam.main.ui.adapter.DataBindingAdapter;
17 import com.cnlive.gundam.shortvideo.activity.ShortVideoActivity; 26 import com.cnlive.gundam.shortvideo.activity.ShortVideoActivity;
  27 +import com.cnlive.gundam.shortvideo.activity.ShortVideoPlayActivity;
  28 +import com.cnlive.gundam.shortvideo.dialog.ShortVideoConfigDialog;
  29 +import com.cnlive.gundam.shortvideo.model.ShortVideoDataModel;
  30 +import com.cnlive.gundam.shortvideo.model.ShortVideoInfo;
18 import com.cnlive.gundam.user.activity.LoginActivity; 31 import com.cnlive.gundam.user.activity.LoginActivity;
19 import com.cnlive.gundam.user.auth.UserService; 32 import com.cnlive.gundam.user.auth.UserService;
20 import com.cnlive.gundam.user.model.User; 33 import com.cnlive.gundam.user.model.User;
@@ -23,14 +36,26 @@ import com.cnlive.libs.shortvideo.callback.Callback; @@ -23,14 +36,26 @@ import com.cnlive.libs.shortvideo.callback.Callback;
23 import com.cnlive.libs.shortvideo.callback.CheckAuthResultListener; 36 import com.cnlive.libs.shortvideo.callback.CheckAuthResultListener;
24 import com.cnlive.libs.shortvideo.network.model.ShortVideoAuth; 37 import com.cnlive.libs.shortvideo.network.model.ShortVideoAuth;
25 import com.cnlive.libs.shortvideo.utils.AuthInfoManager; 38 import com.cnlive.libs.shortvideo.utils.AuthInfoManager;
  39 +import com.cnlive.libs.util.Config;
26 40
27 -import java.util.ArrayList;  
28 -import java.util.List; 41 +import java.util.HashMap;
  42 +import java.util.Map;
  43 +
  44 +import retrofit2.Call;
  45 +import retrofit2.Response;
  46 +
  47 +
  48 +public class MyVideoFragment extends Fragment implements View.OnClickListener,
  49 + SwipeRefreshLayout.OnRefreshListener,
  50 + DataBindingAdapter.OnAdapterViewClickListener<ShortVideoInfo>,
  51 + DataBindingAdapter.OnAdapterViewLoadMoreListener,
  52 + retrofit2.Callback<ShortVideoDataModel> {
29 53
30 -public class MyVideoFragment extends Fragment implements View.OnClickListener {  
31 private FragmentMyVideoBinding binding; 54 private FragmentMyVideoBinding binding;
  55 + private DataBindingAdapter adapter;
32 56
33 private Handler mMainHandler; 57 private Handler mMainHandler;
  58 + private int maxDuration;
34 59
35 public MyVideoFragment() { 60 public MyVideoFragment() {
36 // Required empty public constructor 61 // Required empty public constructor
@@ -42,17 +67,38 @@ public class MyVideoFragment extends Fragment implements View.OnClickListener { @@ -42,17 +67,38 @@ public class MyVideoFragment extends Fragment implements View.OnClickListener {
42 } 67 }
43 68
44 @Override 69 @Override
  70 + public void onCreate(@Nullable Bundle savedInstanceState) {
  71 + super.onCreate(savedInstanceState);
  72 + }
  73 +
  74 + @Override
45 public View onCreateView(LayoutInflater inflater, ViewGroup container, 75 public View onCreateView(LayoutInflater inflater, ViewGroup container,
46 Bundle savedInstanceState) { 76 Bundle savedInstanceState) {
47 binding = DataBindingUtil.inflate(inflater, R.layout.fragment_my_video, container, false); 77 binding = DataBindingUtil.inflate(inflater, R.layout.fragment_my_video, container, false);
  78 + binding.setListAdapter(adapter = new DataBindingAdapter(getActivity(), R.layout.layout_item_short_video, BR.shortVideoInfo));
  79 + adapter.setOnViewClickListener(this);
  80 + adapter.setOnLoadMoreListener(this);
  81 + binding.setLayoutManager(new LinearLayoutManager(getActivity()));
  82 + binding.contentView.setOnRefreshListener(this);
48 return binding.getRoot(); 83 return binding.getRoot();
49 } 84 }
50 85
51 @Override 86 @Override
52 - public void onActivityCreated(@Nullable Bundle savedInstanceState) {  
53 - super.onActivityCreated(savedInstanceState); 87 + public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
  88 + super.onViewCreated(view, savedInstanceState);
54 mMainHandler = new Handler(); 89 mMainHandler = new Handler();
55 initToolBar(); 90 initToolBar();
  91 + loadData();
  92 + }
  93 +
  94 + private void loadData() {
  95 + Map<String, String> params = new HashMap<>();
  96 + params.put("appId", Config.getAppId());
  97 + params.put("page", "1");
  98 + params.put("pageSize", "15");
  99 + params.put("platform_id", Config.getContext().getPackageName());
  100 + params.put("timestamp", String.valueOf(System.currentTimeMillis()));
  101 + RetrofitUtil.getApiService().getShortVideoList(SignUtil.getSignParamM(getActivity(), params)).enqueue(this);
56 } 102 }
57 103
58 @Override 104 @Override
@@ -86,12 +132,12 @@ public class MyVideoFragment extends Fragment implements View.OnClickListener { @@ -86,12 +132,12 @@ public class MyVideoFragment extends Fragment implements View.OnClickListener {
86 getActivity().finish(); 132 getActivity().finish();
87 break; 133 break;
88 case R.id.record: 134 case R.id.record:
89 - onAuthClick();  
90 User user = UserService.getInstance(getActivity()).getActiveAccountInfo(); 135 User user = UserService.getInstance(getActivity()).getActiveAccountInfo();
91 if (user.getUid() == 0) { 136 if (user.getUid() == 0) {
92 startActivity(new Intent(getActivity(), LoginActivity.class)); 137 startActivity(new Intent(getActivity(), LoginActivity.class));
93 } else { 138 } else {
94 - startActivity(new Intent(getActivity(), ShortVideoActivity.class)); 139 + onRecordClick();
  140 + onAuthClick();
95 } 141 }
96 break; 142 break;
97 } 143 }
@@ -110,6 +156,9 @@ public class MyVideoFragment extends Fragment implements View.OnClickListener { @@ -110,6 +156,9 @@ public class MyVideoFragment extends Fragment implements View.OnClickListener {
110 ShortVideoAuth shortVideoAuth = (ShortVideoAuth) o; 156 ShortVideoAuth shortVideoAuth = (ShortVideoAuth) o;
111 final String authInfo = shortVideoAuth.getData().getAuthorization(); 157 final String authInfo = shortVideoAuth.getData().getAuthorization();
112 final String date = shortVideoAuth.getData().getX_amz_date(); 158 final String date = shortVideoAuth.getData().getX_amz_date();
  159 + String duration = shortVideoAuth.getData().getMaxDuration();
  160 + maxDuration = Integer.parseInt(duration);
  161 +
113 //初始化鉴权信息 162 //初始化鉴权信息
114 163
115 AuthInfoManager.getInstance().setAuthInfo(getActivity().getApplicationContext(), 164 AuthInfoManager.getInstance().setAuthInfo(getActivity().getApplicationContext(),
@@ -124,6 +173,32 @@ public class MyVideoFragment extends Fragment implements View.OnClickListener { @@ -124,6 +173,32 @@ public class MyVideoFragment extends Fragment implements View.OnClickListener {
124 173
125 } 174 }
126 175
  176 + private void onRecordClick() {
  177 +
  178 + final ShortVideoConfigDialog configDialog = new ShortVideoConfigDialog(getActivity(), ShortVideoConfigDialog.SHORTVIDEOCONFIG_TYPE_RECORD, R.style.RecordParamsDialog);
  179 + configDialog.setCancelable(false);
  180 + configDialog.show();
  181 +
  182 + Window win = configDialog.getWindow();
  183 + win.getDecorView().setPadding(0, 0, 0, 0);
  184 + WindowManager.LayoutParams lp = win.getAttributes();
  185 + lp.width = WindowManager.LayoutParams.FILL_PARENT;
  186 + lp.height = WindowManager.LayoutParams.FILL_PARENT;
  187 + win.setAttributes(lp);
  188 + configDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
  189 + @Override
  190 + public void onDismiss(DialogInterface dialogInterface) {
  191 + ShortVideoConfigDialog.ShortVideoConfig config = configDialog.getShortVideoConfig();
  192 + if (config != null) {
  193 + ShortVideoActivity.startActivity(getActivity().getApplicationContext(), config.fps,
  194 + config.videoBitrate, config.audioBitrate,
  195 + config.resolution, config.encodeType,
  196 + config.encodeMethod, config.encodeProfile, maxDuration);
  197 + }
  198 + }
  199 + });
  200 + }
  201 +
127 private CheckAuthResultListener mCheckAuthResultListener = new CheckAuthResultListener() { 202 private CheckAuthResultListener mCheckAuthResultListener = new CheckAuthResultListener() {
128 @Override 203 @Override
129 public void onAuthResult(int i) { 204 public void onAuthResult(int i) {
@@ -141,5 +216,47 @@ public class MyVideoFragment extends Fragment implements View.OnClickListener { @@ -141,5 +216,47 @@ public class MyVideoFragment extends Fragment implements View.OnClickListener {
141 } 216 }
142 }; 217 };
143 218
  219 + @Override
  220 + public void onRefresh() {
  221 + loadData();
  222 + }
  223 +
  224 + @Override
  225 + public void onViewClick(View v, ShortVideoInfo program) {
  226 + String videoId = program.getVideoId();
  227 + String name = program.getName();
  228 + String des = program.getDescription();
  229 + if (v.getId() == R.id.item_short_video) {
  230 + ShortVideoPlayActivity.startActivity(getActivity(), videoId, name, des);
  231 + }
  232 + }
144 233
  234 + @Override
  235 + public void onLoadMore() {
  236 + }
  237 +
  238 + @Override
  239 + public void onResponse(Call<ShortVideoDataModel> call, Response<ShortVideoDataModel> response) {
  240 + binding.contentView.setRefreshing(false);
  241 + if (response.isSuccessful()) {
  242 + ShortVideoDataModel model = response.body();
  243 + if (model != null && "0".equals(model.getCode())) {
  244 + if (model.getData() == null) {
  245 + Toast.makeText(getActivity(), "暂无数据", Toast.LENGTH_SHORT).show();
  246 + } else {
  247 + adapter.updateItems(model.getData().getList());
  248 + }
  249 + } else {
  250 + Toast.makeText(getActivity(), "获取数据失败1 " + model.getCode() + " : " + model.getMessage(), Toast.LENGTH_SHORT).show();
  251 + }
  252 + } else {
  253 + Toast.makeText(getActivity(), "获取数据失败2", Toast.LENGTH_SHORT).show();
  254 + }
  255 + }
  256 +
  257 + @Override
  258 + public void onFailure(Call<ShortVideoDataModel> call, Throwable t) {
  259 + binding.contentView.setRefreshing(false);
  260 + Toast.makeText(getActivity(), "获取数据失败3", Toast.LENGTH_SHORT).show();
  261 + }
145 } 262 }
app/src/main/java/com/cnlive/gundam/shortvideo/model/ShortVideoDataModel.java 0 → 100644
  1 +package com.cnlive.gundam.shortvideo.model;
  2 +
  3 +import com.cnlive.gundam.main.model.ErrorMessage;
  4 +
  5 +import java.io.Serializable;
  6 +
  7 +/**
  8 + * Created by Lynn on 2017/7/13.
  9 + */
  10 +
  11 +public class ShortVideoDataModel extends ErrorMessage implements Serializable {
  12 +
  13 + private ShortVideoList data;
  14 +
  15 + public ShortVideoList getData() {
  16 + return data;
  17 + }
  18 +
  19 + public void setData(ShortVideoList data) {
  20 + this.data = data;
  21 + }
  22 +
  23 + @Override
  24 + public String toString() {
  25 + return "ShortVideoDataModel{" +
  26 + "data=" + data +
  27 + '}';
  28 + }
  29 +}
app/src/main/java/com/cnlive/gundam/shortvideo/model/ShortVideoInfo.java 0 → 100644
  1 +package com.cnlive.gundam.shortvideo.model;
  2 +
  3 +import com.cnlive.gundam.shortvideo.util.DateUtils;
  4 +
  5 +import java.io.Serializable;
  6 +
  7 +/**
  8 + * Created by Lynn on 2017/7/14.
  9 + */
  10 +
  11 +public class ShortVideoInfo implements Serializable {
  12 + private String appId;
  13 + private String createTime;
  14 + private String description;
  15 + private String id;
  16 + private String md5;
  17 + private String name;
  18 + private String path;
  19 + private String spId;
  20 + private String status;
  21 + private String updateTime;
  22 + private String videoId;
  23 +
  24 + public String getAppId() {
  25 + return appId;
  26 + }
  27 +
  28 + public void setAppId(String appId) {
  29 + this.appId = appId;
  30 + }
  31 +
  32 + public String getCreateTime() {
  33 + return DateUtils.getDateToString(Long.parseLong(createTime));
  34 + }
  35 +
  36 + public void setCreateTime(String createTime) {
  37 + this.createTime = createTime;
  38 + }
  39 +
  40 + public String getDescription() {
  41 + return description;
  42 + }
  43 +
  44 + public void setDescription(String description) {
  45 + this.description = description;
  46 + }
  47 +
  48 + public String getId() {
  49 + return id;
  50 + }
  51 +
  52 + public void setId(String id) {
  53 + this.id = id;
  54 + }
  55 +
  56 + public String getMd5() {
  57 + return md5;
  58 + }
  59 +
  60 + public void setMd5(String md5) {
  61 + this.md5 = md5;
  62 + }
  63 +
  64 + public String getName() {
  65 + return name;
  66 + }
  67 +
  68 + public void setName(String name) {
  69 + this.name = name;
  70 + }
  71 +
  72 + public String getPath() {
  73 + return path;
  74 + }
  75 +
  76 + public void setPath(String path) {
  77 + this.path = path;
  78 + }
  79 +
  80 + public String getSpId() {
  81 + return spId;
  82 + }
  83 +
  84 + public void setSpId(String spId) {
  85 + this.spId = spId;
  86 + }
  87 +
  88 + public String getStatus() {
  89 + return status;
  90 + }
  91 +
  92 + public void setStatus(String status) {
  93 + this.status = status;
  94 + }
  95 +
  96 + public String getUpdateTime() {
  97 + return updateTime;
  98 + }
  99 +
  100 + public void setUpdateTime(String updateTime) {
  101 + this.updateTime = updateTime;
  102 + }
  103 +
  104 + public String getVideoId() {
  105 + return videoId;
  106 + }
  107 +
  108 + public void setVideoId(String videoId) {
  109 + this.videoId = videoId;
  110 + }
  111 +
  112 + @Override
  113 + public String toString() {
  114 + return "ShortVideoInfo{" +
  115 + "appId='" + appId + '\'' +
  116 + ", createTime='" + createTime + '\'' +
  117 + ", description='" + description + '\'' +
  118 + ", id='" + id + '\'' +
  119 + ", md5='" + md5 + '\'' +
  120 + ", name='" + name + '\'' +
  121 + ", path='" + path + '\'' +
  122 + ", spId='" + spId + '\'' +
  123 + ", status='" + status + '\'' +
  124 + ", updateTime='" + updateTime + '\'' +
  125 + ", videoId='" + videoId + '\'' +
  126 + '}';
  127 + }
  128 +}
app/src/main/java/com/cnlive/gundam/shortvideo/model/ShortVideoList.java 0 → 100644
  1 +package com.cnlive.gundam.shortvideo.model;
  2 +
  3 +import java.io.Serializable;
  4 +import java.util.List;
  5 +
  6 +/**
  7 + * Created by Lynn on 2017/7/14.
  8 + */
  9 +
  10 +public class ShortVideoList implements Serializable {
  11 + List<ShortVideoInfo> list;
  12 +
  13 + public List<ShortVideoInfo> getList() {
  14 + return list;
  15 + }
  16 +
  17 + public void setList(List<ShortVideoInfo> list) {
  18 + this.list = list;
  19 + }
  20 +
  21 + @Override
  22 + public String toString() {
  23 + return "ShortVideoList{" +
  24 + "list=" + list +
  25 + '}';
  26 + }
  27 +}
app/src/main/java/com/cnlive/gundam/shortvideo/util/DateUtils.java 0 → 100644
  1 +package com.cnlive.gundam.shortvideo.util;
  2 +
  3 +import java.text.SimpleDateFormat;
  4 +import java.util.Date;
  5 +
  6 +/**
  7 + * Created by Lynn on 2017/7/14.
  8 + */
  9 +
  10 +public class DateUtils {
  11 + private static SimpleDateFormat sf;
  12 +
  13 + /*时间戳转换成字符串*/
  14 + public static String getDateToString(long time) {
  15 + Date d = new Date(time);
  16 + sf = new SimpleDateFormat("yyyy-MM-dd");
  17 + return sf.format(d);
  18 + }
  19 +}
app/src/main/java/com/cnlive/gundam/shortvideo/util/FileUtils.java
@@ -5,6 +5,7 @@ import android.content.Context; @@ -5,6 +5,7 @@ import android.content.Context;
5 import android.content.Intent; 5 import android.content.Intent;
6 import android.database.Cursor; 6 import android.database.Cursor;
7 import android.database.DatabaseUtils; 7 import android.database.DatabaseUtils;
  8 +import android.media.MediaMetadataRetriever;
8 import android.net.Uri; 9 import android.net.Uri;
9 import android.os.Build; 10 import android.os.Build;
10 import android.os.Environment; 11 import android.os.Environment;
@@ -289,4 +290,22 @@ public class FileUtils { @@ -289,4 +290,22 @@ public class FileUtils {
289 return ""; 290 return "";
290 } 291 }
291 } 292 }
  293 +
  294 + public static String getDuration(String uri) {
  295 + String duration = null;
  296 + MediaMetadataRetriever mmr = new MediaMetadataRetriever();
  297 + try {
  298 + if (uri != null) {
  299 + mmr.setDataSource(uri);
  300 + duration = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
  301 + } else {
  302 + Log.d("getUploadInfo", "path should not null");
  303 + }
  304 + } catch (IllegalArgumentException e) {
  305 + e.printStackTrace();
  306 + } catch (IllegalStateException e) {
  307 + e.printStackTrace();
  308 + }
  309 + return duration;
  310 + }
292 } 311 }
app/src/main/java/com/cnlive/gundam/shortvideo/view/RecordProgressController.java
@@ -186,7 +186,7 @@ public class RecordProgressController { @@ -186,7 +186,7 @@ public class RecordProgressController {
186 * @return 186 * @return
187 */ 187 */
188 public int getRecordedTime() { 188 public int getRecordedTime() {
189 - return mProgressView.mTotalWidth * ShortVideoActivity.MAX_DURATION / mProgressView 189 + return mProgressView.mTotalWidth * ShortVideoActivity.getMaxDuration() / mProgressView
190 .mScreenWidth; 190 .mScreenWidth;
191 } 191 }
192 192
app/src/main/java/com/cnlive/gundam/shortvideo/view/RecordProgressView.java
@@ -90,7 +90,7 @@ public class RecordProgressView extends View implements RecordProgressController @@ -90,7 +90,7 @@ public class RecordProgressView extends View implements RecordProgressController
90 mScreenWidth = getScreenWidthPixels(getContext()); 90 mScreenWidth = getScreenWidthPixels(getContext());
91 mMinPoint = mScreenWidth 91 mMinPoint = mScreenWidth
92 * ShortVideoActivity.MIN_DURATION 92 * ShortVideoActivity.MIN_DURATION
93 - / ShortVideoActivity.MAX_DURATION; 93 + / ShortVideoActivity.getMaxDuration();
94 mHandler.postDelayed(mCursorRunnable, 500); 94 mHandler.postDelayed(mCursorRunnable, 500);
95 } 95 }
96 96
@@ -104,7 +104,7 @@ public class RecordProgressView extends View implements RecordProgressController @@ -104,7 +104,7 @@ public class RecordProgressView extends View implements RecordProgressController
104 int totalWidth = 0; 104 int totalWidth = 0;
105 for (RecordClipModel clip : mProgressClipList) { 105 for (RecordClipModel clip : mProgressClipList) {
106 long newWidth = totalWidth + (clip.timeInterval * mScreenWidth) 106 long newWidth = totalWidth + (clip.timeInterval * mScreenWidth)
107 - / ShortVideoActivity.MAX_DURATION; 107 + / ShortVideoActivity.getMaxDuration();
108 switch (clip.state) { 108 switch (clip.state) {
109 case 0: // recording 109 case 0: // recording
110 canvas.drawRect(totalWidth, paddingTop, newWidth, 110 canvas.drawRect(totalWidth, paddingTop, newWidth,
@@ -168,7 +168,7 @@ public class RecordProgressView extends View implements RecordProgressController @@ -168,7 +168,7 @@ public class RecordProgressView extends View implements RecordProgressController
168 int totalWidth = 0; 168 int totalWidth = 0;
169 for (RecordClipModel clip : mProgressClipList) { 169 for (RecordClipModel clip : mProgressClipList) {
170 long newWidth = totalWidth + (clip.timeInterval * mScreenWidth) 170 long newWidth = totalWidth + (clip.timeInterval * mScreenWidth)
171 - / ShortVideoActivity.MAX_DURATION; 171 + / ShortVideoActivity.getMaxDuration();
172 totalWidth = (int) newWidth; 172 totalWidth = (int) newWidth;
173 } 173 }
174 if (totalWidth >= mMinPoint) { 174 if (totalWidth >= mMinPoint) {
app/src/main/res/drawable-hdpi/default_pic.png 0 → 100644

1.22 KB

app/src/main/res/drawable-hdpi/ic_short_video_back.png

2.39 KB | W: | H:

2.08 KB | W: | H:

  • 2-up
  • Swipe
  • Onion skin
app/src/main/res/drawable-hdpi/ic_short_video_back_recording.png

3.06 KB | W: | H:

2.74 KB | W: | H:

  • 2-up
  • Swipe
  • Onion skin
app/src/main/res/drawable-hdpi/ic_short_video_next.png

3.08 KB | W: | H:

2.78 KB | W: | H:

  • 2-up
  • Swipe
  • Onion skin
app/src/main/res/drawable-hdpi/ic_short_video_next_recording.png

2.96 KB | W: | H:

2.71 KB | W: | H:

  • 2-up
  • Swipe
  • Onion skin
app/src/main/res/drawable-mdpi/default_pic.png 0 → 100644

1003 Bytes

app/src/main/res/drawable-mdpi/ic_short_video_back.png

1.28 KB | W: | H:

1.15 KB | W: | H:

  • 2-up
  • Swipe
  • Onion skin
app/src/main/res/drawable-mdpi/ic_short_video_back_recording.png

1.64 KB | W: | H:

1.54 KB | W: | H:

  • 2-up
  • Swipe
  • Onion skin
app/src/main/res/drawable-mdpi/ic_short_video_next.png

1.72 KB | W: | H:

1.57 KB | W: | H:

  • 2-up
  • Swipe
  • Onion skin
app/src/main/res/drawable-mdpi/ic_short_video_next_recording.png

1.65 KB | W: | H:

1.51 KB | W: | H:

  • 2-up
  • Swipe
  • Onion skin
app/src/main/res/drawable-xhdpi/default_pic.png 0 → 100644

1.9 KB

app/src/main/res/drawable-xhdpi/ic_short_video_back.png

3.03 KB | W: | H:

2.76 KB | W: | H:

  • 2-up
  • Swipe
  • Onion skin
app/src/main/res/drawable-xhdpi/ic_short_video_back_recording.png

3.63 KB | W: | H:

3.5 KB | W: | H:

  • 2-up
  • Swipe
  • Onion skin
app/src/main/res/drawable-xhdpi/ic_short_video_next.png

3.81 KB | W: | H:

3.51 KB | W: | H:

  • 2-up
  • Swipe
  • Onion skin
app/src/main/res/drawable-xhdpi/ic_short_video_next_recording.png

3.65 KB | W: | H:

3.41 KB | W: | H:

  • 2-up
  • Swipe
  • Onion skin
app/src/main/res/drawable-xhdpi/test.png 0 → 100644

646 KB

app/src/main/res/drawable-xxhdpi/default_pic.png 0 → 100644

2.82 KB

app/src/main/res/drawable-xxhdpi/ic_short_video_back.png

5.34 KB | W: | H:

5.18 KB | W: | H:

  • 2-up
  • Swipe
  • Onion skin
app/src/main/res/drawable-xxhdpi/ic_short_video_back_recording.png

6.47 KB | W: | H:

6.55 KB | W: | H:

  • 2-up
  • Swipe
  • Onion skin
app/src/main/res/drawable-xxhdpi/ic_short_video_next.png

6.79 KB | W: | H:

6.53 KB | W: | H:

  • 2-up
  • Swipe
  • Onion skin
app/src/main/res/drawable-xxhdpi/ic_short_video_next_recording.png

6.54 KB | W: | H:

6.39 KB | W: | H:

  • 2-up
  • Swipe
  • Onion skin
app/src/main/res/drawable-xxxhdpi/default_pic.png 0 → 100644

4.33 KB

app/src/main/res/drawable-xxxhdpi/ic_short_video_back.png

6.41 KB | W: | H:

6.92 KB | W: | H:

  • 2-up
  • Swipe
  • Onion skin
app/src/main/res/drawable-xxxhdpi/ic_short_video_back_recording.png

7.51 KB | W: | H:

8.4 KB | W: | H:

  • 2-up
  • Swipe
  • Onion skin
app/src/main/res/drawable-xxxhdpi/ic_short_video_next.png

7.85 KB | W: | H:

8 KB | W: | H:

  • 2-up
  • Swipe
  • Onion skin
app/src/main/res/drawable-xxxhdpi/ic_short_video_next_recording.png

7.57 KB | W: | H:

7.85 KB | W: | H:

  • 2-up
  • Swipe
  • Onion skin
app/src/main/res/drawable/background_radio.xml 0 → 100644
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<shape xmlns:android="http://schemas.android.com/apk/res/android"
  3 + android:padding="10dp"
  4 + android:shape="rectangle">
  5 + <solid android:color="#ffcc00" />
  6 + <stroke
  7 + android:width="1dip"
  8 + android:color="#ffcc00" />
  9 +</shape>
0 \ No newline at end of file 10 \ No newline at end of file
app/src/main/res/drawable/edit_cursor_color.xml 0 → 100644
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<shape xmlns:android="http://schemas.android.com/apk/res/android"
  3 + android:shape="rectangle" >
  4 +
  5 + <size android:width="2dp" />
  6 +
  7 + <solid android:color="#ff7200" />
  8 +
  9 +</shape>
0 \ No newline at end of file 10 \ No newline at end of file
app/src/main/res/drawable/edit_text_line.xml 0 → 100644
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
  3 +
  4 + <item>
  5 + <shape android:shape="rectangle" >
  6 + <gradient
  7 + android:endColor="#ff7200"
  8 + android:startColor="#ff7200" />
  9 + </shape>
  10 + </item>
  11 + <item android:bottom="2dp">
  12 + <shape android:shape="rectangle" >
  13 + <gradient
  14 + android:endColor="#eeeeee"
  15 + android:startColor="#eeeeee" />
  16 + </shape>
  17 + </item>
  18 +
  19 +</layer-list>
0 \ No newline at end of file 20 \ No newline at end of file
app/src/main/res/drawable/edit_title_choose.xml
1 <?xml version="1.0" encoding="utf-8"?> 1 <?xml version="1.0" encoding="utf-8"?>
2 <selector xmlns:android="http://schemas.android.com/apk/res/android"> 2 <selector xmlns:android="http://schemas.android.com/apk/res/android">
3 - <item android:state_activated="true" android:color="#02d4e1"/>  
4 - <item android:color="@android:color/white"/> 3 + <item android:color="#ffcc00" android:state_activated="true" />
  4 + <item android:color="@android:color/white" />
5 </selector> 5 </selector>
6 \ No newline at end of file 6 \ No newline at end of file
app/src/main/res/drawable/edittext_background.xml 0 → 100644
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<shape xmlns:android="http://schemas.android.com/apk/res/android"
  3 + android:padding="10dp"
  4 + android:shape="rectangle">
  5 + <solid android:color="#FFFFFF" />
  6 + <stroke
  7 + android:width="1dip"
  8 + android:color="#ffcc00" />
  9 +</shape>
0 \ No newline at end of file 10 \ No newline at end of file
app/src/main/res/drawable/radiobutton_selector.xml 0 → 100644
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<selector xmlns:android="http://schemas.android.com/apk/res/android">
  3 + <item android:drawable="@drawable/edittext_background" android:state_checked="false" />
  4 + <item android:drawable="@drawable/background_radio" android:state_checked="true" />
  5 +</selector>
0 \ No newline at end of file 6 \ No newline at end of file
app/src/main/res/drawable/text_color_selector.xml 0 → 100644
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<selector xmlns:android="http://schemas.android.com/apk/res/android">
  3 + <item android:color="#ffcc00" android:state_checked="false" />
  4 + <item android:color="#ffffff" android:state_checked="true" />
  5 +</selector>
0 \ No newline at end of file 6 \ No newline at end of file
app/src/main/res/layout/activity_edit.xml
@@ -18,6 +18,16 @@ @@ -18,6 +18,16 @@
18 android:layout_alignParentBottom="true" 18 android:layout_alignParentBottom="true"
19 android:layout_alignParentTop="true" /> 19 android:layout_alignParentTop="true" />
20 20
  21 + <TextView
  22 + android:id="@+id/hint"
  23 + android:layout_width="wrap_content"
  24 + android:layout_height="wrap_content"
  25 + android:layout_alignParentTop="true"
  26 + android:layout_centerHorizontal="true"
  27 + android:layout_marginTop="5dp"
  28 + android:textColor="@color/ff4e51"
  29 + android:textSize="14sp" />
  30 +
21 <com.cnlive.libs.shortvideo.view.CNStickerView 31 <com.cnlive.libs.shortvideo.view.CNStickerView
22 android:id="@+id/sticker_panel" 32 android:id="@+id/sticker_panel"
23 android:layout_width="fill_parent" 33 android:layout_width="fill_parent"
app/src/main/res/layout/activity_short_video.xml
@@ -16,6 +16,19 @@ @@ -16,6 +16,19 @@
16 android:id="@+id/short_video_record_top_layout" 16 android:id="@+id/short_video_record_top_layout"
17 layout="@layout/short_video_record_top_view" /> 17 layout="@layout/short_video_record_top_view" />
18 18
  19 + <Chronometer
  20 + android:id="@+id/chronometer"
  21 + android:layout_width="wrap_content"
  22 + android:layout_height="wrap_content"
  23 + android:layout_alignParentTop="true"
  24 + android:layout_centerHorizontal="true"
  25 + android:layout_marginTop="50dp"
  26 + android:format="%s"
  27 + android:gravity="center"
  28 + android:textColor="@color/ff4e51"
  29 + android:textSize="40px"
  30 + android:visibility="gone" />
  31 +
19 <include 32 <include
20 android:id="@+id/short_video_record_bottom_layout" 33 android:id="@+id/short_video_record_bottom_layout"
21 layout="@layout/short_video_record_bottom_view" /> 34 layout="@layout/short_video_record_bottom_view" />
app/src/main/res/layout/activity_short_video_play.xml 0 → 100644
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +
  3 +<layout xmlns:android="http://schemas.android.com/apk/res/android"
  4 + xmlns:tools="http://schemas.android.com/tools">
  5 +
  6 + <RelativeLayout
  7 + android:layout_width="match_parent"
  8 + android:layout_height="match_parent"
  9 + android:background="#000000">
  10 +
  11 + <com.cnlive.libs.video.video.VideoView
  12 + android:id="@+id/video_view"
  13 + android:layout_width="match_parent"
  14 + android:layout_height="match_parent"
  15 + android:layout_centerInParent="true" />
  16 +
  17 + <TextureView
  18 + android:id="@+id/player_texture"
  19 + android:layout_width="match_parent"
  20 + android:layout_height="match_parent"
  21 + android:layout_centerInParent="true"
  22 + android:visibility="gone"
  23 + tools:targetApi="ice_cream_sandwich" />
  24 +
  25 + <TextView
  26 + android:id="@+id/loading_text"
  27 + android:layout_width="wrap_content"
  28 + android:layout_height="wrap_content"
  29 + android:layout_centerInParent="true"
  30 + android:textColor="#FFCC00" />
  31 +
  32 + <LinearLayout
  33 + android:id="@+id/top_player_panel"
  34 + android:layout_width="match_parent"
  35 + android:layout_height="48dp"
  36 + android:background="@color/transparent2"
  37 + android:orientation="horizontal">
  38 +
  39 + <ImageView
  40 + android:id="@+id/back"
  41 + android:layout_width="wrap_content"
  42 + android:layout_height="wrap_content"
  43 + android:layout_gravity="center_vertical"
  44 + android:layout_marginLeft="10dp"
  45 + android:src="@drawable/player_back" />
  46 +
  47 + <TextView
  48 + android:id="@+id/video_title"
  49 + android:layout_width="wrap_content"
  50 + android:layout_height="wrap_content"
  51 + android:layout_gravity="center"
  52 + android:textColor="@color/text_white_color" />
  53 + </LinearLayout>
  54 +
  55 + <LinearLayout
  56 + android:layout_width="match_parent"
  57 + android:layout_height="wrap_content"
  58 + android:layout_alignParentBottom="true"
  59 + android:background="@color/transparent2"
  60 + android:orientation="vertical">
  61 +
  62 + <TextView
  63 + android:id="@+id/video_description"
  64 + android:layout_width="match_parent"
  65 + android:layout_height="wrap_content"
  66 + android:layout_alignParentBottom="true"
  67 + android:ellipsize="end"
  68 + android:padding="10dp"
  69 + android:singleLine="true"
  70 + android:textColor="@color/text_white_color" />
  71 +
  72 + <LinearLayout
  73 + android:id="@+id/player_panel"
  74 + android:layout_width="match_parent"
  75 + android:layout_height="50dp">
  76 +
  77 + <ImageView
  78 + android:id="@+id/player_start"
  79 + android:layout_width="40dp"
  80 + android:layout_height="40dp"
  81 + android:layout_marginTop="10dp"
  82 + android:background="@drawable/play_state"
  83 + android:onClick="onClick" />
  84 +
  85 + <RelativeLayout
  86 + android:layout_width="match_parent"
  87 + android:layout_height="wrap_content"
  88 + android:layout_marginTop="10dp">
  89 +
  90 +
  91 + <TextView
  92 + android:id="@+id/player_time"
  93 + android:layout_width="wrap_content"
  94 + android:layout_height="wrap_content"
  95 + android:layout_alignParentLeft="true"
  96 + android:text="00:00/00:00" />
  97 +
  98 + <SeekBar
  99 + android:id="@+id/player_seekbar"
  100 + android:layout_width="match_parent"
  101 + android:layout_height="wrap_content"
  102 + android:layout_below="@+id/player_time"
  103 + android:focusable="true" />
  104 +
  105 + </RelativeLayout>
  106 +
  107 + </LinearLayout>
  108 + </LinearLayout>
  109 + </RelativeLayout>
  110 +</layout>
0 \ No newline at end of file 111 \ No newline at end of file
app/src/main/res/layout/beauty_choose.xml
@@ -21,7 +21,7 @@ @@ -21,7 +21,7 @@
21 android:layout_height="wrap_content" 21 android:layout_height="wrap_content"
22 android:layout_gravity="center" 22 android:layout_gravity="center"
23 android:text="美颜类型:" 23 android:text="美颜类型:"
24 - android:textColor="@color/colorAccent" 24 + android:textColor="@color/ffcc00"
25 android:textSize="16sp" /> 25 android:textSize="16sp" />
26 26
27 <android.support.v7.widget.AppCompatSpinner 27 <android.support.v7.widget.AppCompatSpinner
@@ -48,7 +48,7 @@ @@ -48,7 +48,7 @@
48 android:layout_height="wrap_content" 48 android:layout_height="wrap_content"
49 android:gravity="center" 49 android:gravity="center"
50 android:text="磨皮" 50 android:text="磨皮"
51 - android:textColor="@color/colorAccent" 51 + android:textColor="@color/ffcc00"
52 android:textSize="14sp" /> 52 android:textSize="14sp" />
53 53
54 <android.support.v7.widget.AppCompatSeekBar 54 <android.support.v7.widget.AppCompatSeekBar
@@ -72,7 +72,7 @@ @@ -72,7 +72,7 @@
72 android:layout_height="wrap_content" 72 android:layout_height="wrap_content"
73 android:gravity="center" 73 android:gravity="center"
74 android:text="美白" 74 android:text="美白"
75 - android:textColor="@color/colorAccent" 75 + android:textColor="@color/ffcc00"
76 android:textSize="14sp" /> 76 android:textSize="14sp" />
77 77
78 <android.support.v7.widget.AppCompatSeekBar 78 <android.support.v7.widget.AppCompatSeekBar
@@ -97,7 +97,7 @@ @@ -97,7 +97,7 @@
97 android:layout_height="wrap_content" 97 android:layout_height="wrap_content"
98 android:gravity="center" 98 android:gravity="center"
99 android:text="红润" 99 android:text="红润"
100 - android:textColor="@color/colorAccent" 100 + android:textColor="@color/ffcc00"
101 android:textSize="14sp" /> 101 android:textSize="14sp" />
102 102
103 <android.support.v7.widget.AppCompatSeekBar 103 <android.support.v7.widget.AppCompatSeekBar
app/src/main/res/layout/edit_audio.xml
@@ -20,7 +20,7 @@ @@ -20,7 +20,7 @@
20 android:layout_height="wrap_content" 20 android:layout_height="wrap_content"
21 android:gravity="center" 21 android:gravity="center"
22 android:text="原音" 22 android:text="原音"
23 - android:textColor="@color/colorAccent" 23 + android:textColor="@color/ffcc00"
24 android:textSize="14sp" /> 24 android:textSize="14sp" />
25 25
26 <android.support.v7.widget.AppCompatSeekBar 26 <android.support.v7.widget.AppCompatSeekBar
@@ -43,7 +43,7 @@ @@ -43,7 +43,7 @@
43 android:layout_height="wrap_content" 43 android:layout_height="wrap_content"
44 android:gravity="center" 44 android:gravity="center"
45 android:text="配乐" 45 android:text="配乐"
46 - android:textColor="@color/colorAccent" 46 + android:textColor="@color/ffcc00"
47 android:textSize="14sp" /> 47 android:textSize="14sp" />
48 48
49 <android.support.v7.widget.AppCompatSeekBar 49 <android.support.v7.widget.AppCompatSeekBar
@@ -65,7 +65,7 @@ @@ -65,7 +65,7 @@
65 android:layout_height="wrap_content" 65 android:layout_height="wrap_content"
66 android:gravity="center" 66 android:gravity="center"
67 android:text="原音变声" 67 android:text="原音变声"
68 - android:textColor="@color/colorAccent" 68 + android:textColor="@color/ffcc00"
69 android:textSize="14sp" /> 69 android:textSize="14sp" />
70 70
71 <android.support.v7.widget.AppCompatSpinner 71 <android.support.v7.widget.AppCompatSpinner
@@ -90,7 +90,7 @@ @@ -90,7 +90,7 @@
90 android:layout_height="wrap_content" 90 android:layout_height="wrap_content"
91 android:gravity="center" 91 android:gravity="center"
92 android:text="原音混响" 92 android:text="原音混响"
93 - android:textColor="@color/colorAccent" 93 + android:textColor="@color/ffcc00"
94 android:textSize="14sp" /> 94 android:textSize="14sp" />
95 95
96 <android.support.v7.widget.AppCompatSpinner 96 <android.support.v7.widget.AppCompatSpinner
app/src/main/res/layout/fragment_my_video.xml
1 -<layout xmlns:android="http://schemas.android.com/apk/res/android"> 1 +<layout xmlns:android="http://schemas.android.com/apk/res/android"
  2 + xmlns:app="http://schemas.android.com/apk/res-auto">
  3 +
  4 + <data>
  5 +
  6 + <import type="com.cnlive.gundam.main.ui.adapter.DataBindingAdapter" />
  7 +
  8 + <import type="android.support.v7.widget.LinearLayoutManager" />
  9 +
  10 + <variable
  11 + name="layoutManager"
  12 + type="LinearLayoutManager" />
  13 +
  14 + <variable
  15 + name="listAdapter"
  16 + type="DataBindingAdapter" />
  17 + </data>
  18 +
2 <RelativeLayout 19 <RelativeLayout
3 android:layout_width="match_parent" 20 android:layout_width="match_parent"
4 android:layout_height="match_parent"> 21 android:layout_height="match_parent">
5 22
  23 + <android.support.v4.widget.SwipeRefreshLayout
  24 + android:id="@+id/contentView"
  25 + android:layout_width="match_parent"
  26 + android:layout_height="match_parent">
  27 +
6 <LinearLayout 28 <LinearLayout
7 android:layout_width="match_parent" 29 android:layout_width="match_parent"
8 android:layout_height="wrap_content" 30 android:layout_height="wrap_content"
@@ -14,7 +36,15 @@ @@ -14,7 +36,15 @@
14 36
15 <include layout="@layout/user_divider_head_line" /> 37 <include layout="@layout/user_divider_head_line" />
16 38
  39 + <android.support.v7.widget.RecyclerView
  40 + android:id="@+id/recycler_view"
  41 + android:layout_width="match_parent"
  42 + android:layout_height="match_parent"
  43 + app:adapter="@{listAdapter}"
  44 + app:layoutManager="@{layoutManager}" />
  45 +
17 </LinearLayout> 46 </LinearLayout>
  47 + </android.support.v4.widget.SwipeRefreshLayout>
18 </RelativeLayout> 48 </RelativeLayout>
19 49
20 50
app/src/main/res/layout/layout_item_short_video.xml 0 → 100644
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<layout xmlns:android="http://schemas.android.com/apk/res/android"
  3 + xmlns:app="http://schemas.android.com/apk/res-auto">
  4 +
  5 + <data>
  6 +
  7 + <import type="com.cnlive.gundam.shortvideo.model.ShortVideoInfo" />
  8 +
  9 + <import type="android.view.View" />
  10 +
  11 + <import type="com.cnlive.gundam.main.ui.adapter.DataBindingAdapter.OnAdapterViewClickListener" />
  12 +
  13 + <variable
  14 + name="shortVideoInfo"
  15 + type="ShortVideoInfo" />
  16 +
  17 + <variable
  18 + name="viewClickListner"
  19 + type="OnAdapterViewClickListener&lt;ShortVideoInfo>" />
  20 + </data>
  21 +
  22 + <LinearLayout
  23 + android:id="@+id/item_short_video"
  24 + android:layout_width="match_parent"
  25 + android:layout_height="wrap_content"
  26 +
  27 + android:onClick="@{(view)->viewClickListner.onViewClick(view, shortVideoInfo)}"
  28 + android:orientation="vertical">
  29 +
  30 + <LinearLayout
  31 + android:layout_width="match_parent"
  32 + android:layout_height="wrap_content"
  33 + android:orientation="horizontal">
  34 +
  35 + <ImageView
  36 + android:id="@+id/cover_image"
  37 + android:layout_width="90dp"
  38 + android:layout_height="90dp"
  39 + android:src="@drawable/default_pic" />
  40 +
  41 + <LinearLayout
  42 + android:layout_width="match_parent"
  43 + android:layout_height="90dp"
  44 + android:layout_marginLeft="10dp"
  45 + android:gravity="center_vertical"
  46 + android:orientation="vertical">
  47 +
  48 + <TextView
  49 + android:id="@+id/video_name"
  50 + android:layout_width="wrap_content"
  51 + android:layout_height="wrap_content"
  52 + android:text="@{shortVideoInfo.name}"
  53 + android:textColor="@color/black"
  54 + android:textSize="18sp" />
  55 +
  56 + <TextView
  57 + android:id="@+id/video_time"
  58 + android:layout_width="wrap_content"
  59 + android:layout_height="wrap_content"
  60 + android:layout_marginLeft="10dp"
  61 + android:layout_marginTop="10dp"
  62 + android:text="@{shortVideoInfo.createTime}"
  63 + android:textSize="14sp" />
  64 +
  65 + <TextView
  66 + android:id="@+id/video_description"
  67 + android:layout_width="wrap_content"
  68 + android:layout_height="wrap_content"
  69 + android:layout_marginLeft="10dp"
  70 + android:layout_marginTop="3dp"
  71 + android:text="@{shortVideoInfo.description}"
  72 + android:textSize="14sp" />
  73 +
  74 + </LinearLayout>
  75 +
  76 + </LinearLayout>
  77 +
  78 + <View
  79 + android:layout_width="match_parent"
  80 + android:layout_height="1dp"
  81 + android:background="@color/gray_line_color" />
  82 +
  83 + </LinearLayout>
  84 +</layout>
0 \ No newline at end of file 85 \ No newline at end of file
app/src/main/res/layout/layout_record_params_dialog.xml
1 <?xml version="1.0" encoding="utf-8"?> 1 <?xml version="1.0" encoding="utf-8"?>
2 -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
3 - android:layout_width="wrap_content"  
4 - android:layout_height="wrap_content" 2 +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3 + android:layout_width="match_parent"
  4 + android:layout_height="match_parent"
5 android:background="@android:color/white" 5 android:background="@android:color/white"
6 android:orientation="vertical"> 6 android:orientation="vertical">
7 7
8 - <TextView  
9 - android:id="@+id/config_title"  
10 - android:layout_width="wrap_content"  
11 - android:layout_height="wrap_content"  
12 - android:layout_gravity="center"  
13 - android:textSize="20dp" />  
14 -  
15 - <RadioGroup  
16 - android:id="@+id/resolution_group" 8 + <LinearLayout
17 android:layout_width="wrap_content" 9 android:layout_width="wrap_content"
18 android:layout_height="wrap_content" 10 android:layout_height="wrap_content"
19 - android:layout_marginTop="10dp"  
20 - android:orientation="horizontal"> 11 + android:layout_centerInParent="true"
  12 + android:orientation="vertical">
21 13
22 - <RadioButton  
23 - android:id="@+id/r360p" 14 + <TextView
  15 + android:id="@+id/config_title"
24 android:layout_width="wrap_content" 16 android:layout_width="wrap_content"
25 android:layout_height="wrap_content" 17 android:layout_height="wrap_content"
26 - android:text="360P" /> 18 + android:layout_gravity="center"
  19 + android:textColor="#ffcc00"
  20 + android:textSize="20dp" />
27 21
28 - <RadioButton  
29 - android:id="@+id/r480p" 22 + <RadioGroup
  23 + android:id="@+id/resolution_group"
30 android:layout_width="wrap_content" 24 android:layout_width="wrap_content"
31 android:layout_height="wrap_content" 25 android:layout_height="wrap_content"
32 - android:checked="true"  
33 - android:text="480P" /> 26 + android:layout_marginTop="10dp"
  27 + android:orientation="horizontal">
34 28
35 - <RadioButton  
36 - android:id="@+id/r540p"  
37 - android:layout_width="wrap_content"  
38 - android:layout_height="wrap_content"  
39 - android:checked="false"  
40 - android:text="540P" /> 29 + <RadioButton
  30 + android:id="@+id/r360p"
  31 + android:layout_width="wrap_content"
  32 + android:layout_height="wrap_content"
  33 + android:background="@drawable/radiobutton_selector"
  34 + android:button="@null"
  35 + android:padding="10dp"
  36 + android:text="360P"
  37 + android:textColor="@drawable/text_color_selector" />
41 38
42 - <RadioButton  
43 - android:id="@+id/r720p"  
44 - android:layout_width="wrap_content"  
45 - android:layout_height="wrap_content"  
46 - android:checked="false"  
47 - android:text="720P" />  
48 - </RadioGroup> 39 + <RadioButton
  40 + android:id="@+id/r480p"
  41 + android:layout_width="wrap_content"
  42 + android:layout_height="wrap_content"
  43 + android:background="@drawable/radiobutton_selector"
  44 + android:button="@null"
  45 + android:checked="true"
  46 + android:padding="10dp"
  47 + android:text="480P"
  48 + android:textColor="@drawable/text_color_selector" />
49 49
50 - <RadioGroup  
51 - android:id="@+id/encode_type"  
52 - android:layout_width="wrap_content"  
53 - android:layout_height="wrap_content"  
54 - android:layout_below="@id/resolution_group"  
55 - android:layout_marginTop="5dp"  
56 - android:orientation="horizontal"> 50 + <RadioButton
  51 + android:id="@+id/r540p"
  52 + android:layout_width="wrap_content"
  53 + android:layout_height="wrap_content"
  54 + android:background="@drawable/radiobutton_selector"
  55 + android:button="@null"
  56 + android:checked="false"
  57 + android:padding="10dp"
  58 + android:text="540P"
  59 + android:textColor="@drawable/text_color_selector" />
57 60
58 - <RadioButton  
59 - android:id="@+id/encode_h264"  
60 - android:layout_width="wrap_content"  
61 - android:layout_height="wrap_content"  
62 - android:checked="true"  
63 - android:text="H264" /> 61 + <RadioButton
  62 + android:id="@+id/r720p"
  63 + android:layout_width="wrap_content"
  64 + android:layout_height="wrap_content"
  65 + android:background="@drawable/radiobutton_selector"
  66 + android:button="@null"
  67 + android:checked="false"
  68 + android:padding="10dp"
  69 + android:text="720P"
  70 + android:textColor="@drawable/text_color_selector" />
  71 + </RadioGroup>
64 72
65 - <RadioButton  
66 - android:id="@+id/encode_h265" 73 + <RadioGroup
  74 + android:id="@+id/encode_type"
67 android:layout_width="wrap_content" 75 android:layout_width="wrap_content"
68 android:layout_height="wrap_content" 76 android:layout_height="wrap_content"
69 - android:checked="false"  
70 - android:text="H265" />  
71 - </RadioGroup> 77 + android:layout_below="@id/resolution_group"
  78 + android:layout_marginTop="5dp"
  79 + android:orientation="horizontal">
72 80
73 - <RadioGroup  
74 - android:id="@+id/encode_group"  
75 - android:layout_width="wrap_content"  
76 - android:layout_height="wrap_content"  
77 - android:layout_below="@id/encode_type"  
78 - android:layout_marginTop="5dp"  
79 - android:orientation="horizontal"> 81 + <RadioButton
  82 + android:id="@+id/encode_h264"
  83 + android:layout_width="wrap_content"
  84 + android:layout_height="wrap_content"
  85 + android:background="@drawable/radiobutton_selector"
  86 + android:button="@null"
  87 + android:checked="true"
  88 + android:padding="10dp"
  89 + android:text="H264"
  90 + android:textColor="@drawable/text_color_selector" />
80 91
81 - <RadioButton  
82 - android:id="@+id/encode_hw"  
83 - android:layout_width="wrap_content"  
84 - android:layout_height="wrap_content"  
85 - android:checked="false"  
86 - android:text="硬编" /> 92 + <RadioButton
  93 + android:id="@+id/encode_h265"
  94 + android:layout_width="wrap_content"
  95 + android:layout_height="wrap_content"
  96 + android:background="@drawable/radiobutton_selector"
  97 + android:button="@null"
  98 + android:checked="false"
  99 + android:padding="10dp"
  100 + android:text="H265"
  101 + android:textColor="@drawable/text_color_selector" />
  102 + </RadioGroup>
87 103
88 - <RadioButton  
89 - android:id="@+id/encode_sw" 104 + <RadioGroup
  105 + android:id="@+id/encode_group"
90 android:layout_width="wrap_content" 106 android:layout_width="wrap_content"
91 android:layout_height="wrap_content" 107 android:layout_height="wrap_content"
92 - android:checked="true"  
93 - android:text="软编" />  
94 - </RadioGroup> 108 + android:layout_below="@id/encode_type"
  109 + android:layout_marginTop="5dp"
  110 + android:orientation="horizontal">
95 111
96 - <RadioGroup  
97 - android:id="@+id/encode_profile"  
98 - android:layout_width="wrap_content"  
99 - android:layout_height="wrap_content"  
100 - android:layout_below="@id/encode_group"  
101 - android:layout_marginTop="5dp"  
102 - android:orientation="horizontal"> 112 + <RadioButton
  113 + android:id="@+id/encode_hw"
  114 + android:layout_width="wrap_content"
  115 + android:layout_height="wrap_content"
  116 + android:background="@drawable/radiobutton_selector"
  117 + android:button="@null"
  118 + android:checked="false"
  119 + android:padding="10dp"
  120 + android:text="硬编"
  121 + android:textColor="@drawable/text_color_selector" />
103 122
104 - <RadioButton  
105 - android:id="@+id/encode_profile_low_power"  
106 - android:layout_width="wrap_content"  
107 - android:layout_height="wrap_content"  
108 - android:checked="false"  
109 - android:text="低功耗" /> 123 + <RadioButton
  124 + android:id="@+id/encode_sw"
  125 + android:layout_width="wrap_content"
  126 + android:layout_height="wrap_content"
  127 + android:background="@drawable/radiobutton_selector"
  128 + android:button="@null"
  129 + android:checked="true"
  130 + android:padding="10dp"
  131 + android:text="软编"
  132 + android:textColor="@drawable/text_color_selector" />
  133 + </RadioGroup>
110 134
111 - <RadioButton  
112 - android:id="@+id/encode_profile_balance" 135 + <RadioGroup
  136 + android:id="@+id/encode_profile"
113 android:layout_width="wrap_content" 137 android:layout_width="wrap_content"
114 android:layout_height="wrap_content" 138 android:layout_height="wrap_content"
115 - android:checked="true"  
116 - android:text="平衡" /> 139 + android:layout_below="@id/encode_group"
  140 + android:layout_marginTop="5dp"
  141 + android:orientation="horizontal">
117 142
118 - <RadioButton  
119 - android:id="@+id/encode_profile_high_perf"  
120 - android:layout_width="wrap_content"  
121 - android:layout_height="wrap_content"  
122 - android:checked="false"  
123 - android:text="高性能" />  
124 - </RadioGroup> 143 + <RadioButton
  144 + android:id="@+id/encode_profile_low_power"
  145 + android:layout_width="wrap_content"
  146 + android:layout_height="wrap_content"
  147 + android:background="@drawable/radiobutton_selector"
  148 + android:button="@null"
  149 + android:checked="false"
  150 + android:padding="10dp"
  151 + android:text="低功耗"
  152 + android:textColor="@drawable/text_color_selector" />
125 153
126 - <LinearLayout  
127 - android:id="@+id/frameRate"  
128 - android:layout_width="match_parent"  
129 - android:layout_height="wrap_content"  
130 - android:layout_below="@id/encode_group"> 154 + <RadioButton
  155 + android:id="@+id/encode_profile_balance"
  156 + android:layout_width="wrap_content"
  157 + android:layout_height="wrap_content"
  158 + android:background="@drawable/radiobutton_selector"
  159 + android:button="@null"
  160 + android:checked="true"
  161 + android:padding="10dp"
  162 + android:text="平衡"
  163 + android:textColor="@drawable/text_color_selector" />
131 164
132 - <TextView  
133 - android:layout_width="wrap_content"  
134 - android:layout_height="wrap_content"  
135 - android:text="采集帧率"  
136 - android:textSize="16sp" /> 165 + <RadioButton
  166 + android:id="@+id/encode_profile_high_perf"
  167 + android:layout_width="wrap_content"
  168 + android:layout_height="wrap_content"
  169 + android:background="@drawable/radiobutton_selector"
  170 + android:button="@null"
  171 + android:checked="false"
  172 + android:padding="10dp"
  173 + android:text="高性能"
  174 + android:textColor="@drawable/text_color_selector" />
  175 + </RadioGroup>
137 176
138 - <EditText  
139 - android:id="@+id/frameRatePicker"  
140 - android:layout_width="wrap_content" 177 + <LinearLayout
  178 + android:id="@+id/frameRate"
  179 + android:layout_width="match_parent"
141 android:layout_height="wrap_content" 180 android:layout_height="wrap_content"
142 - android:text="20" />  
143 - </LinearLayout> 181 + android:layout_below="@id/encode_group"
  182 + android:layout_marginTop="10dp">
144 183
145 - <LinearLayout  
146 - android:id="@+id/videoBitrate"  
147 - android:layout_width="match_parent"  
148 - android:layout_height="wrap_content"  
149 - android:layout_below="@id/frameRate"  
150 - android:orientation="horizontal"> 184 + <TextView
  185 + android:layout_width="wrap_content"
  186 + android:layout_height="wrap_content"
  187 + android:text="采集帧率"
  188 + android:textColor="@color/black"
  189 + android:textSize="16sp" />
151 190
152 - <TextView  
153 - android:layout_width="wrap_content"  
154 - android:layout_height="wrap_content"  
155 - android:text="视频码率"  
156 - android:textSize="16sp" /> 191 + <EditText
  192 + android:id="@+id/frameRatePicker"
  193 + android:layout_width="wrap_content"
  194 + android:layout_height="wrap_content"
  195 + android:layout_marginLeft="5dp"
  196 + android:background="@drawable/edittext_background"
  197 + android:paddingBottom="5dp"
  198 + android:paddingLeft="10dp"
  199 + android:paddingRight="10dp"
  200 + android:paddingTop="5dp"
  201 + android:text="20"
  202 + android:textColor="#ffcc00"
  203 + android:textCursorDrawable="@drawable/edit_cursor_color" />
  204 + </LinearLayout>
157 205
158 - <EditText  
159 - android:id="@+id/videoBitratePicker"  
160 - android:layout_width="wrap_content" 206 + <LinearLayout
  207 + android:id="@+id/videoBitrate"
  208 + android:layout_width="match_parent"
161 android:layout_height="wrap_content" 209 android:layout_height="wrap_content"
162 - android:text="1000" />  
163 - </LinearLayout> 210 + android:layout_below="@id/frameRate"
  211 + android:layout_marginTop="10dp"
  212 + android:orientation="horizontal">
164 213
165 - <LinearLayout  
166 - android:id="@+id/audioBitrate"  
167 - android:layout_width="match_parent"  
168 - android:layout_height="wrap_content"  
169 - android:layout_below="@id/videoBitrate"  
170 - android:orientation="horizontal"> 214 + <TextView
  215 + android:layout_width="wrap_content"
  216 + android:layout_height="wrap_content"
  217 + android:text="视频码率"
  218 + android:textColor="@color/black"
  219 + android:textSize="16sp" />
171 220
172 - <TextView  
173 - android:layout_width="wrap_content"  
174 - android:layout_height="wrap_content"  
175 - android:text="音频码率"  
176 - android:textSize="16sp" /> 221 + <EditText
  222 + android:id="@+id/videoBitratePicker"
  223 + android:layout_width="wrap_content"
  224 + android:layout_height="wrap_content"
  225 + android:layout_marginLeft="5dp"
  226 + android:background="@drawable/edittext_background"
  227 + android:paddingBottom="5dp"
  228 + android:paddingLeft="10dp"
  229 + android:paddingRight="10dp"
  230 + android:paddingTop="5dp"
  231 + android:text="1000"
  232 + android:textColor="#ffcc00"
  233 + android:textCursorDrawable="@drawable/edit_cursor_color" />
  234 + </LinearLayout>
177 235
178 - <EditText  
179 - android:id="@+id/audioBitratePicker"  
180 - android:layout_width="wrap_content" 236 + <LinearLayout
  237 + android:id="@+id/audioBitrate"
  238 + android:layout_width="match_parent"
181 android:layout_height="wrap_content" 239 android:layout_height="wrap_content"
182 - android:text="64" />  
183 - </LinearLayout> 240 + android:layout_below="@id/videoBitrate"
  241 + android:layout_marginTop="10dp"
  242 + android:orientation="horizontal">
  243 +
  244 + <TextView
  245 + android:layout_width="wrap_content"
  246 + android:layout_height="wrap_content"
  247 + android:text="音频码率"
  248 + android:textColor="@color/black"
  249 + android:textSize="16sp" />
184 250
  251 + <EditText
  252 + android:id="@+id/audioBitratePicker"
  253 + android:layout_width="wrap_content"
  254 + android:layout_height="wrap_content"
  255 + android:layout_marginLeft="5dp"
  256 + android:background="@drawable/edittext_background"
  257 + android:paddingBottom="5dp"
  258 + android:paddingLeft="10dp"
  259 + android:paddingRight="10dp"
  260 + android:paddingTop="5dp"
  261 + android:text="64"
  262 + android:textColor="#ffcc00"
  263 + android:textCursorDrawable="@drawable/edit_cursor_color" />
  264 + </LinearLayout>
185 265
186 - <Button  
187 - android:id="@+id/preview_params_confim"  
188 - android:layout_width="100dp"  
189 - android:layout_height="50dp"  
190 - android:layout_gravity="center"  
191 - android:text="确定" />  
192 -</LinearLayout>  
193 \ No newline at end of file 266 \ No newline at end of file
  267 +
  268 + <Button
  269 + android:id="@+id/preview_params_confim"
  270 + android:layout_width="match_parent"
  271 + android:layout_height="50dp"
  272 + android:layout_gravity="center"
  273 + android:layout_marginTop="10dp"
  274 + android:background="#ffcc00"
  275 + android:text="确定"
  276 + android:textColor="#ffffff" />
  277 +
  278 + </LinearLayout>
  279 +</RelativeLayout>
194 \ No newline at end of file 280 \ No newline at end of file
app/src/main/res/layout/short_video_beauty_choose.xml
@@ -21,7 +21,7 @@ @@ -21,7 +21,7 @@
21 android:layout_height="wrap_content" 21 android:layout_height="wrap_content"
22 android:layout_gravity="center" 22 android:layout_gravity="center"
23 android:text="美颜类型:" 23 android:text="美颜类型:"
24 - android:textColor="@color/colorAccent" 24 + android:textColor="@color/ffcc00"
25 android:textSize="16sp" /> 25 android:textSize="16sp" />
26 26
27 <android.support.v7.widget.AppCompatSpinner 27 <android.support.v7.widget.AppCompatSpinner
@@ -48,7 +48,7 @@ @@ -48,7 +48,7 @@
48 android:layout_height="wrap_content" 48 android:layout_height="wrap_content"
49 android:gravity="center" 49 android:gravity="center"
50 android:text="磨皮" 50 android:text="磨皮"
51 - android:textColor="@color/colorAccent" 51 + android:textColor="@color/ffcc00"
52 android:textSize="14sp" /> 52 android:textSize="14sp" />
53 53
54 <android.support.v7.widget.AppCompatSeekBar 54 <android.support.v7.widget.AppCompatSeekBar
@@ -72,7 +72,7 @@ @@ -72,7 +72,7 @@
72 android:layout_height="wrap_content" 72 android:layout_height="wrap_content"
73 android:gravity="center" 73 android:gravity="center"
74 android:text="美白" 74 android:text="美白"
75 - android:textColor="@color/colorAccent" 75 + android:textColor="@color/ffcc00"
76 android:textSize="14sp" /> 76 android:textSize="14sp" />
77 77
78 <android.support.v7.widget.AppCompatSeekBar 78 <android.support.v7.widget.AppCompatSeekBar
@@ -97,7 +97,7 @@ @@ -97,7 +97,7 @@
97 android:layout_height="wrap_content" 97 android:layout_height="wrap_content"
98 android:gravity="center" 98 android:gravity="center"
99 android:text="红润" 99 android:text="红润"
100 - android:textColor="@color/colorAccent" 100 + android:textColor="@color/ffcc00"
101 android:textSize="14sp" /> 101 android:textSize="14sp" />
102 102
103 <android.support.v7.widget.AppCompatSeekBar 103 <android.support.v7.widget.AppCompatSeekBar
app/src/main/res/layout/short_video_bgm_item_layout.xml
@@ -150,7 +150,7 @@ @@ -150,7 +150,7 @@
150 android:layout_gravity="center" 150 android:layout_gravity="center"
151 android:layout_marginLeft="50dp" 151 android:layout_marginLeft="50dp"
152 android:text="0" 152 android:text="0"
153 - android:textColor="@color/colorAccent" 153 + android:textColor="@color/ffcc00"
154 android:textSize="16sp" /> 154 android:textSize="16sp" />
155 155
156 <ImageView 156 <ImageView
app/src/main/res/layout/short_video_sticker_choose.xml
@@ -21,7 +21,7 @@ @@ -21,7 +21,7 @@
21 android:layout_height="wrap_content" 21 android:layout_height="wrap_content"
22 android:layout_gravity="center" 22 android:layout_gravity="center"
23 android:text="贴纸类型:" 23 android:text="贴纸类型:"
24 - android:textColor="@color/colorAccent" 24 + android:textColor="@color/ffcc00"
25 android:textSize="16sp" /> 25 android:textSize="16sp" />
26 26
27 <android.support.v7.widget.AppCompatSpinner 27 <android.support.v7.widget.AppCompatSpinner
app/src/main/res/layout/spinner_checked_layout.xml 0 → 100644
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
  3 + android:id="@android:id/text1"
  4 + android:layout_width="match_parent"
  5 + android:layout_height="40dp"
  6 + android:gravity="center_vertical"
  7 + android:singleLine="true"
  8 + android:textColor="@color/ffcc00"
  9 + android:textSize="16sp">
  10 +
  11 +</CheckedTextView>
0 \ No newline at end of file 12 \ No newline at end of file
app/src/main/res/layout/spinner_item_layout.xml 0 → 100644
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<layout xmlns:android="http://schemas.android.com/apk/res/android">
  3 +
  4 + <LinearLayout
  5 + android:layout_width="match_parent"
  6 + android:layout_height="match_parent"
  7 + android:orientation="vertical"
  8 + android:padding="10dp">
  9 +
  10 + <TextView
  11 + android:id="@+id/spinner_item_label"
  12 + android:layout_width="wrap_content"
  13 + android:layout_height="wrap_content"
  14 + android:layout_gravity="center"
  15 + android:gravity="center"
  16 + android:textSize="16sp" />
  17 +
  18 + </LinearLayout>
  19 +</layout>
0 \ No newline at end of file 20 \ No newline at end of file
app/src/main/res/layout/toolbar_my_video.xml
@@ -24,7 +24,8 @@ @@ -24,7 +24,8 @@
24 android:singleLine="true" 24 android:singleLine="true"
25 android:text="there is a title" 25 android:text="there is a title"
26 android:textColor="@color/black" 26 android:textColor="@color/black"
27 - android:textSize="20sp" /> 27 + android:textSize="20sp"
  28 + android:onClick="onClick"/>
28 29
29 <ImageView 30 <ImageView
30 android:id="@+id/record" 31 android:id="@+id/record"
app/src/main/res/layout/upload_video_dialog.xml 0 → 100644
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3 + android:layout_width="match_parent"
  4 + android:layout_height="wrap_content"
  5 + android:orientation="vertical">
  6 +
  7 + <TextView
  8 + android:layout_width="wrap_content"
  9 + android:layout_height="wrap_content"
  10 + android:layout_gravity="center_horizontal"
  11 + android:layout_marginTop="10dp"
  12 + android:text="录入视频信息"
  13 + android:textColor="#ffcc00"
  14 + android:textSize="22sp" />
  15 +
  16 + <ImageView
  17 + android:id="@+id/cover_img"
  18 + android:layout_width="90dp"
  19 + android:layout_height="120dp"
  20 + android:layout_gravity="center_horizontal"
  21 + android:layout_marginTop="10dp" />
  22 +
  23 + <LinearLayout
  24 + android:layout_width="match_parent"
  25 + android:layout_height="wrap_content"
  26 + android:layout_marginTop="10dp"
  27 + android:orientation="horizontal"
  28 + android:padding="10dp">
  29 +
  30 + <TextView
  31 + android:id="@+id/video_title"
  32 + android:layout_width="wrap_content"
  33 + android:layout_height="wrap_content"
  34 + android:text="标题"
  35 + android:textColor="@color/black"
  36 + android:textSize="14sp" />
  37 +
  38 + <EditText
  39 + android:id="@+id/video_title_edit"
  40 + android:layout_width="match_parent"
  41 + android:layout_height="wrap_content"
  42 + android:layout_marginLeft="5dp"
  43 + android:background="@drawable/edittext_background"
  44 + android:hint="视频标题"
  45 + android:padding="5dp" />
  46 + </LinearLayout>
  47 +
  48 + <LinearLayout
  49 + android:layout_width="match_parent"
  50 + android:layout_height="wrap_content"
  51 + android:orientation="horizontal"
  52 + android:padding="10dp">
  53 +
  54 + <TextView
  55 + android:id="@+id/video_des"
  56 + android:layout_width="wrap_content"
  57 + android:layout_height="wrap_content"
  58 + android:text="描述"
  59 + android:textColor="@color/black"
  60 + android:textSize="14sp" />
  61 +
  62 + <EditText
  63 + android:id="@+id/video_des_edit"
  64 + android:layout_width="match_parent"
  65 + android:layout_height="wrap_content"
  66 + android:layout_marginLeft="5dp"
  67 + android:background="@drawable/edittext_background"
  68 + android:hint="视频描述"
  69 + android:padding="5dp" />
  70 + </LinearLayout>
  71 +
  72 + <LinearLayout
  73 + android:layout_width="match_parent"
  74 + android:layout_height="wrap_content"
  75 + android:layout_marginTop="15dp"
  76 + android:orientation="horizontal">
  77 +
  78 + <Button
  79 + android:id="@+id/cancel_btn"
  80 + android:layout_width="0dp"
  81 + android:layout_height="wrap_content"
  82 + android:layout_weight="1"
  83 + android:background="@drawable/edittext_background"
  84 + android:text="取消"
  85 + android:textColor="#ffcc00"
  86 + android:textSize="16sp" />
  87 +
  88 + <Button
  89 + android:id="@+id/config_btn"
  90 + android:layout_width="0dp"
  91 + android:layout_height="wrap_content"
  92 + android:layout_weight="1"
  93 + android:background="#ffcc00"
  94 + android:text="上传"
  95 + android:textColor="@color/text_white_color"
  96 + android:textSize="16sp" />
  97 + </LinearLayout>
  98 +</LinearLayout>
0 \ No newline at end of file 99 \ No newline at end of file
app/src/main/res/values/colors.xml
@@ -16,7 +16,7 @@ @@ -16,7 +16,7 @@
16 16
17 <color name="transparent">#00000000</color> 17 <color name="transparent">#00000000</color>
18 <color name="transparent1">#7fffffff</color><!--透明白色 --> 18 <color name="transparent1">#7fffffff</color><!--透明白色 -->
19 - <color name="transparent2">#616060</color><!--透明白色 --> 19 + <color name="transparent2">#7f616060</color><!--透明白色 -->
20 <color name="record_progress_black">#2c2c2c</color> 20 <color name="record_progress_black">#2c2c2c</color>
21 <color name="record_progress_bg">#2c2c2c</color> 21 <color name="record_progress_bg">#2c2c2c</color>
22 <color name="record_progress_blue">#368ca8</color> 22 <color name="record_progress_blue">#368ca8</color>
@@ -24,4 +24,5 @@ @@ -24,4 +24,5 @@
24 <color name="record_progress_red">#e85932</color> 24 <color name="record_progress_red">#e85932</color>
25 <color name="record_title_bg_default">#919191</color> 25 <color name="record_title_bg_default">#919191</color>
26 <color name="record_title_bg_selected">#616060</color> 26 <color name="record_title_bg_selected">#616060</color>
  27 + <color name="ffcc00">#ffcc00</color>
27 </resources> 28 </resources>
app/src/main/res/values/styles.xml
@@ -20,4 +20,14 @@ @@ -20,4 +20,14 @@
20 <item name="android:windowBackground">@color/transparent</item><!--背景透明--> 20 <item name="android:windowBackground">@color/transparent</item><!--背景透明-->
21 <item name="android:backgroundDimEnabled">false</item><!--模糊--> 21 <item name="android:backgroundDimEnabled">false</item><!--模糊-->
22 </style> 22 </style>
  23 +
  24 + <style name="RecordParamsDialog" parent="@android:style/Theme.DeviceDefault.Dialog">
  25 + <item name="android:windowFrame">@null</item><!--边框-->
  26 + <item name="android:windowIsFloating">true</item><!--是否浮现在activity之上-->
  27 + <item name="android:windowIsTranslucent">true</item><!--半透明-->
  28 + <item name="android:windowNoTitle">true</item><!--无标题-->
  29 + <item name="android:windowFullscreen">true</item>
  30 + <item name="android:windowBackground">@color/transparent</item><!--背景透明-->
  31 + <item name="android:backgroundDimEnabled">false</item><!--模糊-->
  32 + </style>
23 </resources> 33 </resources>