diff --git a/app/src/main/java/me/rosuh/easywatermark/ui/MainActivity.kt b/app/src/main/java/me/rosuh/easywatermark/ui/MainActivity.kt index e8299c58..6f922215 100644 --- a/app/src/main/java/me/rosuh/easywatermark/ui/MainActivity.kt +++ b/app/src/main/java/me/rosuh/easywatermark/ui/MainActivity.kt @@ -55,6 +55,8 @@ class MainActivity : AppCompatActivity() { cl_root.setTransition(R.id.transition_launch) cl_root.transitionToEnd() checkHadCrash() + // Activity was recycled but dialog still showing in some case? + SaveImageBSDialogFragment.safetyHide(this@MainActivity.supportFragmentManager) } } @@ -229,6 +231,7 @@ class MainActivity : AppCompatActivity() { val pagerAdapter = ControlPanelPagerAdapter(this, fragmentArray) vp_control_panel.apply { + isUserInputEnabled = false offscreenPageLimit = 2 adapter = pagerAdapter } diff --git a/app/src/main/java/me/rosuh/easywatermark/ui/MainViewModel.kt b/app/src/main/java/me/rosuh/easywatermark/ui/MainViewModel.kt index d85ab5d7..9725b7e3 100644 --- a/app/src/main/java/me/rosuh/easywatermark/ui/MainViewModel.kt +++ b/app/src/main/java/me/rosuh/easywatermark/ui/MainViewModel.kt @@ -12,7 +12,6 @@ import android.net.Uri import android.os.Build import android.os.Environment import android.provider.MediaStore -import android.util.Log import android.widget.Toast import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat @@ -372,19 +371,11 @@ class MainViewModel : ViewModel() { input?.copyTo(output) } } - Log.i( - "compressImg", - "Before compress: file ${tmpFile.absolutePath}, length = ${tmpFile.length()}" - ) val compressedFile = Compressor.compress(activity, tmpFile) // clear tmp files if (tmpFile.exists()) { tmpFile.delete() } - Log.i( - "compressImg", - "After compress: compressedFile ${compressedFile.absolutePath}, length = ${compressedFile.length()}" - ) try { val compressedFileUri = FileProvider.getUriForFile( activity, diff --git a/app/src/main/java/me/rosuh/easywatermark/ui/dialog/SaveImageBSDialogFragment.kt b/app/src/main/java/me/rosuh/easywatermark/ui/dialog/SaveImageBSDialogFragment.kt index 1cbe752e..11c4a166 100644 --- a/app/src/main/java/me/rosuh/easywatermark/ui/dialog/SaveImageBSDialogFragment.kt +++ b/app/src/main/java/me/rosuh/easywatermark/ui/dialog/SaveImageBSDialogFragment.kt @@ -129,6 +129,12 @@ class SaveImageBSDialogFragment : BottomSheetDialogFragment() { return SaveImageBSDialogFragment() } + fun safetyHide(manager: FragmentManager) { + kotlin.runCatching { + (manager.findFragmentByTag(TAG) as? SaveImageBSDialogFragment)?.dismissAllowingStateLoss() + } + } + fun safetyShow(manager: FragmentManager) { try { val f = manager.findFragmentByTag(TAG) as? SaveImageBSDialogFragment diff --git a/app/src/main/java/me/rosuh/easywatermark/ui/panel/ContentFragment.kt b/app/src/main/java/me/rosuh/easywatermark/ui/panel/ContentFragment.kt index a5264b24..65e50642 100644 --- a/app/src/main/java/me/rosuh/easywatermark/ui/panel/ContentFragment.kt +++ b/app/src/main/java/me/rosuh/easywatermark/ui/panel/ContentFragment.kt @@ -68,16 +68,16 @@ class ContentFragment : BaseFragment() { with(shareViewModel.config.value?.textSize ?: 14f) { progress = this.toInt() } - setOnSeekBarChangeListener(object : DetectedPerformanceSeekBarListener( - config + setOnSeekBarChangeListener(object : DetectedPerformanceSeekBarListener(config) { - ) { }.apply { inTimeAction = { _: SeekBar?, _: Int, _: Boolean -> tvContentSize.text = progress.toString() } - postAction = { _: SeekBar?, _: Int -> - shareViewModel.updateTextSize(progress.toFloat()) + postAction = { _: SeekBar?, _: Int, fromUser: Boolean -> + if (fromUser) { + shareViewModel.updateTextSize(progress.toFloat()) + } } }) } diff --git a/app/src/main/java/me/rosuh/easywatermark/ui/panel/LayoutFragment.kt b/app/src/main/java/me/rosuh/easywatermark/ui/panel/LayoutFragment.kt index 4feba82f..230143c9 100644 --- a/app/src/main/java/me/rosuh/easywatermark/ui/panel/LayoutFragment.kt +++ b/app/src/main/java/me/rosuh/easywatermark/ui/panel/LayoutFragment.kt @@ -35,7 +35,7 @@ class LayoutFragment : BaseFragment() { inTimeAction = { seekBar: SeekBar?, _: Int, _: Boolean -> tvProgressHorizon.text = seekBar?.progress.toString() } - postAction = { seekBar: SeekBar?, _: Int -> + postAction = { seekBar: SeekBar?, _: Int, _ -> shareViewModel.updateHorizon(seekBar?.progress ?: 0) } }) @@ -54,7 +54,7 @@ class LayoutFragment : BaseFragment() { tvProgressVertical.text = seekBar?.progress.toString() } - postAction = { seekBar: SeekBar?, _: Int -> + postAction = { seekBar: SeekBar?, _: Int, _ -> shareViewModel.updateVertical(seekBar?.progress ?: 0) } }) diff --git a/app/src/main/java/me/rosuh/easywatermark/ui/panel/StyleFragment.kt b/app/src/main/java/me/rosuh/easywatermark/ui/panel/StyleFragment.kt index 1a1a3450..d7480737 100644 --- a/app/src/main/java/me/rosuh/easywatermark/ui/panel/StyleFragment.kt +++ b/app/src/main/java/me/rosuh/easywatermark/ui/panel/StyleFragment.kt @@ -70,8 +70,32 @@ class StyleFragment : BaseFragment() { inTimeAction = { _: SeekBar?, _: Int, _: Boolean -> tvDegree.text = "${shareViewModel.config.value?.degree ?: 0}°" } - postAction = - { _: SeekBar?, _: Int -> shareViewModel.updateDegree(progress.toFloat()) } + postAction = { _: SeekBar?, _: Int, fromUser: Boolean -> + if (fromUser) { + shareViewModel.updateDegree(progress.toFloat()) + } + } + }) + } + + val tvAlpha = root.findViewById(R.id.tv_tips_alpha).apply { + text = "${getAlphaValue()}%" + } + val sbAlpha = root.findViewById(R.id.sb_alpha).apply { + progress = getAlphaValue() + setOnSeekBarChangeListener(object : + DetectedPerformanceSeekBarListener( + config + ) { + }.apply { + inTimeAction = { _: SeekBar?, p: Int, _: Boolean -> + tvAlpha.text = "${p}%" + } + postAction = { _: SeekBar?, p: Int, fromUser: Boolean -> + if (fromUser) { + shareViewModel.updateAlpha((p.toFloat() / 100 * 255).toInt()) + } + } }) } @@ -95,9 +119,29 @@ class StyleFragment : BaseFragment() { } } } + initObserver(sbAlpha, tvAlpha) return root } + private fun getAlphaValue(): Int { + return ((shareViewModel.config.value?.alpha ?: 255).toFloat() / 255 * 100).toInt() + .coerceAtLeast(0).coerceAtMost(100) + } + + private fun initObserver( + sbAlpha: SeekBar, + tvAlpha: TextView + ) { + shareViewModel.config.observe(viewLifecycleOwner, { + with(it.alpha) { + val intAlpha = + (this.toFloat() / 255 * 100).toInt().coerceAtLeast(0).coerceAtMost(100) + sbAlpha.progress = intAlpha + tvAlpha.text = "${intAlpha}%" + } + }) + } + private fun showColorPickerDialog(adapter: ColorPreviewAdapter) { ColorPickerDialog.Builder( activity, diff --git a/app/src/main/java/me/rosuh/easywatermark/utils/DetectedPerformanceSeekBarListener.kt b/app/src/main/java/me/rosuh/easywatermark/utils/DetectedPerformanceSeekBarListener.kt index 60c20390..8680d42f 100644 --- a/app/src/main/java/me/rosuh/easywatermark/utils/DetectedPerformanceSeekBarListener.kt +++ b/app/src/main/java/me/rosuh/easywatermark/utils/DetectedPerformanceSeekBarListener.kt @@ -23,7 +23,7 @@ open class DetectedPerformanceSeekBarListener( var inTimeAction: (SeekBar?, Int, Boolean) -> Unit = { _, _, _ -> } - var postAction: (SeekBar?, Int) -> Unit = { _, _ -> } + var postAction: (SeekBar?, Int, Boolean) -> Unit = { _, _, _ -> } private var isHighPerformancePredicate: () -> Boolean = { config?.markMode == WaterMarkConfig.MarkMode.Text @@ -32,7 +32,7 @@ open class DetectedPerformanceSeekBarListener( override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { if (isHighPerformancePredicate()) { - seekBar?.progress?.let { postAction.invoke(seekBar, it) } + seekBar?.progress?.let { postAction.invoke(seekBar, it, fromUser) } } inTimeAction.invoke(seekBar, progress, fromUser) } @@ -43,7 +43,7 @@ open class DetectedPerformanceSeekBarListener( override fun onStopTrackingTouch(seekBar: SeekBar?) { if (!isHighPerformancePredicate()) { - seekBar?.progress?.let { postAction.invoke(seekBar, it) } + seekBar?.progress?.let { postAction.invoke(seekBar, it, true) } } } diff --git a/app/src/main/res/layout/fragment_style.xml b/app/src/main/res/layout/fragment_style.xml index 7289194a..70623285 100644 --- a/app/src/main/res/layout/fragment_style.xml +++ b/app/src/main/res/layout/fragment_style.xml @@ -1,66 +1,108 @@ - + android:layout_height="match_parent" + android:animateLayoutChanges="true" + android:paddingBottom="12dp" + android:scrollbars="vertical"> - + android:padding="20dp" + tools:background="#161616"> + - - + - + + + + + + + + + + + - + - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/values-en/strings.xml b/app/src/main/res/values-en/strings.xml index cc5ff99f..dd2cf1b4 100644 --- a/app/src/main/res/values-en/strings.xml +++ b/app/src/main/res/values-en/strings.xml @@ -60,4 +60,5 @@ It seems that there is no mail client installed, you can actively paste the error message to the app market or Github The larger the size, the more demanding the real-time preview performance. 👋Photos are for testing purposes only. + Alpha \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6e7eb4d2..054f964a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -69,4 +69,5 @@ [EasyWaterMark] Crash info 尺寸越大,实时预览性能要求越高 👋图片仅供测试,请勿作其他用途 + 透明度 \ No newline at end of file