【问题标题】:How to trigger the over scroll animation by code?如何通过代码触发过度滚动动画?
【发布时间】:2018-06-16 10:01:55
【问题描述】:

我正在尝试通过代码触发 ListView 上的过度滚动动画。

Ripple 或 Glow(你怎么称呼它?)应该出现在边缘。

我尝试了 ListView 中的所有功能,如 scroll* 或 scrollSmooth*,它们都不能触发动画。

我也尝试了一些可以触发波纹背景动画的解决方案,但它与这种边缘效果不一样。

我是 Android 新手。有什么方法请告诉我,谢谢。

我也尝试过使用onDraw(Canvas canvas),因为我没有找到任何解决方案。因为我总是在iOS上做这种事情,所以我可以把效果画成动画。但是这里还有一个问题,绘制速度超低,不知道为什么,就是stackoverflow上的一些典型的绘制代码。当我稍后开始视图转换时,一切都搞砸了。

【问题讨论】:

    标签: android listview animation android-canvas overscroll


    【解决方案1】:

    我建议您使用RecyclerView 来代替您的目的。默认支持“Overscroll”动画。

    RecyclerView 在某种程度上与ListView 非常相似,但它可以更轻松地处理动画或强制您使用ViewHolder Pattern。此外,它比ListView 更灵活。

    但是在我个人看来,在简单的用例中使用 ListView 而不是 RecyclerView 仍然可以。

    那么创建一个需要哪些步骤?

    添加依赖

    首先将依赖项添加到您的app.gradle 文件中。您将在"Gradle Scripts -> build.gradle (Module: app)" 下找到此文件,或者只需按TAB twice 然后在搜索菜单中输入 gradle(在搜索文件时非常有用:))。在那里添加以下依赖:implementation 'com.android.support:recyclerview-v7:26.1.0'

    或者,您可以通过搜索(左上角)将 RecyclerView 从 Designer 拖放到您的布局(可以通过转到您的 layout.xml 文件并切换到 Design Tab 来找到设计器)。这将自动为您添加依赖项。

    创建布局

    与 ListView 相同(注意:本示例不使用ConstraintLayout作为父级ViewGroup):

        <android.support.v7.widget.RecyclerView
        android:id="@+id/rvExample"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
    

    我不知道您目前是否使用ConstraintLayout,但您一定要检查一下:)。

    适配器说明

    public class RecyclerViewAdapter extends RecyclerView.Adapter<ExampleViewHolder> {
    private List<String> mData;
    private LayoutInflater mInflater;
    
    RecyclerViewAdapter(List<String> data, LayoutInflater inflater) {
        mData = data;
        mInflater = inflater;
    }
    
    @Override
    public ExampleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        return new ExampleViewHolder(mInflater.inflate(R.layout.my_layout, parent, false));
    }
    
    @Override
    public void onBindViewHolder(ExampleViewHolder holder, int position) {
        holder.getTvText().setText(mData.get(position));
    }
    
    @Override
    public int getItemCount() {
        return mData.size();
    }
    }
    

    onCreateViewHolder:正如它已经说过的,必须创建一个新的ViewHolder不会在每次滚动时在屏幕上弹出新项目时调用此函数

    onBindViewHolder:必须更新作为参数给出的ViewHolder 的数据。

    getItemCount:这个RecyclerView 包含多少个项目?

    ViewHolder

    class ExampleViewHolder extends RecyclerView.ViewHolder {
    private TextView mTvText;
    
        public ExampleViewHolder(View itemView) {
            super(itemView);
            mTvText = itemView.findViewById(R.id.tv_text);
        }
    
        public TextView getTvText() {
            return mTvText;
        }
    }
    

    您只需提取视图,以便在调用 onBindViewHolder 方法时更新它们。它的布局:

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent" android:layout_height="56dp">
    <TextView
        android:id="@+id/tv_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    </android.support.constraint.FrameLayout>
    

    完成 现在您只需将LayoutManagerAdapter 设置为您的RecyclerView,瞧! LayoutManager 只是告诉RecyclerView 应该如何安排这些项目。好的,现在让我们结束:

    mRvExample.setHasFixedSize(true); //set this if every item has the same size - performance gain
    mRvExample.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
    mRvExample.setAdapter(new RecyclerViewAdapter(Arrays.asList("asdf","asdfsdf"), getLayoutInflater());
    

    虽然我无法使用ListView 直接解决您的问题,但我希望我仍然能够帮助您。由于我不知道您处于哪个级别,我希望我也可以包含有关如何设置基本RecyclerView 的描述。您应该查看它以获得更深入的了解的有用链接是:

    基础描述: https://developer.android.com/training/material/lists-cards.html

    谈论进入动画: https://proandroiddev.com/enter-animation-using-recyclerview-and-layoutanimation-part-1-list-75a874a5d213

    添加点击:RecyclerView onClick

    使用 Kotlin:https://antonioleiva.com/recyclerview-adapter-kotlin/

    物品装饰:https://www.bignerdranch.com/blog/a-view-divided-adding-dividers-to-your-recyclerview-with-itemdecoration/

    Pro Recycler查看谈话:https://www.youtube.com/watch?v=KhLVD6iiZQs

    【讨论】:

    • 谢谢,但你没有回答我的问题。我知道recycleview,它与iOS 上的CollectionView 非常相似。但这不是我想要做的。
    • 对不起 :/ 但是你为什么要使用 ListView?我会说很难重新创建。这个“保险杠”对于不同的速度有不同的曲线,并且根据您开始运动的位置,曲线的尖端将相应地移动到该初始位置(在 y 轴上)。我不能向你保证,但我可能会看看它,因为这听起来像是一个有趣的问题需要解决。但是,我至少要今天,如果不是更多,可能明天,因为我有点忙:/
    • 对不起,我认为这是滚动视图上的常见动画,不太确定。所以,我只选择其中一个来测试,listview。 ?
    • 没试过但也许你应该看看这个:)? stackoverflow.com/questions/7201907/…
    猜你喜欢
    • 1970-01-01
    • 2016-04-29
    • 1970-01-01
    • 2022-09-24
    • 2012-03-29
    • 2018-02-21
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多