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;">/** 滑动的核心方法,在此处理滑动相关的操作 */
@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>
关键代码:
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
相关文章推荐
- android Graphics(一):概述及基本几何图形绘制
- android 教程实例系列
- Android_低功耗
- android上面圆角,下面直角 ImageView
- android 动画原理二
- android之animation-list+图片实现的粘稠的加载动画效果
- Android的smali动态调试方法
- Android 动画原理(一)
- Android 数据恢复 view的id
- Android常见问题及开发经验总结(三)
- Android 解决TextVIew加载自定义字体慢的问题
- android sudio提示快捷键冲突解决
- GitHub上最受欢迎的Android开源项目TOP20
- android的感谢
- Android中Gson解析详解json3
- 关于Android的addview
- Android中Gson解析详解json2
- Android常用工具类
- Android中短信发送倒计时方法
- Android的生成日志文件