效果图如下:
方法一(实现原理,主要依靠移动动画<TranslateAnimation>),主要代码如下:
private OnTouchListener gonggaoOnTouch() {
return new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: {
break;
}
case MotionEvent.ACTION_UP: {
if (mAdsV.getTop() == mSlipRl.getTop() && moveY < 0) {
topTag();
} else if (moveY < -200) {
topTag();
} else {
nextTag();
}
break;
}
}
gestureDetector.onTouchEvent(event);
return true;
}
private void topTag() {
animBuilder.setDurationMillis(400).setFromYValue(formY)
.setToYValue(mAdsV.getTop() - mSlipRl.getTop());
bgMoveAnim = animBuilder.build();
bgMoveAnim.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationRepeat(Animation animation) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationEnd(Animation animation) {
// TODO Auto-generated method stub
mSlipRl.clearAnimation();
setLayout(mSlipRl, 0, mAdsV.getTop(), 0);
mSlipRl.invalidate();
}
});
mSlipRl.startAnimation(bgMoveAnim);
}
private void nextTag() {
animBuilder.setDurationMillis(400).setFromYValue(formY)
.setToYValue(mAdsV.getBottom() - mSlipRl.getTop());
bgMoveAnim = animBuilder.build();
bgMoveAnim.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationRepeat(Animation animation) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationEnd(Animation animation) {
// TODO Auto-generated method stub
mSlipRl.clearAnimation();
setLayout(mSlipRl, 0, mAdsV.getBottom(), 0);
mSlipRl.invalidate();
}
});
mSlipRl.startAnimation(bgMoveAnim);
}
};
}
方法二,主要代码如下:
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
lastY = event.getY();
if(null==mLocationSlip||null==mSlipDown||null==mSlipMove){
mLocationSlip = this.findViewById(R.id.location_slip);
mSlipDown = this.findViewById(R.id.down_slip);
mSlipMove = this.findViewById(R.id.move_slip);
}
top = mSlipMove.getTop();
bottom = mSlipDown.getBottom();
if (top <= lastY && lastY <= (bottom + top)) {
isMove = true;
return true;
}
case MotionEvent.ACTION_MOVE:
if (isMove) {
float newY = event.getY();
int ay = (int) ((lastY - newY) * 0.5);
lastY = newY;
mSlipMove.offsetTopAndBottom(-ay);
}
break;
case MotionEvent.ACTION_UP:
if (isMove) {
isMove = false;
top = mSlipMove.getTop();
System.out.println(top + "====" + bottom + "==="+ mLocationSlip.getBottom()*2/3);
if(!location&&top<(mLocationSlip.getBottom()*2/3)){
setLayout(mSlipMove, 0, 0, 0);
location=true;
}else if(location&&top>(mLocationSlip.getBottom()*1/3)){
setLayout(mSlipMove, 0, mLocationSlip.getBottom(), 0);
location=false;
}else if(!location){
setLayout(mSlipMove, 0, mLocationSlip.getBottom(), 0);
}else{
setLayout(mSlipMove, 0, 0, 0);
}
}
break;
}
return super.dispatchTouchEvent(event);
}
主要知识点,就是重新设置了View的位置,android 3.0之后View可以同setTop(),setLeft()等一系列方法直接设置位置方便了开发。3.0之前位置变化设置方法:
/**
* 给view重置位置
* @param view
* @param x
* @param y
* @param b
*/
public void setLayout(View view, int x, int y, int b) {
MarginLayoutParams margin = new MarginLayoutParams(
view.getLayoutParams());
margin.setMargins(x, y, 0, b);
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(
margin);
view.setLayoutParams(layoutParams);
}
文章涉及知识点不多,相信一看就懂。如有问题,留言
下载移步:可滑动的View
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。