平滑移动
想要实线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的距离实现渐变透明的动画效果