iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >Android基于reclyview实现列表回弹动画效果
  • 785
分享到

Android基于reclyview实现列表回弹动画效果

2024-04-02 19:04:59 785人浏览 泡泡鱼
摘要

reclyview实现列表回弹动画效果,供大家参考,具体内容如下 1.reclyview列表布局文件 <com.example.demo1.ReboundLayout    

reclyview实现列表回弹动画效果,供大家参考,具体内容如下

1.reclyview列表布局文件

<com.example.demo1.ReboundLayout
        Android:id="@+id/view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#000">

            <androidx.recyclerview.widget.RecyclerView
                android:id="@+id/rv"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:fadingEdgeLength="30px"
                android:requiresFadingEdge="horizontal"/>

</com.example.demo1.ReboundLayout>

2.item布局文件

<LinearLayout xmlns:android="Http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="40px"
    android:layout_gravity="center_vertical">

    <ImageView
        android:id="@+id/card_item_img"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="20dp"
        android:layout_marginRight="20dp"/>

</LinearLayout>

3.适配adapter

public class HomeCardAdapter extends RecyclerView.Adapter<HomeCardAdapter.ViewHolder> {
    private LayoutInflater mInflater;
    private List<Integer> mDatas;
    private OnItemClickListener mOnItemClickListener;
    private Context mContext;

    public HomeCardAdapter(Context context, List<Integer> datats) {
        mInflater = LayoutInflater.from(context);
        mDatas = datats;
        mContext = context;
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        public ViewHolder(View arg0) {
            super(arg0);
        }

        ImageView mImg;
    }

    public interface OnItemClickListener{
        void  onClick(int position);
    }

    public  void  setOnItemClickListener(OnItemClickListener onItemClickListener ){
        this.mOnItemClickListener =onItemClickListener;
    }

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

    
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View view = mInflater.inflate(R.layout.card_item,
                viewGroup, false);
        ViewHolder viewHolder = new ViewHolder(view);

        viewHolder.mImg = (ImageView) view.findViewById(R.id.card_item_img);
        return viewHolder;
    }

    
    @Override
    public void onBindViewHolder(final ViewHolder viewHolder, @SuppressLint("RecyclerView")int i) {
        viewHolder.mImg.setImageResource(mDatas.get(i));
        if( mOnItemClickListener!= null){
            viewHolder.itemView.setOnClickListener( new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    mOnItemClickListener.onClick(i);
                    //卡片点击动画
                    Animation animation = AnimationUtils.loadAnimation(mContext, R.anim.scale_card);
                    viewHolder.itemView.startAnimation(animation);
                }
            });
        }
    }
}

4.自定义弹性view

public class ReboundLayout extends LinearLayout implements NestedScrollingParent {

    private View mHeaderView;
    private View mFooterView;
    private static final int MAX_WIDTH = 200;
    private View mChildView;
    // 解决多点触控问题
    private boolean isRunAnim;
    private boolean isFlag = false;
    private int mDrag = 6;//除数越大可以滑动的距离越短

