关于#android#的问题:我想做到他这种折叠效果

这是小米标签,我想做到他这种折叠效果,该怎么实现?十分感谢。
网上的那些CoordinateLayout之类的我都试过了,根本不是一个效果。

img

这个好像类似,可以参考一下
https://www.cnblogs.com/fdsf/p/15799998.html

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这篇博客: Android布局- CoordinateLayout吸顶效果中的 02 相关代码  部分也许能够解决你的问题。
  • 以下回答由chatgpt基于相关博客总结生成:

    首先,要实现折叠效果的Android布局,你可以尝试使用CollapsingToolbarLayout和NestedScrollView。

    1. 在你的项目中,确保已经添加了Design Support Library依赖。在app build.gradle文件中添加以下依赖:
    implementation 'com.google.android.material:material:1.2.0-alpha02'
    
    1. 在布局文件中,创建一个CoordinatorLayout作为根布局。CoordinatorLayout是一个可以协调子视图之间交互的容器。
    <androidx.coordinatorlayout.widget.CoordinatorLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <!-- 添加其他子视图 -->
    
    </androidx.coordinatorlayout.widget.CoordinatorLayout>
    
    1. 在CoordinatorLayout中添加一个AppBarLayout和一个CollapsingToolbarLayout。AppBarLayout是一个可以响应滚动的容器,CollapsingToolbarLayout提供了折叠效果。
    <androidx.coordinatorlayout.widget.CoordinatorLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <com.google.android.material.appbar.AppBarLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
    
            <com.google.android.material.appbar.CollapsingToolbarLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content">
    
                <!-- 添加Toolbar和其他折叠内容 -->
    
            </com.google.android.material.appbar.CollapsingToolbarLayout>
    
        </com.google.android.material.appbar.AppBarLayout>
    
        <!-- 添加其他子视图 -->
    
    </androidx.coordinatorlayout.widget.CoordinatorLayout>
    
    1. 在CollapsingToolbarLayout中添加一个Toolbar和其他折叠内容。你可以自定义Toolbar的样式和折叠内容的布局。
    <com.google.android.material.appbar.CollapsingToolbarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    
        <androidx.appcompat.widget.Toolbar
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            app:layout_collapseMode="pin"
            />
    
        <!-- 添加其他折叠内容 -->
    
    </com.google.android.material.appbar.CollapsingToolbarLayout>
    
    1. 在AppBarLayout和CollapsingToolbarLayout之后,添加一个NestedScrollView作为主要内容的容器。NestedScrollView是一个可以嵌套滚动的容器。
    <androidx.coordinatorlayout.widget.CoordinatorLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <com.google.android.material.appbar.AppBarLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
    
            <!-- AppBarLayout内容 -->
    
        </com.google.android.material.appbar.AppBarLayout>
    
        <com.google.android.material.appbar.CollapsingToolbarLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
    
            <!-- CollapsingToolbarLayout内容 -->
    
        </com.google.android.material.appbar.CollapsingToolbarLayout>
    
        <androidx.core.widget.NestedScrollView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_behavior="@string/appbar_scrolling_view_behavior">
    
            <!-- 主要内容 -->
    
        </androidx.core.widget.NestedScrollView>
    
    </androidx.coordinatorlayout.widget.CoordinatorLayout>
    
    1. 在NestedScrollView中添加你想要展示的主要内容,可以是一些文本、图片或其他视图。请根据你的实际需求进行布局。

    根据以上布局,你可以实现一个具有折叠效果的Android布局。请注意,你可能需要对布局进行一些样式和参数的调整以适应你的需求。

    这是一个基本的布局示例,如果你想要实现与示例图片相似的效果,你可能还需要更多的代码和调整。具体的实现方式取决于你的需求和设计。

    希望这个解决方案对你有帮助!如果你有任何问题,请随时问我。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

可以使用RecyclerView

  1. 一个用于显示标签的布局文件item_label.xml
<!-- item_label.xml -->
<TextView
    android:id="@+id/text_label"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:padding="8dp"
    android:textColor="#000"
    android:textSize="16sp"
    android:background="@drawable/bg_label"
    android:gravity="center"
    android:clickable="true"
    android:focusable="true"
    android:onClick="onLabelClick"/>

2.一个用于显示所有标签的RecyclerView

<!-- activity_main.xml -->
<androidx.recyclerview.widget.RecyclerView
    android:id="@+id/recycler_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>
  1. 一个适配器LabelAdapter用于管理标签的展开与折叠
public class LabelAdapter extends RecyclerView.Adapter<LabelAdapter.LabelViewHolder> {

    private List<String> labels;
    private Set<Integer> collapsedPositions;

    public LabelAdapter(List<String> labels) {
        this.labels = labels;
        this.collapsedPositions = new HashSet<>();
    }

    @NonNull
    @Override
    public LabelViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_label, parent, false);
        return new LabelViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(@NonNull LabelViewHolder holder, int position) {
        String label = labels.get(position);
        holder.textLabel.setText(label);
        holder.itemView.setActivated(collapsedPositions.contains(position));
    }

    @Override
    public int getItemCount() {
        return labels.size();
    }

    public void toggleLabel(int position) {
        if (collapsedPositions.contains(position)) {
            collapsedPositions.remove(position);
        } else {
            collapsedPositions.add(position);
        }
        notifyItemChanged(position);
    }

    static class LabelViewHolder extends RecyclerView.ViewHolder {
        TextView textLabel;

        public LabelViewHolder(@NonNull View itemView) {
            super(itemView);
            textLabel = itemView.findViewById(R.id.text_label);
        }
    }
}
  1. 在MainActivity中设置RecyclerView和适配器,并在标签点击事件中调用适配器的toggleLabel方法来实现折叠效果
public class MainActivity extends AppCompatActivity {

    private RecyclerView recyclerView;
    private LabelAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        recyclerView = findViewById(R.id.recycler_view);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));

        List<String> labels = Arrays.asList("标签1", "标签2", "标签3", "标签4", "标签5");
        adapter = new LabelAdapter(labels);
        recyclerView.setAdapter(adapter);
    }

    public void onLabelClick(View view) {
        int position = recyclerView.getChildAdapterPosition(view);
        adapter.toggleLabel(position);
    }
}

监听拖拉动作,然后设置组件移动

效果图 https://github.com/Ramotion/folding-cell-android/raw/master/folding_cell_preview.gif
详细参考 https://github.com/Ramotion/folding-cell-android