Ver Fonte

Implement left toolbar slide animation

cooperku_kdanmobile há 5 anos atrás
pai
commit
de13df4a38

+ 203 - 11
reader/src/main/java/com/kdanmobile/reader/ReaderActivity.kt

@@ -7,11 +7,16 @@ import android.net.Uri
 import android.os.Build
 import android.support.v7.app.AppCompatActivity
 import android.os.Bundle
+import android.support.constraint.ConstraintLayout
 import android.support.constraint.ConstraintSet
+import android.util.DisplayMetrics
 import android.view.Menu
+import android.view.MotionEvent
 import android.view.View
 import com.kdanmobile.kmpdfkit.pdfcommon.KMPDFReaderView
 import com.kdanmobile.reader.Utils.applyConstraintSet
+import com.kdanmobile.reader.utils.AnimationUtil
+import com.kdanmobile.reader.utils.DensityUtil
 import kotlinx.android.synthetic.main.activity_reader.*
 import kotlin.Exception
 
@@ -27,12 +32,33 @@ open class ReaderActivity : AppCompatActivity() {
     private var isHideToolbar = false
     private lateinit var originConstraintSet: ConstraintSet
 
+    private val UI_ANIMATION_DURATION = 300L
+
+    private var w_318: Int = 0
+    private var w_240: Int = 0
+    private var w_left: Int = 0
+
+    private var isLeftToolbarOpen = false
+
+    enum class LeftToolbarType {
+        INIT, THUMBNAIL, BOOKMARK, OUTLINE, SEARCH
+    }
+    private var leftToolbarType = LeftToolbarType.INIT
+
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
         setContentView(R.layout.activity_reader)
         setSupportActionBar(toolbar_readerActivity)
 
+        val displayMetrics = DisplayMetrics()
+        windowManager.defaultDisplay.getMetrics(displayMetrics)
+        val width = Math.min(DensityUtil.getScreenWidthPx(baseContext), DensityUtil.getScreenHeightPx(baseContext))
+        w_318 = 318 * width / 800
+        w_240 = 240 * width / 800
+        w_left = resources.getDimension(R.dimen.reader_left_right_toolbar_icon_width).toInt()
+
         cloneOriginConstraintSet()
+        setupLeftToolbar()
         setupBottomToolbar()
 
         val factory = ReaderViewModelFactory()
@@ -82,8 +108,10 @@ open class ReaderActivity : AppCompatActivity() {
     }
 
     private fun cloneOriginConstraintSet() {
-        originConstraintSet = ConstraintSet().apply {
-            clone(constrainLayout_readerActivity_root)
+        if (!isBelowKitkat()) {
+            originConstraintSet = ConstraintSet().apply {
+                clone(constrainLayout_readerActivity_root)
+            }
         }
     }
 
@@ -96,41 +124,84 @@ open class ReaderActivity : AppCompatActivity() {
         val readerView = object : KMPDFReaderView(context) {
             override fun onTapMainDocArea() {
                 super.onTapMainDocArea()
+                if (isBelowKitkat()) {
+                    isHideToolbar = toolbar_readerActivity.visibility != View.VISIBLE
+                            || viewGroup_readerActivity_bottomToolbar.visibility != View.VISIBLE
+                            || viewGroup_readerActivity_leftToolbar.visibility != View.VISIBLE
+                            || viewGroup_readerActivity_rightToolbar.visibility != View.VISIBLE
+                }
                 when (isHideToolbar) {
                     true -> showAllToolbars()
                     false -> hideAllToolbars()
                 }
                 isHideToolbar = !isHideToolbar
             }
+
+            override fun onScroll(e1: MotionEvent?, e2: MotionEvent?, distanceX: Float, distanceY: Float): Boolean {
+                if (isBelowKitkat()) {
+                    isHideToolbar = toolbar_readerActivity.visibility != View.VISIBLE
+                            || viewGroup_readerActivity_bottomToolbar.visibility != View.VISIBLE
+                            || viewGroup_readerActivity_leftToolbar.visibility != View.VISIBLE
+                            || viewGroup_readerActivity_rightToolbar.visibility != View.VISIBLE
+                }
+                if (!isHideToolbar) {
+                    hideAllToolbars()
+                    isHideToolbar = false
+                }
+                return super.onScroll(e1, e2, distanceX, distanceY)
+            }
         }
         viewModel.setReaderView(readerView)
         container.addView(readerView)
     }
 
+
+    private fun isBelowKitkat(): Boolean {
+        return true
+//        return Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT
+    }
+
     private fun showAllToolbars() {
-        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
-            // TODO : Implement show toolbars on Android api level < 19 devices
+        if (isBelowKitkat()) {
+            AnimationUtil.showViewFromTopToBottom(toolbar_readerActivity, UI_ANIMATION_DURATION)
+            AnimationUtil.showViewFromBottomToTop(viewGroup_readerActivity_bottomToolbar, UI_ANIMATION_DURATION)
+            AnimationUtil.showViewFromLeftToRight(viewGroup_readerActivity_leftToolbar, UI_ANIMATION_DURATION)
+            AnimationUtil.showViewFromRightToLeft(viewGroup_readerActivity_rightToolbar, UI_ANIMATION_DURATION)
         } else {
-            constrainLayout_readerActivity_root.applyConstraintSet(originConstraintSet)
+            constrainLayout_readerActivity_root.applyConstraintSet(originConstraintSet, UI_ANIMATION_DURATION)
         }
     }
 
     private fun hideAllToolbars() {
-        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
-            // TODO : Implement hide toolbars on Android api level < 19 devices
+        if (isBelowKitkat()) {
+            AnimationUtil.hideViewFromBottomToTop(toolbar_readerActivity, UI_ANIMATION_DURATION)
+            AnimationUtil.hideViewFromTopToBottom(viewGroup_readerActivity_bottomToolbar, UI_ANIMATION_DURATION)
+            AnimationUtil.hideViewFromRightToLeft(viewGroup_readerActivity_leftToolbar, UI_ANIMATION_DURATION)
+            AnimationUtil.hideViewFromLeftToRight(viewGroup_readerActivity_rightToolbar, UI_ANIMATION_DURATION)
         } else {
-            constrainLayout_readerActivity_root.applyConstraintSet(this, R.layout.activity_reader_hide_all)
+            constrainLayout_readerActivity_root.applyConstraintSet(this, R.layout.activity_reader_hide_all, UI_ANIMATION_DURATION)
         }
     }
 
     private fun hideTopLeftBottomToolbars() {
-        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
-            // TODO : Implement hide toolbars on Android api level < 19 devices
+        if (isBelowKitkat()) {
+            AnimationUtil.hideViewFromBottomToTop(toolbar_readerActivity, UI_ANIMATION_DURATION)
+            AnimationUtil.hideViewFromTopToBottom(viewGroup_readerActivity_bottomToolbar, UI_ANIMATION_DURATION)
+            AnimationUtil.hideViewFromRightToLeft(viewGroup_readerActivity_leftToolbar, UI_ANIMATION_DURATION)
         } else {
-            constrainLayout_readerActivity_root.applyConstraintSet(this, R.layout.activity_reader_hide_top_left_bottom)
+            constrainLayout_readerActivity_root.applyConstraintSet(this, R.layout.activity_reader_hide_top_left_bottom, UI_ANIMATION_DURATION)
         }
     }
 
+    private fun setupLeftToolbar() {
+        viewGroup_readerActivity_leftToolbar.setScroll(false)
+        setLeftToolbarWidth(w_240)
+        viewGroup_readerActivity_leftToolbar.smoothScrollTo(w_240, 0, 0)
+        val child = layoutInflater.inflate(R.layout.view_km_thumb_layout, null)
+        linearLayout_readerActivity_leftToolbarContainer.addView(child)
+        cloneOriginConstraintSet()
+    }
+
     private fun setupBottomToolbar() {
         val context = this
         /** Set buttons color **/
@@ -142,4 +213,125 @@ open class ReaderActivity : AppCompatActivity() {
         Utils.setTintDrawableList(context, ib_readerActivity_bottomToolbarViewAll, R.drawable.ic_view_all, normalColor, pressColor)
         Utils.setTintDrawableList(context, ib_readerActivity_bottomToolbarKdanCloud, R.drawable.ic_kdan_cloud, normalColor, pressColor)
     }
+
+    //  =====================================================================
+
+    private fun setLeftToolbarWidth(width: Int) {
+        var params = viewGroup_readerActivity_leftToolbar!!.layoutParams as ConstraintLayout.LayoutParams
+        params.width = width + w_left
+        params.height = 0
+        viewGroup_readerActivity_leftToolbar.layoutParams = params
+
+        params = linearLayout_readerActivity_leftToolbarContainer!!.layoutParams as ConstraintLayout.LayoutParams
+        params.width = width
+        linearLayout_readerActivity_leftToolbarContainer.layoutParams = params
+    }
+
+    private fun changeLeftToolbarType(type: LeftToolbarType) {
+        iv_readerActivity_thumbnail.setImageResource(R.drawable.ic_pagelist_thumbnail_nor)
+        iv_readerActivity_bookmark.setImageResource(R.drawable.ic_pagelist_bookmk_nor)
+        iv_readerActivity_outline.setImageResource(R.drawable.ic_pagelist_outline_nor)
+        iv_readerActivity_search.setImageResource(R.drawable.ic_pagelist_search_nor)
+
+        val width = when (type) {
+            LeftToolbarType.THUMBNAIL -> w_240
+            else -> w_318
+        }
+        setLeftToolbarWidth(width)
+
+        isLeftToolbarOpen = (!isLeftToolbarOpen || leftToolbarType != type)
+        if (isLeftToolbarOpen)
+            viewGroup_readerActivity_leftToolbar.smoothScrollTo(0, 0, UI_ANIMATION_DURATION.toInt())
+        else
+            viewGroup_readerActivity_leftToolbar.smoothScrollTo(width, 0, UI_ANIMATION_DURATION.toInt())
+        cloneOriginConstraintSet()
+    }
+
+    private fun onThumbnailClick() {
+        val type = LeftToolbarType.THUMBNAIL
+        changeLeftToolbarType(type)
+        if (isLeftToolbarOpen) {
+            if (leftToolbarType != type) {
+                linearLayout_readerActivity_leftToolbarContainer.removeAllViews()
+                val child = layoutInflater.inflate(R.layout.view_km_thumb_layout, null)
+                linearLayout_readerActivity_leftToolbarContainer.addView(child)
+            }
+            iv_readerActivity_thumbnail.setImageResource(R.drawable.ic_pagelist_thumbnail_h)
+        } else {
+            iv_readerActivity_thumbnail.setImageResource(R.drawable.ic_pagelist_thumbnail_nor)
+        }
+        leftToolbarType = type
+    }
+
+    private fun onBookmarkClick() {
+        val type = LeftToolbarType.BOOKMARK
+        changeLeftToolbarType(type)
+        if (isLeftToolbarOpen) {
+            if (leftToolbarType != type) {
+                linearLayout_readerActivity_leftToolbarContainer.removeAllViews()
+                val child = layoutInflater.inflate(R.layout.view_km_thumb_layout, null)
+                linearLayout_readerActivity_leftToolbarContainer.addView(child)
+            }
+            iv_readerActivity_bookmark.setImageResource(R.drawable.ic_pagelist_bookmk_h)
+        } else {
+            iv_readerActivity_bookmark.setImageResource(R.drawable.ic_pagelist_bookmk_nor)
+        }
+        leftToolbarType = type
+    }
+
+    private fun onOutlineClick() {
+        val type = LeftToolbarType.OUTLINE
+        changeLeftToolbarType(type)
+        if (isLeftToolbarOpen) {
+            if (leftToolbarType != type) {
+                linearLayout_readerActivity_leftToolbarContainer.removeAllViews()
+                val child = layoutInflater.inflate(R.layout.view_km_thumb_layout, null)
+                linearLayout_readerActivity_leftToolbarContainer.addView(child)
+            }
+            iv_readerActivity_outline.setImageResource(R.drawable.ic_pagelist_outline_h)
+        } else {
+            iv_readerActivity_outline.setImageResource(R.drawable.ic_pagelist_outline_nor)
+        }
+        leftToolbarType = type
+    }
+
+    private fun onSearchClick() {
+        val type = LeftToolbarType.SEARCH
+        changeLeftToolbarType(type)
+        if (isLeftToolbarOpen) {
+            if (leftToolbarType != type) {
+                linearLayout_readerActivity_leftToolbarContainer.removeAllViews()
+                val child = layoutInflater.inflate(R.layout.view_km_thumb_layout, null)
+                linearLayout_readerActivity_leftToolbarContainer.addView(child)
+            }
+            iv_readerActivity_search.setImageResource(R.drawable.ic_pagelist_search_h)
+        } else {
+            iv_readerActivity_search.setImageResource(R.drawable.ic_pagelist_search_nor)
+        }
+        leftToolbarType = type
+    }
+
+    fun onClick(view: View)
+    {
+        when (view.id) {
+            R.id.iv_readerActivity_thumbnail -> {
+                onThumbnailClick()
+            }
+            R.id.iv_readerActivity_bookmark -> {
+                onBookmarkClick()
+            }
+            R.id.iv_readerActivity_outline -> {
+                onOutlineClick()
+            }
+            R.id.iv_readerActivity_search -> {
+                onSearchClick()
+            }
+            R.id.iv_readerActivity_fullScreen -> {
+                hideTopLeftBottomToolbars()
+            }
+            else -> {
+
+            }
+        }
+    }
 }

+ 3 - 0
reader/src/main/res/values/dimens.xml

@@ -0,0 +1,3 @@
+<resources>
+    <dimen name="reader_left_right_toolbar_icon_width">48dp</dimen>
+</resources>