    public ReboundLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        setOrientation(LinearLayout.HORIZONTAL);
        mHeaderView = new View(context);
        mHeaderView.setBackgroundColor(0xfff);
        mFooterView = new View(context);
        mFooterView.setBackgroundColor(0xfff);
    }

    public boolean isFlag() {
        return isFlag;
    }

    public void setFlag(boolean flag) {
        isFlag = flag;
    }

    @Override
    protected void onFinishInflate() {
        super.onFinishInflate();
        mChildView = getChildAt(0);
        LayoutParams layoutParams = new LayoutParams(MAX_WIDTH, LayoutParams.MATCH_PARENT);
        addView(mHeaderView, 0, layoutParams);
        addView(mFooterView, getChildCount(), layoutParams);
        // 左移
        scrollBy(MAX_WIDTH, 0);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        ViewGroup.LayoutParams params = mChildView.getLayoutParams();
        params.width = getMeasuredWidth();
    }

    
    @Override
    public void onNestedScrollAccepted(View child, View target, int axes) {
    }

    
    @Override
    public boolean onStartNestedScroll(View child, View target, int nestedScrollAxes) {
        if (target instanceof RecyclerView && !isRunAnim) {
            return true;
        }
        return false;
    }

    
    @Override
    public void onStopNestedScroll(View target) {
       startAnimation(new ProgressAnimation());
    }


    
    private class ProgressAnimation extends Animation {
        // 预留
        private float startProgress = 0;
        private float endProgress = 1;

        private ProgressAnimation() {
            isRunAnim = true;
        }

        @Override
        protected void applyTransfORMation(float interpolatedTime, Transformation t) {
            float progress = ((endProgress - startProgress) * interpolatedTime) + startProgress;
            scrollBy((int) ((MAX_WIDTH - getScrollX()) * progress), 0);
            if (progress == 1) {
                //滑动停止
                isRunAnim = false;
                isFlag = false;
            }
        }

        @Override
        public void initialize(int width, int height, int parentWidth, int parentHeight) {
            super.initialize(width, height, parentWidth, parentHeight);
            setDuration(200);
        }
    }


    @Override
    public void onNestedScroll(View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int
            dyUnconsumed) {
    }

    @Override
    public void onNestedPreScroll(View target, int dx, int dy, int[] consumed) {
        // 如果在自定义ViewGroup之上还有父View交给我来处理
        getParent().requestDisallowInterceptTouchEvent(true);
        // dx>0 往左滑动 dx<0往右滑动
        boolean hiddenLeft = dx > 0 && getScrollX() < MAX_WIDTH && !ViewCompat
                .canScrollHorizontally(target, -1);
        boolean showLeft = dx < 0 && !ViewCompat.canScrollHorizontally(target, -1);
        boolean hiddenRight = dx < 0 && getScrollX() > MAX_WIDTH && !ViewCompat
                .canScrollHorizontally(target, 1);
        boolean showRight = dx > 0 && !ViewCompat.canScrollHorizontally(target, 1);
        if (hiddenLeft || showLeft || hiddenRight || showRight) {
            scrollBy(dx / mDrag, 0);
            consumed[0] = dx;
        }

        // 限制错位问题
        if (dx > 0 && getScrollX() > MAX_WIDTH && !ViewCompat.canScrollHorizontally(target, -1)) {
            scrollTo(MAX_WIDTH, 0);
        }
        if (dx < 0 && getScrollX() < MAX_WIDTH && !ViewCompat.canScrollHorizontally(target, 1)) {
            scrollTo(MAX_WIDTH, 0);
        }

        isFlag = true;
    }

    @Override
    public boolean onNestedFling(View target, float velocityX, float velocityY, boolean consumed) {
        return false;
    }


    @Override
    public boolean onNestedPreFling(View target, float velocityX, float velocityY) {
        // 当RecyclerView在界面之内交给它自己惯性滑动
        if (getScrollX() == MAX_WIDTH) {
            return false;
        }
        return true;
    }

    @Override
    public int getNestedScrollAxes() {
        return 0;
    }

    
    @Override
    public void scrollTo(int x, int y) {
        if (x < 0) {
            x = 0;
        } else if (x > MAX_WIDTH * 2) {
            x = MAX_WIDTH * 2;
        }
        super.scrollTo(x, y);
    }
}

5.activity调用

public class MainActivity extends AppCompatActivity {
    private List<Integer> mDatas;
    private RecyclerView mRecyclerView;
    private HomeCardAdapter mAdapter;
    private ReboundLayout movingView;
    private LinearLayout linearLayout;

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

