滚动时,Recyclerview高程会逐渐变化

时间:2018-05-28 06:55:01

标签: android android-recyclerview android-elevation

我有recyclerview,我已添加了elevation。看起来根据项目垂直位于屏幕上的位置,高程会变高,当项目向下滚动时阴影会增大。我尝试添加背景颜色,但没有帮助。我找到了另一篇帖子,其中有一个视频显示了问题https://youtu.be/nROYq8rpUMs

这是我添加海拔的相对布局。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#EDEDED"
    android:focusable="?attr/selectableItemBackground"
    android:layout_marginTop="15dp"
    android:layout_marginBottom="15dp"
    android:paddingTop="10dp"
    android:paddingBottom="10dp"
    android:id="@+id/newsRowRelativeLayout"
    android:elevation="4dp">

    <ImageView
        android:id="@+id/newsImage"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:maxHeight="300dp"
        android:layout_marginTop="5dp"
        android:layout_marginBottom="15dp"
        android:scaleType="centerCrop"
        android:adjustViewBounds="true"
        android:background="@color/mainTextBGColor" />

    <TextView
        android:id="@+id/newsTitle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@android:color/transparent"
        android:layout_below="@id/newsType"
        android:textStyle="bold"
        android:textColor="@color/news_title"
        android:paddingLeft="@dimen/activity_margin"
        android:paddingRight="@dimen/activity_margin"
        android:textSize="@dimen/news_title_main" />

    <TextView
        android:id="@+id/newsType"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@android:color/transparent"
        android:layout_below="@id/newsImage"
        android:textStyle="bold"
        android:textAllCaps="true"
        android:layout_marginTop="5dp"
        android:layout_marginBottom="10dp"
        android:textColor="@color/mainBGColor"
        android:paddingLeft="@dimen/activity_margin"
        android:paddingRight="@dimen/activity_margin"
        android:textSize="@dimen/news_tag_detailed" />

    <TextView
        android:id="@+id/newsText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/newsTitle"
        android:background="@android:color/transparent"
        android:ellipsize="end"
        android:maxLines="3"
        android:textColor="@color/news_text"
        android:layout_marginTop="10dp"
        android:layout_marginBottom="5dp"
        android:paddingLeft="@dimen/activity_margin"
        android:paddingRight="@dimen/activity_margin"
        android:textSize="@dimen/news_text_main"/>

</RelativeLayout>

2 个答案:

答案 0 :(得分:2)

它没有任何问题。 Elevation效果使用所谓的 Key-Light Ambient-Light 。一个位于屏幕正上方(Ambient-Light),另一个位于屏幕上方45°角的Key-Light(Key-Light)。这就是你在滚动时阴影在移动的原因。

<强> TL;博士 阴影不是静态的,而是动态计算的。另见下图解释概念:

material design shadows concept

答案 1 :(得分:0)

我没有发布最终解决方案,但是我正在研究草案。

我了解Android的海拔高度理论,但是对我来说没有任何意义,所以我的想法是听屏幕上内容的滚动并根据该高度调整海拔高度。

public class VerticalScrollListener extends RecyclerView.OnScrollListener {

@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
    super.onScrolled(recyclerView, dx, dy);

    int[] visible = new int[1];
    mLayoutManager.findFirstVisibleItemPositions(visible);
    int[] lastvisible = new int[1];
    mLayoutManager.findLastVisibleItemPositions(lastvisible); 
    for (int i = visible[0]; i<lastvisible[0]; i++){
      RecyclerView.ViewHolder viewHolder = recyclerView.findViewHolderForAdapterPosition(i);
     int[] location = new int[2];
     ((MessageViewHolder)viewHolder).contentView.getLocationOnScreen(location);
     float y = location[1];
     float ratio = y/scheight;
     ((MessageViewHolder)viewHolder).contentView.setElevation(16-14*ratio);
    }

}

@Override
public void onScrollStateChanged(final RecyclerView recyclerView, final int newState) {
    super.onScrollStateChanged(recyclerView, newState);
}}