返回顶部
首页 > 资讯 > 精选 >Android怎么实现可拖动层叠卡片布局
  • 422
分享到

Android怎么实现可拖动层叠卡片布局

2023-06-25 12:06:06 422人浏览 泡泡鱼
摘要

本篇内容主要讲解“Android怎么实现可拖动层叠卡片布局”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Android怎么实现可拖动层叠卡片布局”吧!公司app要求做一个扭蛋功能,其实就是一个可

本篇内容主要讲解“Android怎么实现可拖动层叠卡片布局”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Android怎么实现可拖动层叠卡片布局”吧!

公司app要求做一个扭蛋功能,其实就是一个可拖动层叠卡片列表,原理还是由一个自定义Recyclerview和LayoutManager来实现

自定义RecyclerView很简单,只是修改touch事件,防止点击到卡片外还被处理的情况

@Override    public boolean onTouchEvent(MotionEvent e) {        if(e.getY()< UIUtil.dip2px(TutuApplication.getInstance().getContext(),95)||e.getY()>getHeight()-UIUtil.dip2px(TutuApplication.getInstance().getContext(),95)){            if(e.getAction()!=MotionEvent.ACTION_UP && e.getAction()!=MotionEvent.ACTION_MOVE) {                return false;            }        }        return super.onTouchEvent(e);    }

实际的层叠效果还是需要LayoutManager来实现

