仿product hunt 头像收起展开的效果

本文介绍如何使用ViewDragHelper实现视图的展开和重叠动画效果。通过自定义DragHelperCallback,控制视图的位置变化,并利用onLayout进行动画实现。文章深入讲解了核心代码的逻辑及其实现细节。
不废话,先看效果

这里写图片描述

思路

view连接view,在没有距离的时候,可以认为是坐标轴为0的时候 view重叠view的时候,可以认为是坐标轴-1的时候
view展开的时候,可以认为坐标轴为1的时候

动画的实现,通过onlayout中space的大小完成view的展开和重叠

ViewDragHelper

如果你还不了解ViewDragHelper,可以先看我之前写的几篇讲ViewDragHelper入门的文章
ViewDragHelper几个方法的理解
ViewDragHelper.CallBack中每个方法的用法
ViewDragHelper详解

主要代码部分

private class DragHelperCallback extends ViewDragHelper.Callback {

        @Override
        public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) {
            //    按比例计算滑动的位移,在maxSpace和minSpace之间
            int minLeft = getCurrentViewLeft(changedView);
            int maxRight = getCurrentViewRight(changedView);
            int step = maxRight - minLeft;
            int halfStep = step / 2;
            int byOriginValue = left - (minLeft + maxRight) / 2;
            double spaceValue = byOriginValue * 1.0 / halfStep * maxSpace;
            mDragOffset = byOriginValue * 1.0 / halfStep;
            space = (int) spaceValue;
            if (space > maxSpace) {
                space = maxSpace;
            }
            if (space < minSpace) {
                space = minSpace;
            }

            if (listener != null) {
                listener.onSlide(mDragOffset);
            }

            requestLayout();
        }

        @Override
        public boolean tryCaptureView(View child, int pointerId) {
            return true;
        }

        @Override
        public int getViewVerticalDragRange(View child) {
            return mVerDragRange;
        }

        @Override
        public int getViewHorizontalDragRange(View child) {
            return mHorDranRange;
        }

        @Override
        public void onViewReleased(View releasedChild, float xvel, float yvel) {
            //   在释放滑动事件后,继续移动view,达到惯性的效果
            int right = 0;
            if (mDragOffset - mDragOffsetLast > 0) {
                right = getCurrentViewRight(releasedChild);
                mDragHelper.settleCapturedViewAt(right, 0);
                invalidate();
                mDragOffsetLast = 1;
            } else {
                right = getCurrentViewLeft(releasedChild);
                mDragHelper.settleCapturedViewAt(right, 0);
                invalidate();
                mDragOffsetLast = -1;
            }
        }

        //  判断滑动的边界,不能出界
        @Override
        public int clampViewPositionHorizontal(View child, int left, int dx) {
            final int newLeft = Math.min(Math.max(left, getCurrentViewLeft(child)), getCurrentViewRight(child));
            return newLeft;
        }
    }

//    探测子View的右边界
    private int getCurrentViewRight(View view) {
        int index = indexOfChild(view);
        int right = view.getWidth() * index + index * maxSpace;
        return right;
    }

    //    探测子View的左边界
    private int getCurrentViewLeft(View view) {
        int index = indexOfChild(view);
        int left = view.getWidth() * index + index * minSpace;
        return left;
    }


    //    让动画持续
    @Override
    public void computeScroll() {
        if (mDragHelper.continueSettling(true)) {
            ViewCompat.postInvalidateOnAnimation(this);
        }
    }

    //    指定滑动到某个位置
    private boolean smoothSlideTo(float slideOffset) {
        int right = slideOffset == 0f ? getCurrentViewLeft(mRightView) : getCurrentViewRight(mRightView);
        if (mDragHelper.smoothSlideViewTo(mRightView, right, 0)) {
            ViewCompat.postInvalidateOnAnimation(this);
            return true;
        }
        return false;
    }
源码

GitHub

计算机技术与测试测量仪器技术的结合,出现了新的测试仪器--虚拟仪器。基于LabVIEW的数据采集系统是第三代自动测试系统的为发展方向数据采集系统可看作是由数据处理部分和数据采集部分组成。在PC机上运用虚拟仪器能共享硬件和软件资源,快速、方便地组建各种数字信号处理系统,并可以方便地利用计算机的强大功能,进行信号分析、数据处理、存储以及图形化显示等,从而实现数据信号的处理。该系统是在NJational InstrumentsCompany推出的一种基于G语言的虚拟仪器软件开发工具 LabVIEW 环境下开发的,针对课题内容编写了数据采集及存储模块,通过对硬件控制程序的编写实现了对非NI驱动硬件的操作,结合具体使用条件编写数据采样程序。系统提供了丰富的数据分析功能,并对系统数据分析功能进行了详细的说明。介绍了数据储存和回放、数据处理、数据采集模块。 数据采集卡部分使用使用DSP来作采集卡CPU具有指令执行厅速度快、总线带宽高、可以完成数据的高速实时处理等优点。最重要的是DSP对于算法的处理有独到的优势,可以在DSP软件中加入一些典型的算法编程,就能够极大的增强系统的信号处理能力。基于以上原因,本设计以TMS320C5402DSP作为采集卡CPU,实现了数据的高速实时传输与处理。 采集卡由DSP完成数字信号处理,FLASH完成系统上电后的的程序加载,通过可编程逻辑器件CPLD完成对DSP外围设备的逻辑控制,利用DSP特有的HPI口与PC进行数据交换。 本文设计了一套基于DSP的数字信号采集卡和基于LabVIEW的PC数据信号处理系统,通过并口实现两者之间的通信,并详细叙述了系统完整的设计过程,从硬件设计和软件设计两方面加以阐述,重点叙述了数字信号采集卡、LabVIEW数据处理和并口通信的设计。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值