package com.hupu.games.view;
import java.util.ArrayList;
import java.util.List;
import com.hupu.games.common.HupuLog;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.HorizontalScrollView;
/*
* 自定义的 滚动控件
* 重载了 onScrollChanged(滚动条变化),监听每次的变化通知给 观察(此变化的)观察者
* 可使用 AddOnScrollChangedListener 来订阅本控件的 滚动条变化
* */
public class HScrollView extends HorizontalScrollView {
ScrollViewObserver mScrollViewObserver;
public HScrollView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
}
public HScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
public HScrollView(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
// Log.i("HScrollView","HScrollView onTouchEvent");
try {
return super.onTouchEvent(ev);
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
@Override
public void onScrollChanged(int l, int t, int oldl, int oldt) {
if(noHeader)
{
if(ob1!=null)
{
try {
ob1.NotifyOnScrollChanged(this,l, t, oldl, oldt);
} catch (Exception e) {
// TODO: handle exception
HupuLog.e("papa", "error");
}
}
}
else
{
/*
* 当滚动条移动后,引发 滚动事件。通知给观察者,观察者会传达给其他的。
*/
if (mScrollViewObserver != null /*&& (l != oldl || t != oldt)*/) {
mScrollViewObserver.NotifyOnScrollChanged(l, t, oldl, oldt);
}
}
// Log.i("onScrollChanged","l="+l+" oldl="+oldl);
super.onScrollChanged(l, t, oldl, oldt);
}
/*
* 订阅 本控件 的 滚动条变化事件
* */
public void AddOnScrollChangedListener(OnScrollChangedListener listener) {
if(mScrollViewObserver ==null)
mScrollViewObserver =new ScrollViewObserver();
mScrollViewObserver.AddOnScrollChangedListener(listener);
}
private ScrollViewObserver1 ob1;
public void setNoHeader(ScrollViewObserver1 ob )
{
noHeader=true;
ob1=ob;
ob.AddOnScrollChangedListener(this);
}
public ScrollViewObserver getObserver()
{
return mScrollViewObserver;
}
/*
* 取消 订阅 本控件 的 滚动条变化事件
* */
public void RemoveOnScrollChangedListener(OnScrollChangedListener listener) {
mScrollViewObserver.RemoveOnScrollChangedListener(listener);
}
/*
* 当发生了滚动事件时
*/
public static interface OnScrollChangedListener {
public void onScrollChanged(int l, int t, int oldl, int oldt);
}
public boolean noHeader;
/*
* 观察者
*/
public static class ScrollViewObserver {
List<OnScrollChangedListener> mList;
public ScrollViewObserver() {
super();
mList = new ArrayList<OnScrollChangedListener>();
}
public void AddOnScrollChangedListener(OnScrollChangedListener listener) {
mList.add(listener);
}
public void RemoveOnScrollChangedListener(
OnScrollChangedListener listener) {
mList.remove(listener);
}
public void NotifyOnScrollChanged(int l, int t, int oldl, int oldt) {
if (mList == null || mList.size() == 0) {
return;
}
for (int i = 0; i < mList.size(); i++) {
if (mList.get(i) != null) {
mList.get(i).onScrollChanged(l, t, oldl, oldt);
}
}
}
}
public static class ScrollViewObserver1 {
List<HorizontalScrollView> mVList;
public void AddOnScrollChangedListener(HorizontalScrollView v) {
if(mVList==null)
mVList =new ArrayList<HorizontalScrollView>();
mVList.add(v);
}
public void NotifyOnScrollChanged(View me,int l, int t, int oldl, int oldt)
{
// Log.i("NotifyOnScrollChanged by view","size="+mVList.size());
if(mVList!=null)
{
if (mVList.size() == 0) {
return;
}
for (int i = 0; i < mVList.size(); i++) {
HorizontalScrollView v =mVList.get(i) ;
if (v != null && v!=me) {
try {
v.smoothScrollTo(l, t);
} catch (Exception e) {
// TODO: handle exception
}
}
}
}
}
public void NotifyOnScrollChanged(int dx)
{
//Log.i("NotifyOnScrollChanged by view","size="+mVList.size());
if(mVList!=null)
{
if (mVList.size() == 0) {
return;
}
HorizontalScrollView v =mVList.get(0) ;
v.smoothScrollBy(dx, 0);
}
}
public void clear()
{
if(mVList!=null)
mVList.clear();
}
public int getListSize(){
if(mVList!=null)
return mVList.size();
else
return 0;
}
}
}