您的位置:首页 > 移动开发 > Android开发

android滑动界面

2016-02-02 18:04 483 查看
滑动相关的方法

scrollTo(int x,int y):x,y代表的不是坐标点,而是偏移量。

scrollBy(int x,int y):它实际上是调用了scrollTo(mScrollX + x, mScrollY + y),即表示在原先偏移的基础上在发生偏移

scroller.getCurrX() //获取mScroller当前水平滚动的位置   

scroller.getCurrY() //获取mScroller当前竖直滚动的位置   

scroller.getFinalX() //获取mScroller最终停止的水平位置   

scroller.getFinalY() //获取mScroller最终停止的竖直位置   

scroller.setFinalX(int newX) //设置mScroller最终停留的水平位置,没有动画效果,直接跳到目标位置   

scroller.setFinalY(int newY) //设置mScroller最终停留的竖直位置,没有动画效果,直接跳到目标位置   

滑动动画相关的方法

//滚动,startX, startY为开始滚动的位置,dx,dy为滚动的偏移量, duration为完成滚动的时间   

scroller.startScroll(int startX, int startY, int dx, int dy) //使用默认完成时间250ms   

scroller.startScroll(int startX, int startY, int dx, int dy, int duration)

<span style="font-size:14px;">/*要实现滑动效果必须要重载computeScroll方法*/
@Override
public void computeScroll() {
// 在View中有scrollTo和scrollBy方法,这两个方法其实是一样的,只是scrollTo是直接滑动到制定的位置,而scrollBy是滑动相对的距离
// 在调用startScroll之后一定要调用invalidate,invalidate调用computeScroll,
//然后computeScroll又调用invalidate,这样循环产生了滑动效果
// 先判断mScroller滚动是否完成
if (scroller.computeScrollOffset()) {
// 这里调用View的scrollTo()完成实际的滚动
scrollTo(scroller.getCurrX(), scroller.getCurrY());
// 必须调用该方法,否则不一定能看到滚动效果
postInvalidate();// 使用postInvalidate可以直接在线程中更新界面
}
}</span>


<span style="font-size:14px;">/** 滑动的核心方法,在此处理滑动相关的操作 */
@Override
public boolean onTouchEvent(MotionEvent event) {
int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
//业务相关的操作
break;
case MotionEvent.ACTION_MOVE:
//业务相关的操作
break;
case MotionEvent.ACTION_UP:
//业务相关的操作
break;
}
return super.onTouchEvent(event);
}</span>



关键代码:

public class ScreenLayout extends RelativeLayout {
private Context context;// 上下文
private Scroller scroller;// 滑动空间,用来控制滑动时
private int screenHeigh;// 屏幕高度
private int downY = 0;// 按下时Y的位置
private int currentY;// 滑动和抬起时Y的位置
/** 滑动的距离:上滑为负,下滑为正 */
private int distanceY;
private int margin = 80;// 滑动区域的上下边距
private int time = 500;// 滑动效果的持续时间,单位毫秒
/**滑动布局是否在顶部*/
private boolean isTop = false;
private ImageView imgView;

public ScreenLayout(Context context) {
super(context);
this.context = context;
initView();
}

public ScreenLayout(Context context, AttributeSet attrs) {
super(context, attrs);
this.context = context;
initView();
}

/** 初始化组件和界面 */
private void initView() {
// 有弹跳效果的Interpolator
// Interpolator polator = new BounceInterpolator();
scroller = new Scroller(context, null);
// 获取屏幕分辨率
WindowManager wm = (WindowManager) (context
.getSystemService(Context.WINDOW_SERVICE));
DisplayMetrics dm = new DisplayMetrics();
wm.getDefaultDisplay().getMetrics(dm);
screenHeigh = dm.heightPixels;

// 设置成透明背景,不然会影响看到底层布局
this.setBackgroundColor(Color.argb(0, 0, 0, 0));

imgView = new ImageView(context);
imgView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
LayoutParams.MATCH_PARENT));
imgView.setScaleType(ImageView.ScaleType.FIT_XY);// 填充整个屏幕
imgView.setImageResource(R.drawable.view); // 默认背景
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
lp.addRule(RelativeLayout.CENTER_IN_PARENT);
addView(imgView);

startScroll(this.getScrollY(), -this.getScrollY() + margin, time);
}

/** 对scroller的startScroll方法进行封装, 从startY开始,滑动距离dy 持续时间duration */
public void startScroll(int startY, int dy, int duration) {
scroller.startScroll(0, startY, 0, dy, duration);
invalidate();// 重绘界面
}

/** 滑动的核心方法,在此处理滑动相关的操作 */
@Override
public boolean onTouchEvent(MotionEvent event) {
int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
downY = (int) event.getY();
return true;
case MotionEvent.ACTION_MOVE:
currentY = (int) event.getY();
distanceY = currentY - downY;
if (isTop) {
if (distanceY > 0) {// 只准下滑
scrollTo(0, -distanceY + screenHeigh - margin);
}
} else {
if (distanceY < 0) {// 只准上滑
scrollTo(0, -distanceY + margin);
}
}
break;
case MotionEvent.ACTION_UP:
currentY = (int) event.getY();
distanceY = currentY - downY;
if (!isTop) {
if (-distanceY > screenHeigh / 3) {
// 向上滑
startScroll(this.getScrollY(),
screenHeigh - this.getScrollY() - margin, time);
isTop = true;
} else {
// 向下滑
startScroll(this.getScrollY(), -this.getScrollY() + margin, time);
}
} else {
if (distanceY > screenHeigh / 3) {
// 向下滑
startScroll(this.getScrollY(), -this.getScrollY() + margin, time);
isTop = false;
} else {
// 向上滑
startScroll(this.getScrollY(),screenHeigh - this.getScrollY() - margin, time);
}
}
break;
}
return super.onTouchEvent(event);
}
@Override
public void computeScroll() {
// 在View中有scrollTo和scrollBy方法,这两个方法其实是一样的,只是scrollTo是直接滑动到制定的位置,而scrollBy是滑动相对的距离
// 在调用startScroll之后一定要调用invalidate,invalidate调用computeScroll,
//然后computeScroll又调用invalidate,这样循环产生了滑动效果
// 先判断mScroller滚动是否完成
if (scroller.computeScrollOffset()) {
// 这里调用View的scrollTo()完成实际的滚动
scrollTo(scroller.getCurrX(), scroller.getCurrY());
// 必须调用该方法,否则不一定能看到滚动效果
postInvalidate();// 使用postInvalidate可以直接在线程中更新界面
}else {
// 滑动结束,此做滑动停止后的相关操作
if( isTop ) {
this.setVisibility(View.GONE);
}
}
}
}
参考打码:http://download.csdn.net/detail/duduhali/9425960
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: