在我们开发android app时,会有非常多效果都须要模仿IOS,近期在做一个页面时,当中用到了 ScrollView,但要做成IOS那种在ScrollView滑动时。浮在ScrollView的功能button要隐藏,当滑动结束后,功能button又要显示出来。效果例如以下图所看到的:
gif实在是不好搞,所以仅仅能截个静态图来表示一下,当ScrollView滑动时。浮在最以下的button会以动画的形式隐藏。当停止滑动时,又会已动画的形式回到原位置。
思路:当监听到ScrollView滑动时,播放属性动画隐藏。当滑动结束的时候播放相反的动画。使View回到原位置。
代码例如以下:package view;
/**********************************************************
* @文件名:CustomScrollView.java
* @文件作者:rzq
* @创建时间:2015年7月7日 下午2:20:16
* @文件描写叙述:滑动隐藏ScrollView
* @改动历史:2015年7月7日创建初始版本号
**********************************************************/
public class CustomScrollView extends ScrollView
{
/**
* UI
*/
private View contentView;
/**
* data
*/
private ValueAnimator apperaAnim;
private ValueAnimator hiddenAnim;
private int downScrollY;
private int moveScrollY;
private boolean isHidding;
public CustomScrollView(Context context, AttributeSet attrs)
{
super(context, attrs);
}
@Override
protected void onFinishInflate()
{
if (getChildCount() > 0)
{
contentView = getChildAt(0);
}
}
@Override
public boolean onTouchEvent(MotionEvent ev)
{
switch (ev.getAction())
{
case MotionEvent.ACTION_DOWN:
downScrollY = getScrollY();
break;
case MotionEvent.ACTION_MOVE:
moveScrollY = getScrollY();
if (moveScrollY != downScrollY)
{
startHiddenAnimation();
}
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
moveScrollY = 0;
downScrollY = 0;
break;
}
return super.onTouchEvent(ev);
}
public void setAnimationView(final View animationView)
{
/**
* 创建动画
*/
hiddenAnim = ValueAnimator.ofFloat(0, animationView.getHeight());
hiddenAnim.setDuration(500);
hiddenAnim.setTarget(animationView);
hiddenAnim.addUpdateListener(new AnimatorUpdateListener()
{
@Override
public void onAnimationUpdate(ValueAnimator animation)
{
animationView.setTranslationY((Float) animation.getAnimatedValue());
}
});
hiddenAnim.addListener(new AnimatorListenerAdapter()
{
@Override
public void onAnimationEnd(Animator animation)
{
startApperaAnimation();
}
@Override
public void onAnimationStart(Animator animation)
{
isHidding = true;
}
});
apperaAnim = ValueAnimator.ofFloat(animationView.getHeight(), 0);
apperaAnim.setDuration(500);
apperaAnim.setTarget(animationView);
apperaAnim.addUpdateListener(new AnimatorUpdateListener()
{
@Override
public void onAnimationUpdate(ValueAnimator animation)
{
animationView.setTranslationY((Float) animation.getAnimatedValue());
}
});
apperaAnim.addListener(new AnimatorListenerAdapter()
{
@Override
public void onAnimationEnd(Animator animation)
{
isHidding = false;
}
@Override
public void onAnimationStart(Animator animation)
{
}
});
}
private void startHiddenAnimation()
{
if (!hiddenAnim.isRunning() && !isHidding)
{
hiddenAnim.start();
}
}
private void startApperaAnimation()
{
if (!apperaAnim.isRunning())
{
apperaAnim.start();
}
}
/**
* 是否直接滑动究竟部
*/
protected boolean isScrollDown()
{
return getHeight() + getScrollY() == contentView.getHeight();
}
/**
* 是否直接滑到顶部
*/
protected boolean isScrollUp()
{
return getScrollY() == 0;
}
}
/**
* 在Activity中使用
*/
public class CustomActivity extends Activity
{
private TextView textView;
private CustomScrollView2 scrollView;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.custom_scrollview_layout);
scrollView = (CustomScrollView2) findViewById(R.id.scoll_view);
textView = (TextView) findViewById(R.id.animation_view);
}
@Override
public void onWindowFocusChanged(boolean hasFocus)
{
super.onWindowFocusChanged(hasFocus);
if (hasFocus)
{
scrollView.setAnimationView(textView);
}
}
} 最后:主要就使用用了一个属性动画。属性动画还是非常重要的,一定的学会并熟练应用。