好久没写博客了,最近一直忙着赶项目,趁着中午午休,更一篇博客吧,时间有限,直接进入正题吧。
- 效果
- 继承合适的View。
public class VerticalTouchImageView extends android.support.v7.widget.AppCompatImageView{
}
- 构造器
为了方便,构造里通过this调用其它构造方法,我们就可以把初始化逻辑放在最后调用的构造器里。
public VerticalTouchImageView(Context context) {
this(context, null);
}
public VerticalTouchImageView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public VerticalTouchImageView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
//TODO 这里做初始化操作
}
- 重写onTouchEvent方法,由于这里要处理手势,需要对事件进行处理。
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
break;
case MotionEvent.ACTION_MOVE:
break;
case MotionEvent.ACTION_UP:
break;
}
return super.onTouchEvent(event);
}
完整代码(代码分析):
/**
* 首页拖动控件,仅能垂直拖动。
* Created by Chao on 2017-11-16.
*/
public class VerticalTouchImageView extends android.support.v7.widget.AppCompatImageView {
public VerticalTouchImageView(Context context) {
this(context, null);
}
public VerticalTouchImageView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public VerticalTouchImageView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
float moveY;
/**
*由于项目需求只能上下滑动,所以我们只关心Y轴。
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
//记录下当前按下的Y坐标
moveY = event.getRawY();
break;
case MotionEvent.ACTION_MOVE:
//在Move事件里面,拿到现在的Y坐标减去按下时候的坐标,就能计算出当前View应该移动的距离。
float y = event.getRawY();
float diffY = y - moveY;
//如果当前的Y坐标已经移到屏幕外,我们需要修正坐标,最多移动到顶部0坐标。
if (getY() <= 0) {
setY(0);
} else {//如果没有超出边界,我们就让View移动起来。
setY(currY);
}
//这里返回true将此次事件消耗,自己处理。
return true;
case MotionEvent.ACTION_UP:
break;
}
return super.onTouchEvent(event);
}
/**
*重置方法
*/
public void reset() {
if (getY() <= 0) {
setY(0);
}
}
}