package com.wuxiaolong.androidsamples.dragview;
import android.content.Context;
import android.graphics.Color;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Scroller;
/**
* Created by WuXiaolong on 2015/11/20.
*/
public class DragView extends View {
private int x, y;
private Scroller mScroller;
public DragView(Context context) {
super(context);
initScroller(context);
}
public DragView(Context context, AttributeSet attrs) {
super(context, attrs);
initScroller(context);
}
public DragView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initScroller(context);
}
private void initScroller(Context context) {
setBackgroundColor(Color.RED);
mScroller = new Scroller(context);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
int getRawX = (int) event.getRawX();
int getRawY = (int) event.getRawY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
// 记录触摸点坐标
x = (int) event.getRawX();
y = (int) event.getRawY();
break;
case MotionEvent.ACTION_MOVE:
//计算偏移量
int offsetX = getRawX - x;
int offsetY = getRawY - y;
((View) getParent()).scrollBy(-offsetX, -offsetY);
//重新设置初始坐标
x = getRawX;
y = getRawY;
break;
case MotionEvent.ACTION_UP:
/**
* 实现拖动回弹回去,需配合方法一、二、四中任一方法
*/
View viewGroup = (View) getParent();
mScroller.startScroll(viewGroup.getScrollX(),
viewGroup.getScrollY(),
-viewGroup.getScrollX(),
-viewGroup.getScrollY()
);
invalidate();
break;
}
return true;
}
@Override
public void computeScroll() {
super.computeScroll();
//判断Scroller是否执行完毕
if (mScroller.computeScrollOffset()) {
((View) getParent()).scrollTo(
mScroller.getCurrX(),
mScroller.getCurrY());
invalidate();
}
}
}