        initData();

        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
        linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
        mRecyclerView.setLayoutManager(linearLayoutManager);
        //设置适配器
        mAdapter = new HomeCardAdapter(this, mDatas);
        mRecyclerView.setAdapter(mAdapter);
        mAdapter.setOnItemClickListener(new HomeCardAdapter.OnItemClickListener() {
            @Override
            public void onClick(int position) {
                switch (position){
                    case 0:
                        Toast.makeText(MainActivity.this, "第"+position+"个", Toast.LENGTH_SHORT).show();
                        break;
                    case 1:
                        Toast.makeText(MainActivity.this, "第"+position+"个", Toast.LENGTH_SHORT).show();
                        break;
                    case 2:
                        Toast.makeText(MainActivity.this, "第"+position+"个", Toast.LENGTH_SHORT).show();
                        break;
                    case 3:
                        Toast.makeText(MainActivity.this, "第"+position+"个", Toast.LENGTH_SHORT).show();
                        break;
                    case 4:
                        Toast.makeText(MainActivity.this, "第"+position+"个", Toast.LENGTH_SHORT).show();
                        break;
                    case 5:
                        Toast.makeText(MainActivity.this, "第"+position+"个", Toast.LENGTH_SHORT).show();
                        break;
                    case 6:
                        Toast.makeText(MainActivity.this, "第"+position+"个", Toast.LENGTH_SHORT).show();
                        break;
                    case 7:
                        Toast.makeText(MainActivity.this, "第"+position+"个", Toast.LENGTH_SHORT).show();
                        break;
                }
            }
        });
        mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(@NonNull @NotNull RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
                if (newState == RecyclerView.SCROLL_STATE_IDLE && movingView.isFlag()) {
                    if (!recyclerView.canScrollHorizontally(1)) {
                        //回弹动画
                        springAnim(movingView,-100,0,200,6);
                    } else if (!recyclerView.canScrollHorizontally(-1)) {
                        springAnim(mRecyclerView,100,0,200,6);
                    }
                }
                movingView.setFlag(false);
            }
        });
    }

    private void initData() {
        movingView = findViewById(R.id.view);
        linearLayout = findViewById(R.id.home_card_layout);
        mRecyclerView = findViewById(R.id.rv);
        mDatas = new ArrayList<>(Arrays.asList(R.drawable.home_control,R.drawable.home_navigation,R.drawable.home_media,
                R.drawable.home_hvac,R.drawable.home_energy,R.drawable.home_account,R.drawable.home_iot));
    }

    
    private void springAnim(final View view,float from,float to,double tension,double friction){
        SpringSystem system = SpringSystem.create();
        Spring spring = system.createSpring();
        spring.setCurrentValue(from);
        spring.setSprinGConfig(new SpringConfig(tension, friction));
        spring.addListener(new SimpleSpringListener(){
            @Override
            public void onSpringUpdate(Spring spring) {
                view.setTranslationX((float) spring.getCurrentValue());
            }
        });
        spring.setEndValue(to);
    }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: Android基于reclyview实现列表回弹动画效果

