diff --git a/ReleaseNotes/release-notes-3.2.0.md b/ReleaseNotes/release-notes-3.2.0.md new file mode 100644 index 0000000..423ec7d --- /dev/null +++ b/ReleaseNotes/release-notes-3.2.0.md @@ -0,0 +1,39 @@ +# PLDroidShortVideo Release Notes for 3.2.0 + +### 简介 + +PLDroidShortVideo 是七牛推出的一款适用于 Android 平台的短视频 SDK,提供了包括美颜、滤镜、水印、断点录制、分段回删、视频编辑、混音特效、本地/云端存储在内的多种功能,支持高度定制以及二次开发。 + +### 版本 + +* 发布 pldroid-shortvideo-3.2.0.jar +* 更新 libpldroid\_shortvideo_core.so + +### 功能 + +* 图片合成新增预览及多个转场功能 +* 新增屏幕录制帧率设置 +* 视频拼接功能支持缩放模式设置 + +### 缺陷 +* 修复快速剪辑后的视频文件信息异常的问题 +* 修复在某些机型上会偶现混音卡住的问题 +* 修复转码偶现的空指针异常的问题 +* 修复某些机型极慢速录制时偶现的花屏问题 + +### 注意事项 + +* 从 v3.1.0 版本开始,需要在 Application 中初始化 sdk: + +```java +PLShortVideoEnv.init(getApplicationContext()); +``` + +* 七牛短视频 SDK 自 v3.0.0 版本起, 划分为精简版、基础版、进阶版、专业版。不同版本 SDK 可以使用的功能点数量有差别,请按照购买的 License 版本使用对应的短视频 SDK 版本。 +* 上传 SDK 的依赖需要更新到如下版本: + +```java +compile 'com.qiniu:qiniu-android-sdk:7.6.4' +``` + + diff --git a/ShortVideoFunctionDemo/app/build.gradle b/ShortVideoFunctionDemo/app/build.gradle index 05e93f0..9c9c4c0 100644 --- a/ShortVideoFunctionDemo/app/build.gradle +++ b/ShortVideoFunctionDemo/app/build.gradle @@ -14,8 +14,8 @@ android { applicationId "com.qiniu.pili.droid.shortvideo.demo" minSdkVersion 18 targetSdkVersion 26 - versionCode 29 - versionName "3.1.1" + versionCode 31 + versionName "3.2.0" multiDexEnabled true vectorDrawables.useSupportLibrary = true buildConfigField "long", "BUILD_TIMESTAMP", System.currentTimeMillis() + "L" @@ -29,23 +29,37 @@ android { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } + lintOptions { + abortOnError false + } } dependencies { - implementation 'com.qiniu:qiniu-android-sdk:7.3.11' - implementation files('libs/pldroid-shortvideo-3.1.1.jar') + // 上传 sdk ,不使用上传功能无需依赖 + implementation 'com.qiniu:qiniu-android-sdk:7.6.4' + // 播放器 sdk ,非必须 implementation files('libs/pldroid-player-2.1.8.jar') + // 如果接入 EasyAR 则需要依赖 implementation files('libs/EasyAR.jar') implementation files('libs/EasyAR3D.jar') - - implementation 'com.android.support:multidex:1.0.3' + // UI 控件库,非必须 + implementation 'androidx.multidex:multidex:2.0.1' implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.7' - implementation 'com.android.support:recyclerview-v7:28.0.0' - implementation 'com.android.support:appcompat-v7:28.0.0' - implementation 'com.android.support:design:28.0.0' - implementation 'com.android.support.constraint:constraint-layout:1.1.3' - - implementation files('libs/universal-image-loader-1.9.4.jar') + implementation 'androidx.recyclerview:recyclerview:1.1.0' + implementation 'androidx.appcompat:appcompat:1.2.0' + implementation 'com.google.android.material:material:1.2.1' + implementation 'androidx.constraintlayout:constraintlayout:2.0.2' implementation 'com.h6ah4i.android.widget.advrecyclerview:advrecyclerview:0.10.6' + // 图片加载库,非必须 + implementation files('libs/universal-image-loader-1.9.4.jar') implementation 'com.github.bumptech.glide:glide:4.9.0' -} \ No newline at end of file + // 为了规避单个 DEX 64K 方法数上限,非必须 + implementation 'androidx.multidex:multidex:2.0.1' + + if (buildWithShortVideoLibrary) { + implementation project(':library') + } else { + // 短视频 SDK jar 包,必须依赖 + implementation files('libs/pldroid-shortvideo-3.2.0.jar') + } +} diff --git a/ShortVideoFunctionDemo/app/libs/pldroid-shortvideo-3.1.1.jar b/ShortVideoFunctionDemo/app/libs/pldroid-shortvideo-3.1.1.jar deleted file mode 100644 index e67b1a4..0000000 Binary files a/ShortVideoFunctionDemo/app/libs/pldroid-shortvideo-3.1.1.jar and /dev/null differ diff --git a/ShortVideoFunctionDemo/app/libs/pldroid-shortvideo-3.2.0.jar b/ShortVideoFunctionDemo/app/libs/pldroid-shortvideo-3.2.0.jar new file mode 100644 index 0000000..6fbc63d Binary files /dev/null and b/ShortVideoFunctionDemo/app/libs/pldroid-shortvideo-3.2.0.jar differ diff --git a/ShortVideoFunctionDemo/app/src/main/AndroidManifest.xml b/ShortVideoFunctionDemo/app/src/main/AndroidManifest.xml index 99b82e7..b82fbae 100644 --- a/ShortVideoFunctionDemo/app/src/main/AndroidManifest.xml +++ b/ShortVideoFunctionDemo/app/src/main/AndroidManifest.xml @@ -22,7 +22,7 @@ android:largeHeap="true" android:supportsRtl="true" android:theme="@style/AppTheme"> - + @@ -30,7 +30,9 @@ - + @@ -115,6 +117,10 @@ android:screenOrientation="portrait" android:theme="@style/AppTheme" /> + \ No newline at end of file diff --git a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/ShortVideoApplication.java b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/ShortVideoApplication.java index 013cb1e..bce95a1 100644 --- a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/ShortVideoApplication.java +++ b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/ShortVideoApplication.java @@ -1,10 +1,10 @@ package com.qiniu.pili.droid.shortvideo.demo; -import android.app.Application; +import androidx.multidex.MultiDexApplication; import com.qiniu.pili.droid.shortvideo.PLShortVideoEnv; -public class ShortVideoApplication extends Application { +public class ShortVideoApplication extends MultiDexApplication { @Override public void onCreate() { diff --git a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/ArRecordActivity.java b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/ArRecordActivity.java index cc81b2c..1226f1c 100644 --- a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/ArRecordActivity.java +++ b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/ArRecordActivity.java @@ -3,7 +3,7 @@ import android.content.Intent; import android.os.Bundle; import android.os.Handler; -import android.support.v7.app.AppCompatActivity; +import androidx.appcompat.app.AppCompatActivity; import android.text.TextUtils; import android.util.Log; import android.view.View; diff --git a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/ConfigActivity.java b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/ConfigActivity.java index 2a45615..72a1c4c 100644 --- a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/ConfigActivity.java +++ b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/ConfigActivity.java @@ -1,6 +1,6 @@ package com.qiniu.pili.droid.shortvideo.demo.activity; -import android.support.v7.app.AppCompatActivity; +import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.AdapterView; diff --git a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/DraftBoxActivity.java b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/DraftBoxActivity.java index 4d760c6..bff3786 100644 --- a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/DraftBoxActivity.java +++ b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/DraftBoxActivity.java @@ -4,8 +4,8 @@ import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; -import android.support.v7.app.AlertDialog; -import android.support.v7.app.AppCompatActivity; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.app.AppCompatActivity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; diff --git a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/ExternalMediaRecordActivity.java b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/ExternalMediaRecordActivity.java index 5d660b8..cc43ccf 100644 --- a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/ExternalMediaRecordActivity.java +++ b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/ExternalMediaRecordActivity.java @@ -7,7 +7,7 @@ import android.media.MediaExtractor; import android.media.MediaFormat; -import android.support.v7.app.AppCompatActivity; +import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; @@ -79,12 +79,12 @@ protected void onCreate(Bundle savedInstanceState) { mExternalMediaRecorder.setRecordStateListener(this); mExternalMediaRecorder.prepare(videoEncodeSetting, audioEncodeSetting, recordSetting); - mPlayButton = (Button)findViewById(R.id.play); - mStopButton = (Button)findViewById(R.id.stop); + mPlayButton = (Button) findViewById(R.id.play); + mStopButton = (Button) findViewById(R.id.stop); mPlayButton.setOnClickListener(this); mStopButton.setOnClickListener(this); - mVideoTextureView = (PLVideoTextureView)findViewById(R.id.video); + mVideoTextureView = (PLVideoTextureView) findViewById(R.id.video); mVideoTextureView.setVideoPath(SRC_VIDEO_FILE_PATH); AVOptions options = new AVOptions(); @@ -132,7 +132,7 @@ public void onClick(View view) { view.setEnabled(false); switch (view.getId()) { case R.id.play: - if ((mVideoTextureView != null) && (!mVideoTextureView.isPlaying())) { + if (!mVideoTextureView.isPlaying()) { mVideoTextureView.start(); mExternalMediaRecorder.start(); } @@ -151,7 +151,9 @@ public void onClick(View view) { @Override protected void onDestroy() { - mExternalMediaRecorder.stop(); + if (mVideoTextureView != null && mVideoTextureView.isPlaying()) { + mExternalMediaRecorder.stop(); + } if (mVideoTextureView != null) { mVideoTextureView.stopPlayback(); mVideoTextureView = null; diff --git a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/ImageComposeActivity.java b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/ImageComposeActivity.java index 7b19577..a9d19c3 100644 --- a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/ImageComposeActivity.java +++ b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/ImageComposeActivity.java @@ -5,8 +5,8 @@ import android.content.Intent; import android.os.Build; import android.os.Bundle; -import android.support.v7.app.AlertDialog; -import android.support.v7.app.AppCompatActivity; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.app.AppCompatActivity; import android.util.Log; import android.view.ContextMenu; import android.view.MenuItem; diff --git a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/ImageComposeWithTransitionActivity.java b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/ImageComposeWithTransitionActivity.java new file mode 100644 index 0000000..035f92a --- /dev/null +++ b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/ImageComposeWithTransitionActivity.java @@ -0,0 +1,368 @@ +package com.qiniu.pili.droid.shortvideo.demo.activity; + +import android.app.Activity; +import android.app.AlertDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.graphics.SurfaceTexture; +import android.os.Build; +import android.os.Bundle; +import android.os.Environment; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.TextureView; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.Button; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.SeekBar; +import android.widget.Spinner; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.bumptech.glide.Glide; +import com.qiniu.pili.droid.shortvideo.PLComposeItem; +import com.qiniu.pili.droid.shortvideo.PLImageComposer; +import com.qiniu.pili.droid.shortvideo.PLPreviewListener; +import com.qiniu.pili.droid.shortvideo.PLTransitionType; +import com.qiniu.pili.droid.shortvideo.PLVideoEncodeSetting; +import com.qiniu.pili.droid.shortvideo.PLVideoSaveListener; +import com.qiniu.pili.droid.shortvideo.demo.R; +import com.qiniu.pili.droid.shortvideo.demo.utils.GetPathFromUri; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class ImageComposeWithTransitionActivity extends AppCompatActivity { + + private static final String TAG = "ImageCompose2"; + + private TextureView mTexturePreview; + private SeekBar mProgressBar; + private Button mBtnAddImage; + private Button mBtnStart; + private Button mBtnResume; + private Button mBtnPause; + private Button mBtnStop; + private Button mBtnSave; + private RecyclerView mRVVideo; + private List mImageItemList = new ArrayList<>(); + private RecyclerView.Adapter mAdapter; + private Map mTransitionMap = new HashMap<>(); + private PLImageComposer mImageComposer; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_image_compose_with_transition); + prepareTransitions(); + + mTexturePreview = (TextureView) findViewById(R.id.texture_preview); + mProgressBar = (SeekBar) findViewById(R.id.seek_bar); + mBtnAddImage = (Button) findViewById(R.id.btn_add_image); + mBtnStart = (Button) findViewById(R.id.btn_start); + mBtnResume = (Button) findViewById(R.id.btn_resume); + mBtnPause = (Button) findViewById(R.id.btn_pause); + mBtnStop = (Button) findViewById(R.id.btn_stop); + mBtnSave = (Button) findViewById(R.id.btn_save); + mRVVideo = (RecyclerView) findViewById(R.id.rv_video); + + mAdapter = new RecyclerView.Adapter() { + @NonNull + @Override + public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + return new ImageComposeWithTransitionActivity.ItemViewHolder(ImageComposeWithTransitionActivity.this); + } + + @Override + public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, final int position) { + ImageComposeWithTransitionActivity.ItemViewHolder h = (ImageComposeWithTransitionActivity.ItemViewHolder) holder; + + PLComposeItem item = mImageItemList.get(position); + Glide.with(ImageComposeWithTransitionActivity.this).load(item.getFilePath()).into(h.imageView); + + if (position == mImageItemList.size() - 1) { + h.textView.setVisibility(View.GONE); + } else { + h.textView.setVisibility(View.VISIBLE); + PLTransitionType transitionType = item.getTransitionType(); + h.textView.setText(getTransitionName(transitionType)); + } + } + + @Override + public int getItemCount() { + return mImageItemList.size(); + } + }; + mRVVideo.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false)); + mRVVideo.setAdapter(mAdapter); + + mImageComposer = new PLImageComposer(this); + mImageComposer.setPreviewLoop(true); + mImageComposer.setPreviewListener(new PLPreviewListener() { + @Override + public void onProgress(float progress) { + mProgressBar.setProgress((int) (progress * 10000)); + } + + @Override + public void onCompleted() { + Toast.makeText(ImageComposeWithTransitionActivity.this, "播放完成", Toast.LENGTH_SHORT).show(); + } + }); + + mProgressBar.setMax(10000); + mProgressBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { + @Override + public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { + if (fromUser) { + float delta = progress / 10000f; + if (mImageComposer.getDurationMs() != 0) { + long seekTime = (long) (mImageComposer.getDurationMs() * delta); + mImageComposer.seekPreview(seekTime); + } + } + } + + @Override + public void onStartTrackingTouch(SeekBar seekBar) { + } + + @Override + public void onStopTrackingTouch(SeekBar seekBar) { + } + }); + + setupAction(); + } + + private void prepareTransitions() { + mTransitionMap.put("淡入淡出", PLTransitionType.FADE); + mTransitionMap.put("从左飞入", PLTransitionType.SLIDE_IN_FROM_LEFT); + mTransitionMap.put("从上飞入", PLTransitionType.SLIDE_IN_FROM_TOP); + mTransitionMap.put("从右飞入", PLTransitionType.SLIDE_IN_FROM_RIGHT); + mTransitionMap.put("从下飞入", PLTransitionType.SLIDE_IN_FROM_BOTTOM); + mTransitionMap.put("从左擦除", PLTransitionType.WIPE_FROM_LEFT); + mTransitionMap.put("从上擦除", PLTransitionType.WIPE_FROM_TOP); + mTransitionMap.put("从右擦除", PLTransitionType.WIPE_FROM_RIGHT); + mTransitionMap.put("从下擦除", PLTransitionType.WIPE_FROM_BOTTOM); + mTransitionMap.put("闪黑", PLTransitionType.FADE_COLOR_BLACK); + mTransitionMap.put("闪白", PLTransitionType.FADE_COLOR_WHITE); + mTransitionMap.put("圆形缩放", PLTransitionType.CIRCLE_CROP); + } + + private void setupAction() { + mTexturePreview.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() { + @Override + public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) { + mImageComposer.setPreviewTexture(surface); + mImageComposer.setPreviewSize(width, height); + } + + @Override + public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) { + mImageComposer.setPreviewSize(width, height); + } + + @Override + public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { + return true; + } + + @Override + public void onSurfaceTextureUpdated(SurfaceTexture surface) { + + } + }); + + mBtnAddImage.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(); + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { + intent.setAction(Intent.ACTION_GET_CONTENT); + } else { + intent.setAction(Intent.ACTION_OPEN_DOCUMENT); + intent.addCategory(Intent.CATEGORY_OPENABLE); + } + intent.setType("image/*"); + startActivityForResult(Intent.createChooser(intent, "请选择要拼接的图片"), 100); + } + }); + + mBtnStart.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + mImageComposer.startPreview(); + } + }); + + mBtnResume.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + mImageComposer.resumePreview(); + } + }); + + mBtnPause.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + mImageComposer.pausePreview(); + } + }); + + mBtnStop.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + mImageComposer.stopPreview(); + } + }); + + mBtnSave.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + PLVideoEncodeSetting exportConfig = new PLVideoEncodeSetting(ImageComposeWithTransitionActivity.this); + String outputPath = Environment.getExternalStorageDirectory() + "/test_image_composition.mp4"; + mImageComposer.save(outputPath, exportConfig, new PLVideoSaveListener() { + @Override + public void onSaveVideoSuccess(final String s) { + runOnUiThread(new Runnable() { + @Override + public void run() { + Toast.makeText(ImageComposeWithTransitionActivity.this, "合成成功", Toast.LENGTH_SHORT).show(); + PlaybackActivity.start(ImageComposeWithTransitionActivity.this, s); + } + }); + } + + @Override + public void onSaveVideoFailed(int i) { + + } + + @Override + public void onSaveVideoCanceled() { + runOnUiThread(new Runnable() { + @Override + public void run() { + Toast.makeText(ImageComposeWithTransitionActivity.this, "停止合成", Toast.LENGTH_SHORT).show(); + } + }); + } + + @Override + public void onProgressUpdate(float v) { + mProgressBar.setProgress((int) (10000 * v)); + } + }); + } + }); + } + + @Override + public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (resultCode == Activity.RESULT_OK) { + if (requestCode == 100) { + final String selectedFilepath = GetPathFromUri.getPath(this, data.getData()); + Log.i(TAG, "Select file: " + selectedFilepath); + if (selectedFilepath != null && !"".equals(selectedFilepath)) { + showAddItemDialog(selectedFilepath); + } + } + } + } + + private void showAddItemDialog(final String selectedFilepath) { + View view = LayoutInflater.from(this).inflate(R.layout.dialog_image_transition, null); + final EditText etImageDuration = view.findViewById(R.id.et_image_duration); + final EditText etTransitionDuration = view.findViewById(R.id.et_transition_duration); + Spinner spinnerTransitionType = view.findViewById(R.id.spinner_transition_type); + + final String[] transitionTypes = mTransitionMap.keySet().toArray(new String[0]); + final String[] currentKey = {transitionTypes[0]}; + ArrayAdapter adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, transitionTypes); + spinnerTransitionType.setAdapter(adapter); + spinnerTransitionType.setSelection(0); + spinnerTransitionType.setAdapter(adapter); + spinnerTransitionType.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) { + currentKey[0] = transitionTypes[position]; + } + + @Override + public void onNothingSelected(AdapterView parent) { + + } + }); + + new AlertDialog.Builder(this) + .setView(view) + .setPositiveButton("确定", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + long imageDuration = Long.parseLong(etImageDuration.getText().toString()); + long transitionDuration = Long.parseLong(etTransitionDuration.getText().toString()); + PLTransitionType transitionType = mTransitionMap.get(currentKey[0]); + addItem(selectedFilepath, imageDuration, transitionDuration, transitionType); + dialog.dismiss(); + } + }) + .show(); + } + + @Override + public void onDestroy() { + super.onDestroy(); + if (mImageComposer != null) { + mImageComposer.release(); + } + } + + private void addItem(String path, long imageDuration, long transitionDuration, PLTransitionType transitionType) { + PLComposeItem item = new PLComposeItem(path); + item.setDurationMs(imageDuration); + item.setTransitionTimeMs(transitionDuration); + item.setItemType(PLComposeItem.ItemType.IMAGE); + item.setTransitionType(transitionType); + mImageComposer.addItem(item); + mImageItemList.add(item); + mAdapter.notifyDataSetChanged(); + } + + private String getTransitionName(PLTransitionType type) { + for (Map.Entry entry : mTransitionMap.entrySet()) { + if (entry.getValue() == type) { + return entry.getKey(); + } + } + return "未知转场"; + } + + private static class ItemViewHolder extends RecyclerView.ViewHolder { + + public ImageView imageView; + public TextView textView; + + public ItemViewHolder(Context context) { + super(LayoutInflater.from(context).inflate(R.layout.holder_image_composer, null)); + imageView = (ImageView) itemView.findViewById(R.id.image_view); + textView = (TextView) itemView.findViewById(R.id.text_view); + } + } + +} diff --git a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/ImportAndEditActivity.java b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/ImportAndEditActivity.java index f442979..1a58613 100644 --- a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/ImportAndEditActivity.java +++ b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/ImportAndEditActivity.java @@ -3,8 +3,8 @@ import android.content.Intent; import android.os.Build; import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v7.app.AppCompatActivity; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; import android.view.View; import com.qiniu.pili.droid.shortvideo.demo.R; diff --git a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/MainActivity.java b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/MainActivity.java index 637b860..a8dbd3d 100644 --- a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/MainActivity.java +++ b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/MainActivity.java @@ -5,7 +5,7 @@ import android.content.pm.PackageManager; import android.os.Build; import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; +import androidx.appcompat.app.AppCompatActivity; import android.view.View; import com.qiniu.pili.droid.shortvideo.PLAuthenticationResultCallback; import com.qiniu.pili.droid.shortvideo.PLShortVideoEnv; @@ -103,6 +103,12 @@ public void onClickImageCompose(View v) { } } + public void onClickImageCompose2(View v) { + if (isPermissionOK()) { + jumpToActivity(ImageComposeWithTransitionActivity.class); + } + } + public void onClickAR(View v) { if (isPermissionOK()) { jumpToActivity(ArRecordActivity.class); diff --git a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/MakeGIFActivity.java b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/MakeGIFActivity.java index 9354fa3..f6e84e6 100644 --- a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/MakeGIFActivity.java +++ b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/MakeGIFActivity.java @@ -9,8 +9,8 @@ import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; -import android.support.v4.util.LruCache; -import android.support.v7.app.AppCompatActivity; +import androidx.collection.LruCache; +import androidx.appcompat.app.AppCompatActivity; import android.util.Log; import android.view.MenuItem; import android.view.View; diff --git a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/MultipleComposeActivity.java b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/MultipleComposeActivity.java index ace34b5..c945a41 100644 --- a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/MultipleComposeActivity.java +++ b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/MultipleComposeActivity.java @@ -6,7 +6,7 @@ import android.graphics.Movie; import android.os.Build; import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; +import androidx.appcompat.app.AppCompatActivity; import android.util.Log; import android.view.ContextMenu; import android.view.MenuItem; diff --git a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/PlaybackActivity.java b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/PlaybackActivity.java index 85fd2d2..eaffc2c 100644 --- a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/PlaybackActivity.java +++ b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/PlaybackActivity.java @@ -8,10 +8,9 @@ import android.content.pm.ActivityInfo; import android.media.MediaPlayer; import android.os.Bundle; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; import android.util.DisplayMetrics; import android.util.Log; -import android.view.MotionEvent; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; diff --git a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/ScreenRecordActivity.java b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/ScreenRecordActivity.java index 93ac65c..256cca0 100644 --- a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/ScreenRecordActivity.java +++ b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/ScreenRecordActivity.java @@ -3,9 +3,9 @@ import android.content.Intent; import android.os.Build; import android.os.Bundle; -import android.support.design.widget.FloatingActionButton; -import android.support.design.widget.Snackbar; -import android.support.v7.app.AppCompatActivity; +import com.google.android.material.floatingactionbutton.FloatingActionButton; +import com.google.android.material.snackbar.Snackbar; +import androidx.appcompat.app.AppCompatActivity; import android.util.DisplayMetrics; import android.util.Log; import android.view.MenuItem; @@ -42,7 +42,8 @@ private void requestScreenRecord() { screenSetting.setRecordFile(Config.SCREEN_RECORD_FILE_PATH) .setInputAudioEnabled(false) .setSize(width, height) - .setDpi(dpi); + .setDpi(dpi) + .setFps(60); PLMicrophoneSetting microphoneSetting = new PLMicrophoneSetting(); mScreenRecorder.prepare(screenSetting, microphoneSetting); } diff --git a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/ShowGIFActivity.java b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/ShowGIFActivity.java index 04bf9b0..5acb639 100644 --- a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/ShowGIFActivity.java +++ b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/ShowGIFActivity.java @@ -1,11 +1,10 @@ package com.qiniu.pili.droid.shortvideo.demo.activity; import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; +import androidx.appcompat.app.AppCompatActivity; import android.view.MenuItem; import com.qiniu.pili.droid.shortvideo.demo.R; -import com.qiniu.pili.droid.shortvideo.demo.utils.Config; import java.io.IOException; diff --git a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/TransitionMakeActivity.java b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/TransitionMakeActivity.java index abec724..34a118c 100644 --- a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/TransitionMakeActivity.java +++ b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/TransitionMakeActivity.java @@ -5,8 +5,8 @@ import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import android.util.Log; import android.view.LayoutInflater; import android.view.MotionEvent; diff --git a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/VideoComposeActivity.java b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/VideoComposeActivity.java index 0bfe77a..f5c495f 100644 --- a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/VideoComposeActivity.java +++ b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/VideoComposeActivity.java @@ -5,7 +5,9 @@ import android.content.Intent; import android.os.Build; import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; + +import androidx.appcompat.app.AppCompatActivity; + import android.util.Log; import android.view.ContextMenu; import android.view.MenuItem; @@ -15,8 +17,10 @@ import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.ListView; +import android.widget.RadioButton; import android.widget.Spinner; +import com.qiniu.pili.droid.shortvideo.PLDisplayMode; import com.qiniu.pili.droid.shortvideo.PLMediaFile; import com.qiniu.pili.droid.shortvideo.PLShortVideoComposer; import com.qiniu.pili.droid.shortvideo.PLVideoEncodeSetting; @@ -43,6 +47,7 @@ public class VideoComposeActivity extends AppCompatActivity { private VideoListAdapter mVideoListAdapter; private ListView mVideoListView; + private RadioButton mRbModeFit; private Spinner mEncodingSizeLevelSpinner; private Spinner mEncodingBitrateLevelSpinner; private CheckBox mVideoRangeCheck; @@ -110,6 +115,8 @@ public boolean onItemLongClick(AdapterView parent, View view, int position, l return false; } }); + + mRbModeFit = findViewById(R.id.rb_mode_fit); } @Override @@ -146,11 +153,14 @@ public void onClickCompose(View v) { ToastUtils.s(this, "请先添加至少 2 个视频"); return; } + + PLDisplayMode displayMode = mRbModeFit.isChecked() ? PLDisplayMode.FIT : PLDisplayMode.FULL; + PLVideoEncodeSetting setting = new PLVideoEncodeSetting(this); setting.setEncodingSizeLevel(getEncodingSizeLevel(mEncodingSizeLevelSpinner.getSelectedItemPosition())); setting.setEncodingBitrate(getEncodingBitrateLevel(mEncodingBitrateLevelSpinner.getSelectedItemPosition())); - boolean isSucc; + boolean composeSuccess; if (mIsVideoRange) { List videoRanges = new LinkedList<>(); for (String video : videos) { @@ -163,12 +173,12 @@ public void onClickCompose(View v) { videoRange.setEndTime(durationMs / 2); videoRanges.add(videoRange); } - isSucc = mShortVideoComposer.composeVideoRanges(videoRanges, Config.COMPOSE_FILE_PATH, setting, mVideoSaveListener); + composeSuccess = mShortVideoComposer.composeVideoRanges(videoRanges, Config.COMPOSE_FILE_PATH, displayMode, setting, mVideoSaveListener); } else { - isSucc = mShortVideoComposer.composeVideos(videos, Config.COMPOSE_FILE_PATH, setting, mVideoSaveListener); + composeSuccess = mShortVideoComposer.composeVideos(videos, Config.COMPOSE_FILE_PATH, displayMode, setting, mVideoSaveListener); } - if (isSucc) { + if (composeSuccess) { mProcessingDialog.show(); } else { ToastUtils.s(this, "开始拼接失败!"); diff --git a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/VideoDivideActivity.java b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/VideoDivideActivity.java index 66fc755..14d723d 100644 --- a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/VideoDivideActivity.java +++ b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/VideoDivideActivity.java @@ -10,9 +10,9 @@ import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import android.util.Log; import android.view.GestureDetector; import android.view.LayoutInflater; diff --git a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/VideoEditActivity.java b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/VideoEditActivity.java index 2ffd63f..bf20639 100644 --- a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/VideoEditActivity.java +++ b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/VideoEditActivity.java @@ -13,9 +13,9 @@ import android.os.Build; import android.os.Bundle; import android.os.Environment; -import android.support.annotation.Nullable; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import android.text.TextUtils; import android.util.Log; import android.view.LayoutInflater; @@ -55,10 +55,10 @@ import com.qiniu.pili.droid.shortvideo.demo.view.ImageSelectorPanel; import com.qiniu.pili.droid.shortvideo.demo.view.OnStickerOperateListener; import com.qiniu.pili.droid.shortvideo.demo.view.PaintSelectorPanel; -import com.qiniu.pili.droid.shortvideo.demo.view.sticker.StickerImageView; -import com.qiniu.pili.droid.shortvideo.demo.view.sticker.StickerTextView; import com.qiniu.pili.droid.shortvideo.demo.view.StrokedTextView; import com.qiniu.pili.droid.shortvideo.demo.view.TextSelectorPanel; +import com.qiniu.pili.droid.shortvideo.demo.view.sticker.StickerImageView; +import com.qiniu.pili.droid.shortvideo.demo.view.sticker.StickerTextView; import org.json.JSONArray; import org.json.JSONException; @@ -80,7 +80,6 @@ public class VideoEditActivity extends Activity implements PLVideoSaveListener { private static final String TAG = "VideoEditActivity"; private static final String MP4_PATH = "MP4_PATH"; - private static final String PREVIOUS_ORIENTATION = "PREVIOUS_ORIENTATION"; private static final int REQUEST_CODE_PICK_AUDIO_MIX_FILE = 0; private static final int REQUEST_CODE_DUB = 1; @@ -127,8 +126,6 @@ private enum PLShortVideoEditorStatus { private TextView mSpeedTextView; private View mVisibleView; - private int mPreviousOrientation; - private FrameListView mFrameListView; private TimerTask mScrollTimerTask; private Timer mScrollTimer; @@ -155,13 +152,6 @@ public static void start(Activity activity, String mp4Path) { activity.startActivity(intent); } - public static void start(Activity activity, String mp4Path, int previousOrientation) { - Intent intent = new Intent(activity, VideoEditActivity.class); - intent.putExtra(MP4_PATH, mp4Path); - intent.putExtra(PREVIOUS_ORIENTATION, previousOrientation); - activity.startActivity(intent); - } - @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -180,8 +170,6 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { mFrameListView = (FrameListView) findViewById(R.id.frame_list_view); mStickerViewGroup = findViewById(R.id.sticker_container_view); - mPreviousOrientation = getIntent().getIntExtra(PREVIOUS_ORIENTATION, 1); - initPreviewView(); initTextSelectorPanel(); initPaintSelectorPanel(); @@ -398,17 +386,35 @@ public void addText(StrokedTextView selectText) { /** * 添加图片贴图 */ - private void addImageView(Drawable drawable) { - saveViewTimeAndHideRect(); + private void addImageView(final Drawable drawable) { + if (mCurView != null) { + final FrameSelectorView selectedView = (FrameSelectorView) mCurView.getTag(R.id.selector_view); + selectedView.post(new Runnable() { + @Override + public void run() { - StickerImageView stickerImageView = (StickerImageView) View.inflate(VideoEditActivity.this, R.layout.sticker_image_view, null); - stickerImageView.setImageDrawable(drawable); + saveViewTimeAndHideRect(); - mShortVideoEditor.addImageView(stickerImageView); - stickerImageView.setOnStickerOperateListener(new StickerOperateListener(stickerImageView)); + StickerImageView stickerImageView = (StickerImageView) View.inflate(VideoEditActivity.this, R.layout.sticker_image_view, null); + stickerImageView.setImageDrawable(drawable); - addSelectorView(stickerImageView); - showViewBorder(stickerImageView); + mShortVideoEditor.addImageView(stickerImageView); + stickerImageView.setOnStickerOperateListener(new StickerOperateListener(stickerImageView)); + + addSelectorView(stickerImageView); + showViewBorder(stickerImageView); + } + }); + } else { + StickerImageView stickerImageView = (StickerImageView) View.inflate(VideoEditActivity.this, R.layout.sticker_image_view, null); + stickerImageView.setImageDrawable(drawable); + + mShortVideoEditor.addImageView(stickerImageView); + stickerImageView.setOnStickerOperateListener(new StickerOperateListener(stickerImageView)); + + addSelectorView(stickerImageView); + showViewBorder(stickerImageView); + } } /** @@ -662,16 +668,25 @@ private void initGifViewGroup() { private void saveViewTimeAndHideRect() { if (mCurView != null) { View rectView = mFrameListView.addSelectedRect((View) mCurView.getTag(R.id.selector_view)); - mCurView.setTag(R.id.rect_view, rectView); - FrameListView.SectionItem sectionItem = mFrameListView.getSectionByRectView(rectView); - if (mCurView instanceof StickerImageView && ((StickerImageView) mCurView).getGifPath() != null) { - ((StickerImageView) mCurView).setTime(sectionItem.getStartTime(), sectionItem.getEndTime()); - saveGifSetting(); + if (rectView != null) { + mCurView.setTag(R.id.rect_view, rectView); + FrameListView.SectionItem sectionItem = mFrameListView.getSectionByRectView(rectView); + if (mCurView instanceof StickerImageView && ((StickerImageView) mCurView).getGifPath() != null) { + ((StickerImageView) mCurView).setTime(sectionItem.getStartTime(), sectionItem.getEndTime()); + saveGifSetting(); + } else { + mShortVideoEditor.setViewTimeline(mCurView, sectionItem.getStartTime(), (sectionItem.getEndTime() - sectionItem.getStartTime())); + } + mCurView.setSelected(false); + mCurView = null; } else { - mShortVideoEditor.setViewTimeline(mCurView, sectionItem.getStartTime(), (sectionItem.getEndTime() - sectionItem.getStartTime())); + if (mCurView instanceof StickerImageView && ((StickerImageView) mCurView).getGifPath() != null) { + ((StickerImageView) mCurView).setTime(0, 0); + saveGifSetting(); + } else { + mShortVideoEditor.setViewTimeline(mCurView, 0, 0); + } } - mCurView.setSelected(false); - mCurView = null; } } @@ -714,18 +729,10 @@ public void onClickMix(View v) { * 多重混音 */ public void onClickMultipleAudioMixing(View v) { - PLMediaFile mediaFile = new PLMediaFile(mMp4path); - boolean isPureVideo = !mediaFile.hasAudio(); - mediaFile.release(); - if (mAudioMixingMode == 0) { ToastUtils.s(this, "已选择单混音,无法再选择多重混音!"); return; } - if (isPureVideo) { - ToastUtils.s(this, "该视频没有音频信息,无法进行多重混音!"); - return; - } Intent intent = new Intent(); if (Build.VERSION.SDK_INT < 19) { @@ -1127,14 +1134,6 @@ protected void onDestroy() { } } - @Override - public void finish() { - if (0 == mPreviousOrientation) { - setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); - } - super.finish(); - } - /** * 设置添加变速时间段 */ diff --git a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/VideoFrameActivity.java b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/VideoFrameActivity.java index 4186fb2..c8368c5 100644 --- a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/VideoFrameActivity.java +++ b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/VideoFrameActivity.java @@ -4,11 +4,11 @@ import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v7.app.AlertDialog; -import android.support.v7.widget.GridLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.SimpleItemAnimator; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AlertDialog; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.recyclerview.widget.SimpleItemAnimator; import android.view.View; import android.view.Window; import android.view.WindowManager; diff --git a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/VideoMixActivity.java b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/VideoMixActivity.java index 84fec3d..2113383 100644 --- a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/VideoMixActivity.java +++ b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/VideoMixActivity.java @@ -7,7 +7,7 @@ import android.graphics.Rect; import android.os.Build; import android.os.Bundle; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; import android.util.Log; import android.view.View; import android.view.WindowManager; diff --git a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/VideoMixRecordActivity.java b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/VideoMixRecordActivity.java index ee036f1..10e80d0 100644 --- a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/VideoMixRecordActivity.java +++ b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/VideoMixRecordActivity.java @@ -9,7 +9,7 @@ import android.opengl.GLSurfaceView; import android.os.Build; import android.os.Bundle; -import android.support.v7.app.AlertDialog; +import androidx.appcompat.app.AlertDialog; import android.util.Log; import android.view.Display; import android.view.GestureDetector; @@ -575,10 +575,10 @@ public void onSaveVideoSuccess(final String filePath) { @Override public void run() { mProcessingDialog.dismiss(); - int screenOrientation = (ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE == getRequestedOrientation()) ? 0 : 1; if (mIsEditVideo) { - VideoEditActivity.start(VideoMixRecordActivity.this, filePath, screenOrientation); + VideoEditActivity.start(VideoMixRecordActivity.this, filePath); } else { + int screenOrientation = (ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE == getRequestedOrientation()) ? 0 : 1; PlaybackActivity.start(VideoMixRecordActivity.this, filePath, screenOrientation); } } diff --git a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/VideoMixRecordConfigActivity.java b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/VideoMixRecordConfigActivity.java index 2dcd5ca..0fafbba 100644 --- a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/VideoMixRecordConfigActivity.java +++ b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/VideoMixRecordConfigActivity.java @@ -2,7 +2,7 @@ import android.content.Intent; import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; +import androidx.appcompat.app.AppCompatActivity; import android.view.View; import com.qiniu.pili.droid.shortvideo.demo.R; diff --git a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/VideoRecordActivity.java b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/VideoRecordActivity.java index daa328c..eca2124 100644 --- a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/VideoRecordActivity.java +++ b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/VideoRecordActivity.java @@ -10,7 +10,7 @@ import android.opengl.GLSurfaceView; import android.os.Build; import android.os.Bundle; -import android.support.v7.app.AlertDialog; +import androidx.appcompat.app.AlertDialog; import android.util.Log; import android.view.GestureDetector; import android.view.MotionEvent; @@ -110,6 +110,7 @@ public class VideoRecordActivity extends Activity implements PLRecordStateListen private OrientationEventListener mOrientationListener; private boolean mSectionBegan; + private long mSectionBeginTSMs; @Override protected void onCreate(Bundle savedInstanceState) { @@ -223,7 +224,6 @@ public void onCancel(DialogInterface dialog) { mSectionProgressBar.setTotalTime(this, mRecordSetting.getMaxRecordDuration()); mRecordBtn.setOnTouchListener(new View.OnTouchListener() { - private long mSectionBeginTSMs; @Override public boolean onTouch(View v, MotionEvent event) { @@ -238,24 +238,7 @@ public boolean onTouch(View v, MotionEvent event) { ToastUtils.s(VideoRecordActivity.this, "无法开始视频段录制"); } } else if (action == MotionEvent.ACTION_UP) { - if (mSectionBegan) { - long sectionRecordDurationMs = System.currentTimeMillis() - mSectionBeginTSMs; - long totalRecordDurationMs = sectionRecordDurationMs + (mDurationRecordStack.isEmpty() ? 0 : mDurationRecordStack.peek().longValue()); - double sectionVideoDurationMs = sectionRecordDurationMs / mRecordSpeed; - double totalVideoDurationMs = sectionVideoDurationMs + (mDurationVideoStack.isEmpty() ? 0 : mDurationVideoStack.peek().doubleValue()); - mDurationRecordStack.push(new Long(totalRecordDurationMs)); - mDurationVideoStack.push(new Double(totalVideoDurationMs)); - if (mRecordSetting.IsRecordSpeedVariable()) { - Log.d(TAG,"SectionRecordDuration: " + sectionRecordDurationMs + "; sectionVideoDuration: " + sectionVideoDurationMs + "; totalVideoDurationMs: " + totalVideoDurationMs + "Section count: " + mDurationVideoStack.size()); - mSectionProgressBar.addBreakPointTime((long) totalVideoDurationMs); - } else { - mSectionProgressBar.addBreakPointTime(totalRecordDurationMs); - } - - mSectionProgressBar.setCurrentState(SectionProgressBar.State.PAUSE); - mShortVideoRecorder.endSection(); - mSectionBegan = false; - } + endSection(); } return false; @@ -364,6 +347,7 @@ protected void onResume() { protected void onPause() { super.onPause(); updateRecordingBtns(false); + endSection(); mShortVideoRecorder.pause(); } @@ -566,10 +550,10 @@ public void onSaveVideoSuccess(final String filePath) { @Override public void run() { mProcessingDialog.dismiss(); - int screenOrientation = (ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE == getRequestedOrientation()) ? 0 : 1; if (mIsEditVideo) { - VideoEditActivity.start(VideoRecordActivity.this, filePath, screenOrientation); + VideoEditActivity.start(VideoRecordActivity.this, filePath); } else { + int screenOrientation = (ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE == getRequestedOrientation()) ? 0 : 1; PlaybackActivity.start(VideoRecordActivity.this, filePath, screenOrientation); } } @@ -740,4 +724,25 @@ public void onAutoFocusStart() { public void onAutoFocusStop() { Log.i(TAG, "auto focus stop"); } + + private void endSection() { + if (mSectionBegan) { + long sectionRecordDurationMs = System.currentTimeMillis() - mSectionBeginTSMs; + long totalRecordDurationMs = sectionRecordDurationMs + (mDurationRecordStack.isEmpty() ? 0 : mDurationRecordStack.peek().longValue()); + double sectionVideoDurationMs = sectionRecordDurationMs / mRecordSpeed; + double totalVideoDurationMs = sectionVideoDurationMs + (mDurationVideoStack.isEmpty() ? 0 : mDurationVideoStack.peek().doubleValue()); + mDurationRecordStack.push(new Long(totalRecordDurationMs)); + mDurationVideoStack.push(new Double(totalVideoDurationMs)); + if (mRecordSetting.IsRecordSpeedVariable()) { + Log.d(TAG, "SectionRecordDuration: " + sectionRecordDurationMs + "; sectionVideoDuration: " + sectionVideoDurationMs + "; totalVideoDurationMs: " + totalVideoDurationMs + "Section count: " + mDurationVideoStack.size()); + mSectionProgressBar.addBreakPointTime((long) totalVideoDurationMs); + } else { + mSectionProgressBar.addBreakPointTime(totalRecordDurationMs); + } + + mSectionProgressBar.setCurrentState(SectionProgressBar.State.PAUSE); + mShortVideoRecorder.endSection(); + mSectionBegan = false; + } + } } diff --git a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/VideoTranscodeActivity.java b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/VideoTranscodeActivity.java index 78158a7..c2755b5 100644 --- a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/VideoTranscodeActivity.java +++ b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/VideoTranscodeActivity.java @@ -5,10 +5,10 @@ import android.content.Intent; import android.os.Build; import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v7.app.AlertDialog; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.widget.AppCompatCheckBox; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.AppCompatCheckBox; import android.util.Log; import android.view.MenuItem; import android.view.View; diff --git a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/VideoTrimActivity.java b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/VideoTrimActivity.java index 558f541..978c1bb 100644 --- a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/VideoTrimActivity.java +++ b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/VideoTrimActivity.java @@ -8,7 +8,7 @@ import android.os.Build; import android.os.Bundle; import android.os.Handler; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; import android.util.Log; import android.util.TypedValue; import android.view.LayoutInflater; diff --git a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/WebViewActivity.java b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/WebViewActivity.java index 8dc9cd2..082a6eb 100644 --- a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/WebViewActivity.java +++ b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/activity/WebViewActivity.java @@ -2,7 +2,7 @@ import android.content.Intent; import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; +import androidx.appcompat.app.AppCompatActivity; import android.text.TextUtils; import android.webkit.WebSettings; import android.webkit.WebView; diff --git a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/view/AudioMixSettingDialog.java b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/view/AudioMixSettingDialog.java index f9dc553..580f2f4 100644 --- a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/view/AudioMixSettingDialog.java +++ b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/view/AudioMixSettingDialog.java @@ -2,9 +2,9 @@ import android.content.Context; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.design.widget.BottomSheetBehavior; -import android.support.design.widget.BottomSheetDialog; +import androidx.annotation.NonNull; +import com.google.android.material.bottomsheet.BottomSheetBehavior; +import com.google.android.material.bottomsheet.BottomSheetDialog; import android.view.View; import android.widget.SeekBar; @@ -37,8 +37,8 @@ public AudioMixSettingDialog(Context context){ @Override protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); setContentView(R.layout.dialog_audio_mix); + super.onCreate(savedInstanceState); mSrcVolumeSeekBar = (SeekBar) findViewById(R.id.fg_volume); mSrcVolumeSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @@ -133,7 +133,7 @@ public void setOnAudioVolumeChangedListener(OnAudioVolumeChangedListener listene } private void setBehaviorCallback() { - View view = getDelegate().findViewById(android.support.design.R.id.design_bottom_sheet); + View view = getDelegate().findViewById(R.id.design_bottom_sheet); final BottomSheetBehavior bottomSheetBehavior = BottomSheetBehavior.from(view); bottomSheetBehavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() { @Override diff --git a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/view/DragItemAdapter.java b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/view/DragItemAdapter.java index 1348dbf..637809b 100644 --- a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/view/DragItemAdapter.java +++ b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/view/DragItemAdapter.java @@ -3,7 +3,7 @@ import android.graphics.Bitmap; import android.media.ThumbnailUtils; import android.provider.MediaStore; -import android.support.v7.widget.RecyclerView; +import androidx.recyclerview.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; diff --git a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/view/FocusIndicator.java b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/view/FocusIndicator.java index 0bbcb3f..357386e 100644 --- a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/view/FocusIndicator.java +++ b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/view/FocusIndicator.java @@ -1,7 +1,7 @@ package com.qiniu.pili.droid.shortvideo.demo.view; import android.content.Context; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; import android.util.AttributeSet; import android.view.View; diff --git a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/view/FrameListView.java b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/view/FrameListView.java index 11ddcdd..0d20cd1 100644 --- a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/view/FrameListView.java +++ b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/view/FrameListView.java @@ -3,10 +3,10 @@ import android.content.Context; import android.graphics.Bitmap; import android.os.AsyncTask; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; @@ -21,7 +21,6 @@ import com.qiniu.pili.droid.shortvideo.demo.R; import java.lang.ref.WeakReference; -import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; @@ -110,18 +109,9 @@ public void scrollToTime(long time) { public FrameSelectorView addSelectorView() { mCurSelectorView = new FrameSelectorView(mContext); final FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, mFrameHeight); - mCurSelectorView.setVisibility(View.INVISIBLE); + layoutParams.leftMargin = (mScrollViewParent.getWidth() - mCurSelectorView.getWidth()) / 2; + mCurSelectorView.setLayoutParams(layoutParams); mScrollViewParent.addView(mCurSelectorView, layoutParams); - - mCurSelectorView.post(new Runnable() { - @Override - public void run() { - // put mCurSelectorView to the middle of the horizontal - layoutParams.leftMargin = (mScrollViewParent.getWidth() - mCurSelectorView.getWidth()) / 2; - mCurSelectorView.setLayoutParams(layoutParams); - mCurSelectorView.setVisibility(View.VISIBLE); - } - }); return mCurSelectorView; } diff --git a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/view/FrameSelectorView.java b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/view/FrameSelectorView.java index 301eee2..f1f9326 100644 --- a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/view/FrameSelectorView.java +++ b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/view/FrameSelectorView.java @@ -118,6 +118,9 @@ public boolean onTouch(View v, MotionEvent event) { } public int getBodyLeft() { + if (mGroupLayoutParam == null){ + mGroupLayoutParam = (FrameLayout.LayoutParams) getLayoutParams(); + } return mGroupLayoutParam.leftMargin + mHandlerLeft.getWidth(); } @@ -126,7 +129,18 @@ public int getLeftHandlerWidth() { } public int getBodyWidth() { - return mHandlerBody.getWidth(); + int width = mHandlerBody.getWidth(); + if (width == 0) { + float scale = getResources().getDisplayMetrics().density; + int preferWidth = (int) ((100 * scale) + 0.5f); + int preferHeight = getLayoutParams().height; + + int widthMeasureSpec = MeasureSpec.makeMeasureSpec(preferWidth, MeasureSpec.EXACTLY); + int heightMeasureSpec = MeasureSpec.makeMeasureSpec(preferHeight, MeasureSpec.EXACTLY); + mHandlerBody.measure(widthMeasureSpec, heightMeasureSpec); + return mHandlerBody.getMeasuredWidth(); + } + return width; } public int getBodyRight() { diff --git a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/view/GifSelectorPanel.java b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/view/GifSelectorPanel.java index d57a239..dcbee39 100644 --- a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/view/GifSelectorPanel.java +++ b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/view/GifSelectorPanel.java @@ -1,9 +1,9 @@ package com.qiniu.pili.droid.shortvideo.demo.view; import android.content.Context; -import android.support.annotation.Nullable; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; diff --git a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/view/ImageSelectorPanel.java b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/view/ImageSelectorPanel.java index 82576dc..6e4b8dd 100644 --- a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/view/ImageSelectorPanel.java +++ b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/view/ImageSelectorPanel.java @@ -4,9 +4,9 @@ import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.drawable.Drawable; -import android.support.annotation.Nullable; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; diff --git a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/view/ItemView.java b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/view/ItemView.java index a85fbda..4d8d5f2 100644 --- a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/view/ItemView.java +++ b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/view/ItemView.java @@ -2,7 +2,7 @@ import android.content.Context; import android.content.res.TypedArray; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; import android.text.TextUtils; import android.util.AttributeSet; import android.view.LayoutInflater; diff --git a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/view/PaintSelectorPanel.java b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/view/PaintSelectorPanel.java index a413706..8f57a4e 100644 --- a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/view/PaintSelectorPanel.java +++ b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/view/PaintSelectorPanel.java @@ -1,9 +1,9 @@ package com.qiniu.pili.droid.shortvideo.demo.view; import android.content.Context; -import android.support.annotation.Nullable; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; diff --git a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/view/TextSelectorPanel.java b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/view/TextSelectorPanel.java index f12255a..fe5d87a 100644 --- a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/view/TextSelectorPanel.java +++ b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/view/TextSelectorPanel.java @@ -3,9 +3,9 @@ import android.content.Context; import android.graphics.Color; import android.graphics.Typeface; -import android.support.annotation.Nullable; -import android.support.v7.widget.GridLayoutManager; -import android.support.v7.widget.RecyclerView; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; diff --git a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/view/TransitionEditView.java b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/view/TransitionEditView.java index 35524b0..47e532d 100644 --- a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/view/TransitionEditView.java +++ b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/view/TransitionEditView.java @@ -3,7 +3,7 @@ import android.content.Context; import android.graphics.Color; import android.graphics.Typeface; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; import android.text.Editable; import android.text.TextWatcher; import android.util.AttributeSet; diff --git a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/view/VerticalSeekBar.java b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/view/VerticalSeekBar.java index f51f081..a8c8970 100644 --- a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/view/VerticalSeekBar.java +++ b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/view/VerticalSeekBar.java @@ -2,7 +2,7 @@ import android.content.Context; import android.graphics.Canvas; -import android.support.v7.widget.AppCompatSeekBar; +import androidx.appcompat.widget.AppCompatSeekBar; import android.util.AttributeSet; import android.view.MotionEvent; diff --git a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/view/sticker/StickerImageView.java b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/view/sticker/StickerImageView.java index 13a63f9..c66b1f6 100644 --- a/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/view/sticker/StickerImageView.java +++ b/ShortVideoFunctionDemo/app/src/main/java/com/qiniu/pili/droid/shortvideo/demo/view/sticker/StickerImageView.java @@ -12,16 +12,15 @@ import android.graphics.Path; import android.graphics.Point; import android.graphics.PointF; +import android.graphics.Rect; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.util.DisplayMetrics; import android.util.TypedValue; import android.view.MotionEvent; -import android.view.View; import android.view.ViewGroup; - import com.qiniu.pili.droid.shortvideo.PLImageView; import com.qiniu.pili.droid.shortvideo.demo.R; import com.qiniu.pili.droid.shortvideo.demo.gif.GifDecoder; @@ -29,7 +28,6 @@ import com.qiniu.pili.droid.shortvideo.demo.utils.Utils; import com.qiniu.pili.droid.shortvideo.demo.view.OnStickerOperateListener; - import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; @@ -213,6 +211,8 @@ public class StickerImageView extends PLImageView { private OnStickerOperateListener mClickListener; + private Rect mImagePosition; + public StickerImageView(Context context) { this(context, null); } @@ -479,6 +479,15 @@ private void adjustLayout() { mViewPaddingLeft = newPaddingLeft; mViewPaddingTop = newPaddingTop; } + + if (mImagePosition == null) { + mImagePosition = new Rect(); + } + mImagePosition.left = newPaddingLeft; + mImagePosition.top = newPaddingTop; + mImagePosition.right = newPaddingLeft + actualWidth; + mImagePosition.bottom = newPaddingTop + actualHeight; + layout(newPaddingLeft, newPaddingTop, newPaddingLeft + actualWidth, newPaddingTop + actualHeight); mX = newPaddingLeft + mControlDrawableWidth / 2; @@ -932,4 +941,15 @@ public void onFrameReady() { invalidate(); } }; + + @Override + protected void onLayout(boolean changed, int left, int top, int right, int bottom) { + super.onLayout(changed, left, top, right, bottom); + // 避免非预期的布局变化 + if (changed && mImagePosition != null + && (left != mImagePosition.left || top != mImagePosition.top + || right != mImagePosition.right || bottom != mImagePosition.bottom)) { + layout(mImagePosition.left, mImagePosition.top, mImagePosition.right, mImagePosition.bottom); + } + } } diff --git a/ShortVideoFunctionDemo/app/src/main/jniLibs/armeabi-v7a/libpldroid_shortvideo_core.so b/ShortVideoFunctionDemo/app/src/main/jniLibs/armeabi-v7a/libpldroid_shortvideo_core.so index 380a5bb..caae00b 100755 Binary files a/ShortVideoFunctionDemo/app/src/main/jniLibs/armeabi-v7a/libpldroid_shortvideo_core.so and b/ShortVideoFunctionDemo/app/src/main/jniLibs/armeabi-v7a/libpldroid_shortvideo_core.so differ diff --git a/ShortVideoFunctionDemo/app/src/main/res/layout/activity_config.xml b/ShortVideoFunctionDemo/app/src/main/res/layout/activity_config.xml index 09731e5..c39fd3e 100644 --- a/ShortVideoFunctionDemo/app/src/main/res/layout/activity_config.xml +++ b/ShortVideoFunctionDemo/app/src/main/res/layout/activity_config.xml @@ -1,31 +1,30 @@ + android:layout_height="48dp" + android:background="@color/colorPrimary"> + android:src="@mipmap/btn_back" /> + android:textSize="18sp" /> @@ -37,82 +36,95 @@ android:textSize="20sp" android:textStyle="bold" /> - - - - - - - - - - - - - - - - - - - - + android:layout_height="match_parent"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - \ No newline at end of file diff --git a/ShortVideoFunctionDemo/app/src/main/res/layout/activity_editor.xml b/ShortVideoFunctionDemo/app/src/main/res/layout/activity_editor.xml index da2b368..89e46fc 100644 --- a/ShortVideoFunctionDemo/app/src/main/res/layout/activity_editor.xml +++ b/ShortVideoFunctionDemo/app/src/main/res/layout/activity_editor.xml @@ -343,7 +343,7 @@ android:background="@android:color/background_dark" android:visibility="gone" /> - + + + + + + + + +