public class SwipeCardLayoutManager extends RecyclerView.LayoutManager {    Context context;    int TRANS_Y_GAP;    public SwipeCardLayoutManager(Context context){        TRANS_Y_GAP= (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,15,                context.getResources().getDisplayMetrics());    }    @Override    public RecyclerView.LayoutParams generateDefaultLayoutParams() {        return new RecyclerView.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,                ViewGroup.LayoutParams.WRAP_CONTENT);    }     @Override    public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {        super.onLayoutChildren(recycler, state);        //1.如何实现层叠效果--cardView.layout(l,t,r,b)        //2.如何让8个条目中的4个展示在RecylerView里面        //1在布局layout之前,将所有的子View先全部detach掉,然后放到Scrap集合里面缓存。        detachAndScrapAttachedViews(recycler);        //2)只将最上面4个view添加到RecylerView容器里面        int itemCount=getItemCount();//8个        int bottomPosition;        if(itemCount< CardConfig.MAX_SHOW_COUNT){            bottomPosition=0;         }else{            bottomPosition=itemCount-CardConfig.MAX_SHOW_COUNT;        }        for(int i=bottomPosition;i<itemCount;i++){            View view=recycler.getViewForPosition(i);            addView(view);            measureChildWithMargins(view,0,0);            int widthSpace=getWidth()-getDecoratedMeasuredWidth(view);            int heightSpace=getHeight()-getDecoratedMeasuredHeight(view);            //摆放cardView            //层叠效果--Scale+TranslationY            //层级的位置关系1/2/3/4            int level=itemCount-i-1;            layoutDecorated(view,                    widthSpace/2,                    heightSpace/2+StatusBarUtil.getStatusBarHeight(TutuApplication.getInstance().getContext()),                    widthSpace/2+getDecoratedMeasuredWidth(view),                    heightSpace/2+StatusBarUtil.getStatusBarHeight(TutuApplication.getInstance().getContext())+getDecoratedMeasuredHeight(view));             if(level>0){                if(level<CardConfig.MAX_SHOW_COUNT){                    view.setTranslationY(CardConfig.TRANS_V_GAP*level*1.3f);                    view.setScaleX(1-CardConfig.SCALE_GAP*level);                    view.setScaleY(1-CardConfig.SCALE_GAP*level);                }            }else {                view.setTranslationY(CardConfig.TRANS_V_GAP*(level-1));                view.setScaleX(1-CardConfig.SCALE_GAP*(level-1));                view.setScaleY(1-CardConfig.SCALE_GAP*(level-1));            }        }     }}

显示出来就是这个样子

Android怎么实现可拖动层叠卡片布局

对于滑动显示下一张,则使用自定义ItemTouchHelper.simpleCallBack来展示

自定义itemTouchHelper.simpleCallBack

public class SwipeCardCallBack extends ItemTouchHelper.SimpleCallback {    private GameGachaAdapter adapter;    private RecyclerView mRv;    private OnSwipeEndListener listener;    private TextView tv;    private int x = 1;    private Context context;     public void refresh(){//        x = 1;//        tv.setText(context.getResources().getString(R.string.explored)+(++x)+"/????");        removeCard();    }    public SwipeCardCallBack(GameGachaAdapter adapter, RecyclerView mRv, TextView view, Context context) {        super(0,                ItemTouchHelper.LEFT | ItemTouchHelper.UP |                        ItemTouchHelper.RIGHT | ItemTouchHelper.DOWN        );        this.adapter = adapter;        this.mRv = mRv;        this.tv = view;        this.context = context;    }    public void addGameGachaList(List<IMulTypeHelper> mDatas){        adapter.addAdapterData(0,mDatas);        adapter.notifyDataSetChanged();        listener.onSwipe();    }    public SwipeCardCallBack(int dragDirs, int swipeDirs) {        super(dragDirs, swipeDirs);    }     public SwipeCardCallBack() {                super(0,                ItemTouchHelper.LEFT | ItemTouchHelper.UP |                        ItemTouchHelper.RIGHT | ItemTouchHelper.DOWN        );    }      @Override    public boolean onMove(RecyclerView recyclerView,                          RecyclerView.ViewHolder viewHolder,                          RecyclerView.ViewHolder target) {        return false;    }     @Override    public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {        //当已经滑动删除了的时候会被回掉--删除数据,循环的效果        removeCard();    }     public void removeCard() {        if(adapter!=null && adapter.getItemCount()>0) {            adapter.removeAdapterData(adapter.getItemCount() - 1);//        mDatas.add(0, remove);            adapter.notifyDataSetChanged();            listener.onSwipe();            if (adapter.getItemCount() == 6) {                listener.onSwipeEnd();            }            tv.setText(context.getResources().getString(R.string.explored) + (++x) + "/????");        }    }     @Override    public void clearView(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {        super.clearView(recyclerView, viewHolder);    }     @Override    public void onChildDraw(canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {        super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);        //监听话滑动的距离--控制动画的执行程度         if(dY == 0f&&!isCurrentlyActive){            int itemcount = recyclerView.getChildCount();            for (int i = 0; i < itemcount; i++) {                //执行                View view = recyclerView.getChildAt(i);                //几个view层叠的效果,错开的效果--便宜动画+缩放动画                int level = itemcount - i - 1;                view.setRotation(0);                if(dX == 0) {                    if(level>0){                        if(level<CardConfig.MAX_SHOW_COUNT){                            view.setTranslationY(CardConfig.TRANS_V_GAP*level*1.3f);                            view.setScaleX(1-CardConfig.SCALE_GAP*level);                            view.setScaleY(1-CardConfig.SCALE_GAP*level);                        }                    }else {                        view.setTranslationY(CardConfig.TRANS_V_GAP*(level-1));                        view.setScaleX(1-CardConfig.SCALE_GAP*(level-1));                        view.setScaleY(1-CardConfig.SCALE_GAP*(level-1));                    }                }            }        }else {            //灵界点            double maxDistance = recyclerView.getWidth() * 1f;            double distance = Math.sqrt(dX * dX)*2;            //动画执行的百分比            double fraction = distance / maxDistance;            if (fraction > 1) {                fraction = 1;            }            int itemcount = recyclerView.getChildCount();            for (int i = 0; i < itemcount; i++) {                //执行                View view = recyclerView.getChildAt(i);                //几个view层叠的效果,错开的效果--便宜动画+缩放动画                int level = itemcount - i - 1;                if(level == 0){//最外层动画                    if(Math.abs(dX) == 1080f && dY == 0f&&!isCurrentlyActive){                        view.setRotation(0);                    }else {                        if(dX<0){                            view.setRotation((float) (360f - (30 * fraction)));                        }else {                            view.setRotation((float) (30 * fraction));                        }                    }                } else if(level ==CardConfig.MAX_SHOW_COUNT-1){//最内层动画                    view.setTranslationY((float) (CardConfig.TRANS_V_GAP*(level-fraction)*1.3f));                    view.setScaleX((float) (1-CardConfig.SCALE_GAP*(level-fraction)));                    view.setScaleY((float) (1-CardConfig.SCALE_GAP*(level-fraction)));                }else if (level < CardConfig.MAX_SHOW_COUNT - 1) {                    view.setTranslationY((float) ((level - (2*fraction)) * CardConfig.TRANS_V_GAP));                    view.setScaleX((float) (1 - CardConfig.SCALE_GAP * level + fraction * (CardConfig.SCALE_GAP*2)));                    view.setScaleY((float) (1 - CardConfig.SCALE_GAP * level + fraction * (CardConfig.SCALE_GAP*2)));                }             }        }     }     @Override    public void onSelectedChanged(@Nullable RecyclerView.ViewHolder viewHolder, int actionState) {        super.onSelectedChanged(viewHolder, actionState);    }     public interface OnSwipeEndListener{        void onSwipeEnd();        void onSwipe();    }    public void setOnSwipeEndListener(OnSwipeEndListener listener){        this.listener = listener;    }}

在Activity中:

private SwipeCardCallBack callback;private ItemTouchHelper helper;  ...helper = new ItemTouchHelper(callback); helper.attachToRecyclerView(swipeFlingAdapterView); callback.setOnSwipeEndListener(new SwipeCardCallBack.OnSwipeEndListener() {            @Override            public void onSwipeEnd() {                swipeFlingAdapterView.suppressLayout(true);                gameGachaRefresh.setClickable(false);                ToastUtils.createToast().showCenter(TutuGameGachaActivity.this,getString(R.string.wait_moment));                presenter.getGameGacha(PRESENTER_LOAD_STATE_REFRESH);            }             @Override            public void onSwipe() {                if(arrayAdapter.getItemCount()>0) {                    swipe();                }            }         });

到此,相信大家对“Android怎么实现可拖动层叠卡片布局”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: Android怎么实现可拖动层叠卡片布局

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

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

猜你喜欢
  • Android实现可拖动层叠卡片布局
    公司app要求做一个扭蛋功能,其实就是一个可拖动层叠卡片列表,原理还是由一个自定义Recyclerview和LayoutManager来实现 自定义RecyclerView很简单,只...
    99+
    2024-04-02
  • Android怎么实现可拖动层叠卡片布局
    本篇内容主要讲解“Android怎么实现可拖动层叠卡片布局”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Android怎么实现可拖动层叠卡片布局”吧!公司app要求做一个扭蛋功能,其实就是一个可...
    99+
    2023-06-25
  • 微信小程序实现卡片层叠滑动
    本文实例为大家分享了微信小程序实现卡片层叠滑动的具体代码,供大家参考,具体内容如下 实现效果: 1.左右滑动时,向相应方向移动一个卡片位置;2.点击某一项时,将点击项位置移动到中间...
    99+
    2024-04-02
  • 微信小程序如何实现卡片层叠滑动
    本篇内容主要讲解“微信小程序如何实现卡片层叠滑动”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“微信小程序如何实现卡片层叠滑动”吧!实现效果:左右滑动时,向相应方向移动一个卡片位置;2.点击某一项...
    99+
    2023-06-30
  • HTML5图片层叠怎么实现
    这篇文章将为大家详细讲解有关HTML5图片层叠怎么实现,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。需要那就做呗。其中有一个页面布局如下所示,  红色方框标注的部分是由三张图片组合而成...
    99+
    2023-06-09
  • ViewPager+RadioGroup实现左右滑动卡片布局
    本文实例为大家分享了ViewPager+RadioGroup实现左右滑动卡片布局的具体代码,供大家参考,具体内容如下 效果如图所示: 1.选择某个界面时,对应的第几个小圆点亮: ...
    99+
    2024-04-02
  • CSS布局技巧:实现堆叠卡片效果的最佳实践
    CSS布局技巧:实现堆叠卡片效果的最佳实践在现代网页设计中,卡片式布局成为了一种非常流行的设计趋势。卡片布局能够有效地展示信息,提供良好的用户体验,并且方便响应式设计。在这篇文章中,我们将分享一些实现堆叠卡片效果的最佳CSS布局技巧,同时提...
    99+
    2023-10-22
    堆叠卡片 最佳实践 CSS布局
  • 如何使用Css Flex 弹性布局实现滑动卡片布局
    在现代的Web开发中,弹性布局(Flexbox)变得越来越流行。它是一种用于定位和布局元素的CSS模块,能够轻松地实现各种复杂的布局效果。本文将介绍如何使用Flex弹性布局实现滑动卡片布局,并提供具体的代码示例。滑动卡片布局是一种常用的UI...
    99+
    2023-10-21
    滑动 弹性布局 卡片布局
  • Android如何实现单页面浮层可拖动view
    这篇文章主要介绍Android如何实现单页面浮层可拖动view,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!需求是需要在一个已经存在的页面添加一个可拖动的浮层广告。使用到的技术:ViewDragHelper效果如图:...
    99+
    2023-05-30
    android view
  • android怎么实现可拖动的浮动view
    本篇内容主要讲解“android怎么实现可拖动的浮动view”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“android怎么实现可拖动的浮动view”吧!业务来源页面最小化后,需要出现一个浮动 ...
    99+
    2023-06-30
  • Android可拖动悬浮窗怎么实现
    要实现在Android中可拖动的悬浮窗,可以按照以下步骤进行:1. 创建一个自定义的`FloatingView`类来实现悬浮窗的视图...
    99+
    2023-08-16
    Android
  • Android 实现卡片堆叠钱包管理动画效果
    目录实现原理:思路:重写adView 方法确保每个子View的测量属性宽度填满父组件重写onLayout 方法是关键源码先上效果图 源码 github.com/woshiwzy/C...
    99+
    2024-04-02
  • Android编程重写ViewGroup实现卡片布局的方法
    本文实例讲述了Android编程重写ViewGroup实现卡片布局的方法。分享给大家供大家参考,具体如下: 实现效果如图: 实现思路 1. 重写onMeasure(int w...
    99+
    2022-06-06
    方法 布局 Android
  • 如何使用Android实现单页面浮层可拖动view
    这篇文章将为大家详细讲解有关如何使用Android实现单页面浮层可拖动view,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。在DragframeLayout中的onTouchEvent一直接收不到触摸消息...
    99+
    2023-05-30
    android view
  • 怎么在css3中利用column实现卡片瀑布流布局
    这篇文章将为大家详细讲解有关怎么在css3中利用column实现卡片瀑布流布局,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。相关属性column-count:想实现的列数,我这里只需要2列c...
    99+
    2023-06-08
  • 如何使用ViewPager+RadioGroup实现左右滑动卡片布局
    小编给大家分享一下如何使用ViewPager+RadioGroup实现左右滑动卡片布局,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!效果如图所示:选择某个界面时,对应的第几个小圆点亮:通过selector制造圆点...
    99+
    2023-06-29
  • Android线性布局怎么实现
    Android线性布局是一种简单但强大的布局方式,可以通过以下步骤实现:1. 打开Android Studio,创建一个新的Andr...
    99+
    2023-10-10
    Android
  • JavaScript怎么实现全屏幻灯片切换动画可拖拽
    这篇文章主要讲解了“JavaScript怎么实现全屏幻灯片切换动画可拖拽”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript怎么实现全屏幻灯片...
    99+
    2024-04-02
  • Android自定义ViewGroup实现可滚动的横向布局(2)
    上一篇文章自定义viewgroup(1)地址://www.jb51.net/article/100608.htm 这里直接代码: package com.example.li...
    99+
    2022-06-06
    布局 Android
  • Android帧式布局怎么实现自动切换颜色
    本篇内容介绍了“Android帧式布局怎么实现自动切换颜色”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!效果:实现:activity_mai...
    99+
    2023-06-30
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作