本文链接: https://www.lsjlt.com/news/146439.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android基于reclyview实现列表回弹动画效果
    reclyview实现列表回弹动画效果,供大家参考,具体内容如下 1.reclyview列表布局文件 <com.example.demo1.ReboundLayout     ...
    99+
    2024-04-02
  • 基于Vue3实现列表虚拟滚动效果
    目录前言完成效果思路和需要解决的问题vue3+setup 写的组件使用组件前言 近期在做一个网页播放器项目中,用到很多需要展示歌单的列表 一个歌单动辄千百首歌曲,页面中的元素太多导致...
    99+
    2024-04-02
  • Android列表实现单选点击缩放动画效果
    recycleView单选的时候,一般的处理就是选中的item做个stroke或者字体颜色改变,但要提升用户体验就得加点动画了。也就是点击选中的元素放大,同时之前选中的item缩小,...
    99+
    2024-04-02
  • Android实现越界回弹效果
    本文实例为大家分享了Android实现越界回弹效果的具体代码,供大家参考,具体内容如下 1、直接上图: 2、直接上代码 public class DampingReboundLay...
    99+
    2024-04-02
  • 基于WPF如何实现3D画廊动画效果
    本篇内容介绍了“基于WPF如何实现3D画廊动画效果”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!接下来想做一个图廊,所以并没有必要用立方体,...
    99+
    2023-07-05
  • Android实现毛玻璃效果弹出菜单动画
    本文实例为大家分享了Android实现毛玻璃效果弹出菜单动画的具体代码,供大家参考,具体内容如下 仿ios上屏幕下方向上滑出来的一个模糊菜单,效果如下 原理很简单,页面上原来有...
    99+
    2022-11-13
    Android毛玻璃效果 Android毛玻璃菜单 Android弹出菜单
  • JetpackCompose实现列表和动画效果详解
    目录创建一个列表消息卡片可交互的动画效果创建一个列表消息卡片 到目前为止,我们只有一个消息的卡片,看上去有点单调,所以让我们来改善它,让它拥有多条信息。我们需要创建一个能够显示多条消...
    99+
    2024-04-02
  • Android Flutter实现自由落体弹跳动画效果
    目录粒子运动概念如何保持持续运动 创建粒子对象创建粒子控制器初始化粒子创建画板多粒子实现八大行星加速度自由落体弹跳总结粒子运动概念 粒子运动是将对象按照一定物理公式进行的自...
    99+
    2022-11-13
    Android Flutter自由落体弹跳动画 Flutte 弹跳动画 Flutter 动画
  • Android列表怎么实现单选点击缩放动画效果
    本篇内容介绍了“Android列表怎么实现单选点击缩放动画效果”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!recycleView单选的时候...
    99+
    2023-06-20
  • Android实现列表元素动态效果
    目录前言AnimatedList 介绍元素的插入和删除使用 GlobalKey 获取 AnimatedListState总结前言 列表是移动应用中用得最多的组件了,我们也会经常对列表...
    99+
    2024-04-02
  • 基于Vue3实现旋转木马动画效果
    做的比较丑 最后图片 本来打算用vue-carousel-3d这个组件的,但是这个组件一直报源码错误,修改了半天也没有解决 效果图 实现代码 使用了swiper组件 html部分...
    99+
    2024-04-02
  • 基于Flutter实现爱心三连动画效果
    目录前言Animation 简介AnimationController 简介应用 - 爱心三连总结前言 我们开始 Flutter 动画相关篇章之旅,在应用中通过动效能够给用户带来更愉...
    99+
    2024-04-02
  • 怎么在Android中使用ScrollView实现一个下拉弹回动画效果
    本篇文章给大家分享的是有关怎么在Android中使用ScrollView实现一个下拉弹回动画效果,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Android是什么Android...
    99+
    2023-05-30
    android scrollview
  • JavaScript如何实现反弹动画效果
    小编给大家分享一下JavaScript如何实现反弹动画效果,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!代码如下:<!DO...
    99+
    2024-04-02
  • Android自定义scrollview实现回弹效果
    在ios手机上经常看到页面上下滑动回弹效果,安卓中没有原生控件支持,这里自己就去自定义一个scrollview实现回弹效果 1. 新建MyScrollView并继承ScrollVie...
    99+
    2024-04-02
  • Android自定义View实现竖向滑动回弹效果
    本文实例为大家分享了Android自定义View实现滑动回弹的具体代码,供大家参考,具体内容如下 前言 Android 页面滑动的时候的回弹效果 一、关键代码 public clas...
    99+
    2024-04-02
  • Android Scroller实现弹性滑动效果
    本文实例为大家分享了Android Scroller实现弹性滑动的具体代码,供大家参考,具体内容如下 首先看下实现效果,可以看到当我们手指松开时图片会逐渐滑动到初始位置,而不是直接跳...
    99+
    2024-04-02
  • 基于WPF实现3D画廊动画效果的示例代码
    接下来想做一个图廊,所以并没有必要用立方体,只需做一些“墙壁”就行了。 而在一个平面上建起另一个矩形的平面,实则非常容易,只需输入墙角的两点和高度就可以了,这...
    99+
    2023-02-28
    WPF实现3D画廊效果 WPF 3D画廊 WPF 3D
  • Android如何实现列表元素动态效果
    这篇文章主要介绍了Android如何实现列表元素动态效果的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Android如何实现列表元素动态效果文章都会有所收获,下面我们一起来看看吧。前言列表是移动应用中用得最多的...
    99+
    2023-06-29
  • css怎么实现弹跳球动画效果
    小编给大家分享一下css怎么实现弹跳球动画效果,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!   1、定义动画关键帧   对...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作