HorizontalScrollView でフリップのswitchを、(2)

先日の続き。
HorizontalScrollView のスクロールのイベントをハンドリングして対応する。

HorizontalScrollView 継承先に呼び出し側にスクロールのイベントを通知する
インターフェースを用意する。

--------------------------------------------------------------------
import android.widget.HorizontalScrollView;

public interface ScrollViewListener{
   void onScrollChanged(HorizontalScrollView scrollView,int x,int y,int oldx,int oldy);
}

--------------------------------------------------------------------

HorizontalScrollView の継承の用意
--------------------------------------------------------------------
import android.content.Context;
import android.util.AttributeSet;
import android.widget.HorizontalScrollView;
/**
 * MyHorizontalScrollView
 */

public class MyHorizontalScrollView extends HorizontalScrollView{
   private ScrollViewListener scrollViewListener = null;

   public MyHorizontalScrollView(Context context,AttributeSet attrs,int defStyle){
      super(context,attrs,defStyle);
   }
   public MyHorizontalScrollView(Context context,AttributeSet attrs){
      super(context,attrs);
   }
   public MyHorizontalScrollView(Context context){
      super(context);
   }
   public void setScrollViewListener(ScrollViewListener scrollViewListener){
      this.scrollViewListener = scrollViewListener;
   }

   @Override
   protected void onScrollChanged(int l,int t,int oldl,int oldt){

      super.onScrollChanged(l,t,oldl,oldt);
      if (scrollViewListener != null){
         scrollViewListener.onScrollChanged(this,l,t,oldl,oldt);
      }
   }
}

HorizontalScrollView の代わりに、この MyHorizontalScrollView を使う
--------------------------------------------------------------------
   <org.sample.MyHorizontalScrollView
            android:id="@+id/horizontalScrollView"
            android:layout_width="100dp"
            android:layout_height="wrap_content"
            android:scrollbars="none"
            android:fadingEdge="none"
            android:fadingEdgeLength="0dp"
            android:fadeScrollbars="false"
            android:background="@drawable/switch_bg_light" >
      :
      :
   </org.sample.MyHorizontalScrollView>
--------------------------------------------------------------------

Activity は、用意した ScrollViewListener  を実装させて、
MyHorizontalScrollView の setScrollViewListener(this) と実行する。
そして、ScrollView の、onScrollChanged で、どちらの方向にスクロールしたかを計算し
タッチのフラグと組み合わせる。
スクロールしない指でタッチするだけの場合はスイッチするようにしている。

--------------------------------------------------------------------
/**
 * FlipSampleActivity
 */

public class FlipSampleActivity extends Activity implements ScrollViewListener{
   boolean isCurrentON = true;
   int scrollVector;

   @Override
   protected void onCreate(Bundle savedInstanceState){
      super.onCreate(savedInstanceState);
      setContentView(R.layout.fliplayout2);

      final ImageView onoffImage = (ImageView)findViewById(R.id.imageViewON);
      final TextView onoffTextView = (TextView)findViewById(R.id.textViewONOFF);
      final MyHorizontalScrollView scrollView = (MyHorizontalScrollView)findViewById(R.id.horizontalScrollView);
      scrollView.setOverScrollMode(View.OVER_SCROLL_NEVER);
      scrollView.setScrollViewListener(this);
      scrollView.setOnTouchListener(new View.OnTouchListener(){
         @Override
         public boolean onTouch(View v,MotionEvent event){

            if (event.getAction()==MotionEvent.ACTION_UP){
               boolean isON = isCurrentON;
               if (scrollVector != 0){
                  isON = scrollVector > 0;
               }

               onoffImage.setImageResource(isON ? R.drawable.switch_activated_dark : R.drawable.switch_disabled_light);
               onoffTextView.setText(isON ? "ON" : "OFF");
               onoffTextView.setTextColor(isON ? 0xffffffff : 0xff000000);
               scrollView.scrollTo(isON ? 0 : 1000,scrollView.getScrollY());
               isON = !isON;
               return true;
            }
            return false;
         }
      }
);
   }
   @Override
   public void onScrollChanged(HorizontalScrollView scrollView,int x,int y,int oldx,int oldy){
      scrollVector = oldx - x;
   }

}