前言
根据启舰大大 的博客所学习的滑动删除。
简介
Scoller类是scrollTo的补充,他没有scrollTo的功能,它的功能就是根据传进去的参数计算位置的,只是计算,并不会去移动位置,如果要移动还是要调用scrollTo的,这里只是为了让滑动更加的流畅一点。
相关函数
- 构造函数
public Scroller (Context context)
public Scroller (Context context, Interpolator interpolator)
-interpolator 插值器,可以参考这里
- startScroll方法
public void startScroll(int startX, int startY, int dx, int dy, int duration)
public void startScroll(int startX, int startY, int dx, int dy)
- startX :开始移动的X坐标
- startY: 开始移动的Y坐标
- dx: 沿X轴移动坐标,为正时,子控件左移,为负时,子控件右移。
- dy:沿Y轴移动坐标,为正时,子控件上移,为负时,子控件下移。
- duration: 整个移动过程,所耗费时长
第二个构造函数中,没有duration这个参数,系统会使用默认的时长:250毫秒
举个栗子:
mScroller = new Scroller(context,new LinearInterpolator(context,null));
mScroller.startScroll(0,0,200,0,500);
这个代码就是说用500毫秒的时间从(0,0)的位置,沿X轴反方向移动200,Y轴不动;
但这个函数并不会移动,而是模拟计算,调用了这个函数之后,它就会在scroller内部用一个线程来计算从(0,0)的位置,沿X轴反方向移动200,Y轴不动;每一毫秒的位置,用户可以通过scroller.getCurrX()、scroller.getCurrY()来获取,当前应该在的位置。注意,我用的“应该”。因为scroller只是根据插值器,指定的时间,距离;算出当前所在的X轴坐标,Y轴坐标。但对图像并没有做任何操作!!!!!!要想移动图像,就必须使用scrollTo()!!!
简易的小左滑,完善滑动,让其更加自然,会面会继续完善的哦~
代码如下:
public class DelView extends LinearLayout {
private Context context;
Scroller scroller;
int delWidth;
public DelView(Context context) {
this(context, null);
}
public DelView(Context context, AttributeSet attrs) {
super(context, attrs);
this.context = context;
initScroll();
}
private void initScroll() {
scroller = new Scroller(context, new LinearInterpolator(context, null));
}
/**
* 获取删除view的长度
*/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
if (getChildCount() > 1) {
View del = getChildAt(1);
measureChild(del, widthMeasureSpec, heightMeasureSpec);
delWidth = del.getMeasuredWidth();
}
}
int lastX;
@Override
public boolean onTouchEvent(MotionEvent event) {
int scrollX = getScrollX();
int newScrooll;
if (event.getAction() == MotionEvent.ACTION_MOVE) {
newScrooll = (int) (scrollX + lastX - event.getX());
if (newScrooll < 0) newScrooll = 0;
else if (newScrooll > delWidth) newScrooll = delWidth;
scrollTo(newScrooll, 0);
}
else if (event.getAction() == MotionEvent.ACTION_UP) {
if (scrollX > delWidth / 2)
newScrooll = delWidth;
else
newScrooll = 0;
scroller.startScroll(scrollX, 0, newScrooll - scrollX, 0);
//用invalidate()来重绘,由于我们这里有Scroller,所以在重绘时就会走到VIEW的computeScroll()函数
invalidate();
}
lastX = (int) event.getX();
return true;
}
@Override
public void computeScroll() {
//computeScrollOffset()来判断当前Scroller的状态——是否已经计算移动位置结束,
// 如果结束返回FALSE,如果还在计算就返回TRUE
if (scroller.computeScrollOffset()) {
scrollTo(scroller.getCurrX(), scroller.getCurrY());
//如果仍在计算,就调用invalidate,使之重新进入computeScroll方法
invalidate();
}
}
}
del = findViewById(R.id.del);
del.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getApplicationContext(), "删除", Toast.LENGTH_SHORT).show();
}
});