筆記記錄
/**
* @packageName:com.huidaxuan.ic2cloud.app2b.view.diy.scrollview
* @className: MyScrollViewClearLinstener
* @description:設(shè)置子view試圖滑動沖突
* @author: dingchao
* @time: 2020-06-28 09:41
*/
/*ScrollView低版本適配*/
public class MyScrollViewClearListener extends ScrollView {
private OnScrollChanged mOnScrollChanged;
private HorizontalListView horizontalListView;
public MyScrollViewClearListener(Context context) {
this(context, null);
}
public MyScrollViewClearListener(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public MyScrollViewClearListener(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
}
@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
super.onScrollChanged(l, t, oldl, oldt);
if (mOnScrollChanged != null)
mOnScrollChanged.onScroll(l, t, oldl, oldt);
View view = this.getChildAt(0);
if (this.getHeight() + this.getScrollY() == view.getHeight()) {
_calCount++;
if (_calCount == 1) {
if (_listener != null) {
_listener.srollToBottom();
}
}
} else {
_calCount = 0;
}
}
public void setOnScrollChanged(OnScrollChanged onScrollChanged) {
this.mOnScrollChanged = onScrollChanged;
}
public interface OnScrollChanged {
void onScroll(int l, int t, int oldl, int oldt);
}
/**
* 接口回調(diào)
*/
private ScrollViewListener scrollViewListener = null;
public interface ScrollViewListener {
void onScrollChanged(MyScrollViewClearListener scrollView, int x, int y,
int oldx, int oldy);
}
public void setScrollViewListener(ScrollViewListener scrollViewListener) {
this.scrollViewListener = scrollViewListener;
}
/**
* 重寫的onScrollChanged方法監(jiān)聽坐標
* 這個監(jiān)聽在源碼中沒有寫成回調(diào)的樣子葡兑,
* 只是寫成了方法的樣子,由于修飾這個方法的修飾符是protected,
* (protected只能在本類损话,子類岔擂,同一包中調(diào)用)玲昧,
* 所以拿到ScrollView對象后在無法activity中調(diào)用此方法耙饰,
* 所以只能重寫后摩瞎,子類中自動調(diào)用拴签,
* 所以要想在activity調(diào)用,
* 就要寫回調(diào)愉豺,
* 上面就是我寫的回調(diào)
* 在Android源碼中這種寫法很多篓吁,在很多控件中都有
*/
// @Override
// protected void onScrollChanged(int x, int y, int oldx, int oldy) {
// super.onScrollChanged(x, y, oldx, oldy);
// if (scrollViewListener != null) {
// scrollViewListener.onScrollChanged(this, x, y, oldx, oldy);
// }
// }
//滑動到底部監(jiān)聽添加
private OnScrollBottomListener _listener;
private int _calCount;
public interface OnScrollBottomListener {
void srollToBottom();
}
public void registerOnScrollViewScrollToBottom(OnScrollBottomListener l) {
_listener = l;
}
public void unRegisterOnScrollViewScrollToBottom() {
_listener = null;
}
/**
* 覆寫onInterceptTouchEvent方法,點擊操作發(fā)生在ListView的區(qū)域的時候,
* 返回false讓ScrollView的onTouchEvent接收不到MotionEvent蚪拦,而是把Event傳到下一級的控件中
*/
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
if (horizontalListView != null && checkArea(horizontalListView, ev)) {
return false;
}
return super.onInterceptTouchEvent(ev);
}
/**
* 測試view是否在點擊范圍內(nèi)
* 還差豎向滑動的判斷不完美(后續(xù)完善杖剪,不影響用戶觸摸操作)
*
* @param v
* @return
*/
private boolean checkArea(View v, MotionEvent event) {
float x = event.getRawX();
float y = event.getRawY();
int[] locate = new int[2];
v.getLocationOnScreen(locate);
int l = locate[0];
int r = l + v.getWidth();
int t = locate[1];
int b = t + v.getHeight();
if (l < x && x < r && t < y && y < b) {
return true;
}
return false;
}
public HorizontalListView getHorizontalListView() {
return horizontalListView;
}
public void setHorizontalListView(HorizontalListView horizontalListView) {
this.horizontalListView = horizontalListView;
}
}
使用
//設(shè)置去除在scrollview中hlv的滑動監(jiān)聽影響
msv_home.setHorizontalListView(hlv_menu);