您的位置:首页 > 其它

实现滑动的七种方法

2015-11-17 18:08 477 查看
周末,android群英传与Android开发艺术探索两本书到了,确实是适合android进阶的好书, 以后书中学到的觉得不错的内容会写在这个模块。

今天介绍滑动的七种方式

基本思想:

当手指按下时,记下当前坐标 lastX, lastY

当手指移动时,记下 当前坐标 currentX, currentY

计算差值 offsetX = currentX - lastX, offsetY = currentY - lastY

android群英传中介绍了七种方式,看下面的例子。

1.定义出自己的控件,在MainActivity中直接引用

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/image1"
tools:context=".MainActivity">

<mytest.jiang.wei.myapplication.DragView
android:background="@android:color/holo_red_dark"
android:layout_width="100dp"
android:layout_height="100dp" />

</RelativeLayout>


下面是我们在onTouchEvent事件中计算偏移量并处理滑动

@Override
public boolean onTouchEvent(MotionEvent event) {
int x = (int) event.getX();
int y = (int) event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
lastX = x;
lastY = y;
break;

case MotionEvent.ACTION_MOVE:
//计算差值
int offsetX = x - lastX;
int offsetY = y - lastY;

break;
}
return true;
}


在MotionEvent.ACTION_MOVE case块中处理滑动

1.使用layout方法

layout(getLeft() + offsetX, getTop() + offsetY, getRight() + offsetX, getBottom() + offsetY);

offsetLeftAndRight与offsetTopAndBottom

offsetLeftAndRight(offsetX);
offsetTopAndBottom(offsetY);


LayoutParams

ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) getLayoutParams();
layoutParams.leftMargin = getLeft() + offsetX;
layoutParams.topMargin = getTop() + offsetY;
setLayoutParams(layoutParams);


/[b]**[/b] 前三种方式实际都是改变子控件的布局参数, 最始调用父控件的onLayout方法重新为子控件布局[b]*******[/b]/

4.scrollTo 与scrollBy

这里要注意,

1.scrollTo与scrollBy移动的控制的子元素,我们要移动当前view,就要调用父控件的方法。

2. 实际上是移动父控件,所以 要让偏移量取反才能看到移动 子控件的效果

((View)getParent()).scrollBy(-offsetX, -offsetY);


使用Scroller

Scroller类是sdk为我们提供 的模拟滑动的工具类,我们可以利用他实现平滑移动的效果

1. 在构造方法中实例化一个Scroller

mScroller = new Scroller(context);

2. 重写computeScroll方法,实现模拟滑动

@Override
public void computeScroll() {
// 判断是否完成滑动, 已完成则会返回false
if (mScroller.computeScrollOffset()) {
((View)getParent()).scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
invalidate();
}
}


3.在MotionEvent.ACTION_UP case块中开启模拟滑动


case MotionEvent.ACTION_UP:
//这里因为每次滑动的都是父控件, 开始滑动位置为0, 所开始 位置 是 0+parent.getScrollX() , 0+parent.getScrollY(),  偏移量为负 滑动的值 回到原点
mScroller.startScroll(parent.getScrollX(), parent.getScrollY(), -parent.getScrollX(), -parent.getScrollY());
invalidate();
break;


6.使用动画

使用动画可以更新轻松的实现让控件回到原位置的平移效果

/**
* 6.使用动画
*/
ObjectAnimator animX = ObjectAnimator//
.ofFloat(this, "translationX", parent.getScrollX());
ObjectAnimator animY = ObjectAnimator//
.ofFloat(this, "translationY", parent.getScrollY());
AnimatorSet animSet = new AnimatorSet();
animSet.playTogether(animX, animY);
animSet.start();


使用ViewDragHelper,

support-v4库中提供专门处理滑动的工具类,后边会专门介绍。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  滑动