先日の続き。
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;
}
}