// 从视图上获取视图树观察者
ViewTreeObserver vo = mainView.getViewTreeObserver();
// 对视图监听即将绘制
vo.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
if(width == 0 || height ==0){
width = mainView.getMeasuredWidth();
height = mainView.getMeasuredHeight();
// 取消监听
mainView.getViewTreeObserver().removeOnPreDrawListener(this);
}
return true;
}
});
动态改变视图的位置
// 初始化加载更多视图的显示位置
FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) ivLoadMore.getLayoutParams();
// 使用布局的宽度减去加载更多视图的宽高作为加载更多视图的左外边距
lp.leftMargin = width-ivLoadMore.getMeasuredWidth();
lp.topMargin = height-ivLoadMore.getMeasuredHeight();
ivLoadMore.setLayoutParams(lp);
视图设置触摸监听
private View.OnTouchListener onLoadMoreTouch = new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
isDraging = true;
downTime = System.currentTimeMillis();
ivLoadMore.setImageResource(R.drawable.icon_load_more_press);
lastPoint.set((int) event.getRawX(), (int) event.getRawY());
ivLoadMoreLayoutParam = (FrameLayout.LayoutParams) ivLoadMore.getLayoutParams();
break;
case MotionEvent.ACTION_MOVE:
// 获取移动的当前点
int x = (int) event.getRawX();
int y = (int) event.getRawY();
// 计算偏移
int xDis = x - lastPoint.x;
int yDis = y - lastPoint.y;
// 改变左外边距和顶部外边距
int leftMargin = ivLoadMoreLayoutParam.leftMargin;
leftMargin += xDis;
if (leftMargin < 0) {
leftMargin = 0;
} else if (leftMargin > width - ivLoadMore.getMeasuredWidth()) {
leftMargin = width - ivLoadMore.getMeasuredWidth();
}
ivLoadMoreLayoutParam.leftMargin = leftMargin;
int topMargin = ivLoadMoreLayoutParam.topMargin;
topMargin += yDis;
if (topMargin < 0) {
topMargin = 0;
} else if (topMargin > height - ivLoadMore.getMeasuredHeight()) {
topMargin = height - ivLoadMore.getMeasuredHeight();
}
ivLoadMoreLayoutParam.topMargin = topMargin;
ivLoadMore.setLayoutParams(ivLoadMoreLayoutParam);
ivLoadMore.invalidate();
lastPoint.set(x, y);
break;
case MotionEvent.ACTION_UP:
resetLoadMoreView();
long currentTime = System.currentTimeMillis();
if(currentTime - downTime <= 300){
Toast.makeText(getActivity()," 加载更多 ...",Toast.LENGTH_SHORT).show();
}
break;
}
return true;
}
};
...
使用监听
ivLoadMore.setOnTouchListener(onLoadMoreTouch);