领导让写一个公告弹窗,要求如果是长公告,必须滑到最底部,才可点击消失,如果没到最底部,点击要内容自动滚动。对开发过程中遇到一些问题,特总结记录。
1、监听scrollview滑动是否到底部
private void setScrollviewListener() {
scrollview.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent event) {
int height = view.getHeight();
int scrollY = view.getScrollY();
int scrollViewMeasuredHeight = scrollview.getChildAt(0).getMeasuredHeight();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
break;
case MotionEvent.ACTION_MOVE:
case MotionEvent.ACTION_UP:
// if(scrollY==0){//滑动到了顶部
// }
if ((scrollY + height) >= scrollViewMeasuredHeight) {//滑动到了底部
// listener.onBottom();
onBottom();
}
break;
default:
break;
}
return false;
}
});
}
2、按钮监听
btn_next.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!canScroll) {
dismiss();
} else {
scrollNext();
}
}
});
3、scrollview内容滚动
public void scrollNext() {
if (!scrollview.pageScroll(View.FOCUS_DOWN)) {
onBottom();
}
}
4、测量内容是否会超出屏幕
scrollview中有个canScroll()方法,但是是private,无法使用。只能主动测量scrollview高度及子View高度。
ViewTreeObserver vto = scrollview.getViewTreeObserver();
vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
scrollview.getViewTreeObserver().removeOnPreDrawListener(this);//不需要一直频繁调用,移除
int height = scrollview.getMeasuredHeight();
int height2 = tv_content.getMeasuredHeight();
if (height2 <= height) {
canScroll = false;
} else
canScroll = true;
return true;
}
});
后来有用到一个更为方便的测量方法,不用设监听。
view.post(new Runnable() {
@Override
public void run() {
int width = et_name.getWidth(); // 获取宽度
spinner.setDropDownWidth(width);
spinner.setPadding(-width, 0, 0, 0);
}
});
5、然后就是按钮文字显示,最初文字一直显示错误,让我都以为是Button有问题,后来发现是上面addOnPreDrawListener()中一直在调用监听,才发现还有移除监听的方法。还是要多了解原理和多看源码,才能更多发现之前不曾用到的功能。