代码之家  ›  专栏  ›  技术社区  ›  SMGhost

Android调整折叠工具栏布局中的图像闪烁问题

  •  0
  • SMGhost  · 技术社区  · 5 年前

    我想在折叠工具栏布局中有一个图像,所以当我滚动下面的列表时,图像会变小一倍,但不会完全消失。

    到目前为止,我通过以下代码实现了这一点:

    XML格式:

    <?xml version="1.0" encoding="utf-8"?>
    <layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto">
    
    <androidx.coordinatorlayout.widget.CoordinatorLayout android:layout_width="match_parent"
                                                         android:background="#fff"
                                                         android:layout_height="match_parent">
    
        <com.google.android.material.appbar.AppBarLayout android:layout_width="match_parent"
                                                         android:id="@+id/appBar"
                                                         android:elevation="1dp"
                                                         android:layout_height="300dp">
    
            <com.google.android.material.appbar.CollapsingToolbarLayout android:layout_width="match_parent"
                                                                        app:expandedTitleGravity="bottom"
                                                                        android:minHeight="200dp"
                                                                        app:layout_scrollFlags="scroll|exitUntilCollapsed"
                                                                        android:layout_height="match_parent">
    
    
                <androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent"
                                                                   android:layout_height="wrap_content"
                                                                   app:layout_collapseMode="pin"
                                                                   android:layout_gravity="bottom"
                                                                   android:orientation="vertical">
    
                    <ImageView android:layout_width="200dp"
                               app:layout_constraintTop_toTopOf="parent"
                               app:layout_constraintStart_toStartOf="parent"
                               app:layout_constraintEnd_toEndOf="parent"
                               android:layout_height="200dp"
                               android:id="@+id/image"
                               android:scaleType="centerCrop"
                               android:src="@drawable/saya_no_uta"/>
    
                    <TextView android:id="@+id/doStuff" android:layout_width="wrap_content"
                              app:layout_constraintEnd_toEndOf="parent"
                              app:layout_constraintTop_toTopOf="parent"
                              android:textColor="#fff"
                              android:layout_height="wrap_content" android:text="Do stuff"/>
    
                    <LinearLayout
                            android:id="@+id/content"
                            android:background="#00f"
                            android:orientation="horizontal"
                            app:layout_constraintTop_toBottomOf="@id/image"
                            android:layout_width="match_parent"
                            android:layout_height="100dp">
                    </LinearLayout>
    
    
                </androidx.constraintlayout.widget.ConstraintLayout>
    
            </com.google.android.material.appbar.CollapsingToolbarLayout>
    
        </com.google.android.material.appbar.AppBarLayout>
    
        <androidx.core.widget.NestedScrollView android:layout_width="match_parent"
                                               app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior"
                                               android:layout_height="match_parent">
            <TextView android:layout_width="match_parent"
                      android:text="@string/large_text"
                      android:layout_height="wrap_content"/>
    
        </androidx.core.widget.NestedScrollView>
    
    </androidx.coordinatorlayout.widget.CoordinatorLayout>
    

    科特林:

    class CollapsingToolbarFragment : Fragment() {
    
    companion object {
        const val TAG = "CollapsingToolbarLayout"
    }
    
    var originalHeight: Float = 0.0f
    var lastVerticalOffset: Int = Int.MAX_VALUE
    
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        val binding = FragmentCollapsingToolbarBinding.inflate(inflater, container, false)
        originalHeight = convertDpToPixel(200.0f)
        binding.lifecycleOwner = viewLifecycleOwner
        binding.appBar.addOnOffsetChangedListener(AppBarLayout.OnOffsetChangedListener { appBarLayout, verticalOffset ->
            if (lastVerticalOffset == verticalOffset) {
                return@OnOffsetChangedListener
            }
            lastVerticalOffset = verticalOffset
            val totalScrollRange = appBarLayout.totalScrollRange
            Log.i("Hello", "total: $totalScrollRange, offset: $verticalOffset")
            val size = originalHeight.toInt() + verticalOffset
            binding.image.layoutParams.height = size
            binding.image.layoutParams.width = size
            binding.image.requestLayout()
        })
        return binding.root
    }
    
    fun convertDpToPixel(dp: Float): Float {
        return dp * (requireContext().resources.displayMetrics.densityDpi.toFloat() / DisplayMetrics.DENSITY_DEFAULT)
    }
    

    它的工作原理和预期的一样,但也有副作用。当我快速地向上或向下滚动时,一瞬间我就能看到我的文本视图,其中的文本“Do stuff”会以很小的边距在其位置的上方或下方移动,这真的很烦人。这可能是因为我正在手动调用 但是我还需要用什么方法来调整图像的大小 打开OffsetChangedListener

    或者我可以采取其他方法?

    0 回复  |  直到 5 年前
        1
  •  0
  •   SMGhost    5 年前

    如果有人想知道,我可以通过在ImageView上使用scaleX、scaleY和translationY属性来获得更好的结果,而不是请求布局。我还将编辑文本视图移到约束布局之外。

    override fun onOffsetChanged(appBarLayout: AppBarLayout, verticalOffset: Int) {
        if (scrollRange == -1) {
            scrollRange = binding.appBarLayout.totalScrollRange
        }
    
        val delta = 1.0f - abs(verticalOffset).toFloat() / scrollRange.toFloat() * 0.5f
        binding.avatar.scaleX = 0.2f + delta * 0.8f
        binding.avatar.scaleY = 0.2f + delta * 0.8f
        binding.avatar.translationY = delta * 0.5f * abs(verticalOffset)
    }
    
        2
  •  0
  •   CN_tudou    5 年前

    您可以编写自定义折叠工具栏布局以重写OffsetUpdateListener以更改图像大小。