Android --- 视图绘制监听

// 从视图上获取视图树观察者
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);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值