View的动画效果

平滑移动

想要实线View的平滑移动, 需要通过setTranslationY()和setTranslationX()方法.
一般在View中可以直接使用,也可以直接用ViewHelper中的方法

具体使用方法如下:

    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);

        mLastDy = dy;
        //获得的是setTranslationY的值,如果没有set过就是0
        float transY = mTargetView.getTranslationY();
        float newTransY = transY + dy;
        int distance = mTargetView.getHeight();

        Log.d(TAG, "+++++++++++++++++++++++++++++++");
        Log.d(TAG, "targetView top: " + mTargetView.getTop());
        Log.d(TAG, "targetView bottom: " + mTargetView.getBottom());
        Log.d(TAG, "targetView height: " + mTargetView.getHeight());
        Log.d(TAG, "targetView translationY: " + mTargetView.getTranslationY());
        Log.d(TAG, "targetView translationX: " + mTargetView.getTranslationX());
        Log.d(TAG, "targetView getDistance: " + getDistance());
        Log.d(TAG, "-------------------------------");

        if (newTransY > distance)
            newTransY = distance;
        else if (newTransY == distance)
        {
            return;
        } else if (newTransY < 0)
        {
            newTransY = 0;
        } else if (newTransY == 0)
            return;

       //控制View平滑移动
        mTargetView.setTranslationY(newTransY);
    }
    private int getDistance() {
        ViewParent viewParent = mTargetView.getParent();
        if (viewParent instanceof View)
        {
            Log.d(TAG, "getDistance: " + ((View) viewParent).getHeight());
            Log.d(TAG, "getDistance: " + mTargetView.getTop());
            return (((View) viewParent).getHeight() - mTargetView.getTop());
        }
        return 0;
    }

Log显示的结果是:

06-12 15:31:56.710 D/OnBottomScrollListener( 5901): +++++++++++++++++++++++++++++
06-12 15:31:56.710 D/OnBottomScrollListener( 5901): targetView top: 1383
06-12 15:31:56.710 D/OnBottomScrollListener( 5901): targetView bottom: 1533
06-12 15:31:56.710 D/OnBottomScrollListener( 5901): targetView height: 150
06-12 15:31:56.710 D/OnBottomScrollListener( 5901): targetView translationY: 0.0
06-12 15:31:56.710 D/OnBottomScrollListener( 5901): targetView translationX: 0.0
06-12 15:31:56.710 D/OnBottomScrollListener( 5901): getDistance: 1533
06-12 15:31:56.710 D/OnBottomScrollListener( 5901): getDistance: 1383
06-12 15:31:56.710 D/OnBottomScrollListener( 5901): targetView getDistance: 150
06-12 15:31:56.710 D/OnBottomScrollListener( 5901): -----------------------------
06-12 15:31:56.730 D/OnBottomScrollListener( 5901): +++++++++++++++++++++++++++++
06-12 15:31:56.730 D/OnBottomScrollListener( 5901): targetView top: 1383
06-12 15:31:56.730 D/OnBottomScrollListener( 5901): targetView bottom: 1533
06-12 15:31:56.730 D/OnBottomScrollListener( 5901): targetView height: 150
06-12 15:31:56.730 D/OnBottomScrollListener( 5901): targetView translationY: 1.0
06-12 15:31:56.730 D/OnBottomScrollListener( 5901): targetView translationX: 0.0
06-12 15:31:56.730 D/OnBottomScrollListener( 5901): getDistance: 1533
06-12 15:31:56.730 D/OnBottomScrollListener( 5901): getDistance: 1383
06-12 15:31:56.730 D/OnBottomScrollListener( 5901): targetView getDistance: 150
06-12 15:31:56.730 D/OnBottomScrollListener( 5901): -----------------------------
06-12 15:31:56.740 D/OnBottomScrollListener( 5901): +++++++++++++++++++++++++++++
06-12 15:31:56.740 D/OnBottomScrollListener( 5901): targetView top: 1383
06-12 15:31:56.740 D/OnBottomScrollListener( 5901): targetView bottom: 1533
06-12 15:31:56.740 D/OnBottomScrollListener( 5901): targetView height: 150
06-12 15:31:56.740 D/OnBottomScrollListener( 5901): targetView translationY: 2.0
06-12 15:31:56.740 D/OnBottomScrollListener( 5901): targetView translationX: 0.0
06-12 15:31:56.740 D/OnBottomScrollListener( 5901): getDistance: 1533
06-12 15:31:56.740 D/OnBottomScrollListener( 5901): getDistance: 1383
06-12 15:31:56.740 D/OnBottomScrollListener( 5901): targetView getDistance: 150
06-12 15:31:56.740 D/OnBottomScrollListener( 5901): -----------------------------

可以看出getTop之类的都是获取相对于父控件的位置. 我们将控件移动, 并不影响其属性值.
如果想要获取View的绝对位置, 需要使用getLocationInWindow和getLocationOnScreen

    private void getLocationForView(View view) {
        int winPos[] = new int[2];
        int screenpos[] = new int[2];

        view.getLocationInWindow(winPos);
        view.getLocationOnScreen(screenpos);
        Log.d(TAG, "winPos: " + winPos[0] + ", " + winPos[1]);
        Log.d(TAG, "scnpos: " + screenpos[0] + ", " + screenpos[1]);
    }

如果手指移动距离很小,可以借助动画效果决定是否继续让控件消失或者显示

ObjectAnimator animator = ObjectAnimator.ofFloat(view, propertyName, start, end);
animator.start();

如果直接使用ViewHelper会更简单

ViewHelper.setTranslationY(view, translationY);

透明效果

使用方法如下

ViewHelper.setAlpha(view, alpha);

一般都在scroll中根据scroll的距离实现渐变透明的动画效果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值