简述:实现日期滑动,滑动到某一日期后使其滚动和下方对齐,然后加载数据
HorizontalScrollView的setOnTouchListener和它自身的滚动会冲突,所以onTouch中需要返回false ! scrollview.scrollTo()直接使用是没有效果的,是因为在scrollview初始化没有完成的时候scrollTo不可用,解决方法是使用postDelayed延迟等待初始化完成后再使用,
new Handler().postDelayed((new Runnable() {
@Override
public void run()
{
scrollview.scrollTo(width*(days-1),0);
Log.i("","-----****------"+width*14);
}
}),50);
滑动后手指移开会继续滑动,这时候就需要你监听HorizontalScrollView的值得变化来确定滑动是否停止 。
当你连续滑动的时候就会出现你第二次按下的时候回因为按下的瞬间 lastX = scroller.getScrollX()而出现连续滑动会出错,解决方法是设置变量isScoll,当ACTION_UP抬手的时候设置为true,这样就解决了第二次按下会加载的所悟,但是同时又因为startX为每次按下取值,而使滚动距离计算发生错误,解决方法是:设置变量isScolling初始值为true,当按下后设置为false,所以在此按下后不startX不会重新取值,当加载过后设置为true,这样停止后的下次滚动也可正常使用。
当HorizontalScrollView滑动停止后scrollTo无效,但是smoothScrollTo可以使用,便用其代替了。
scrollview.setOnTouchListener(new OnTouchListener(){
private int touchEventId = -9983761;
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
View scroller = (View) msg.obj;
if (msg.what == touchEventId) {
if(isScoll)
{
if (lastX == scroller.getScrollX()) {
//停止了,此处你的操作业务
Log.i("meiting"+startX+"----"+width,scroller.getScrollX()+"---------"+lastX);
isScolling = true;
int quyu = lastX%width ;
if(lastX > startX)
{
if(quyu > width/2){
temp_calendar.setTime(cdate);
temp_calendar.add(Calendar.DAY_OF_MONTH, (lastX-startX)/width+1);
tempdate = temp_calendar.getTime();
tv_today.setText(sdf2.format(tempdate));
Log.i("","---"+sdf2.format(tempdate));
scrollview.smoothScrollTo(lastX+(width-lastX%width), 0);
initData();
//
}else{
if(lastX > (days*2-1)*width-5){
Toast.makeText(getApplicationContext(), "已到右边边界!",
Toast.LENGTH_SHORT).show();
}
temp_calendar.setTime(cdate);
temp_calendar.add(Calendar.DAY_OF_MONTH, (lastX-startX)/width);
tempdate = temp_calendar.getTime();
tv_today.setText(sdf2.format(tempdate));
Log.i("","--***-"+sdf2.format(tempdate));
scrollview.smoothScrollTo(lastX-lastX%width, 0);
startX = scrollview.getScrollX();
initData();
//
}
}else if(lastX < startX){
if(quyu > width/2){
temp_calendar.setTime(cdate);
temp_calendar.add(Calendar.DAY_OF_MONTH, -(startX-lastX)/width);
tempdate = temp_calendar.getTime();
tv_today.setText(sdf2.format(tempdate));
Log.i("","---"+sdf2.format(tempdate));
scrollview.smoothScrollTo(lastX+(width-lastX%width), 0);
initData();
//
}else{
if(lastX < 5){
lastX = 5;
Toast.makeText(getApplicationContext(), "已到左边边界!",
Toast.LENGTH_SHORT).show();
Log.i("","--***-"+lastX);
}
temp_calendar.setTime(cdate);
//
temp_calendar.add(Calendar.DAY_OF_MONTH, -(startX-lastX)/width-1);
tempdate = temp_calendar.getTime();
tv_today.setText(sdf2.format(tempdate));
Log.i("","--***-"+sdf2.format(tempdate));
scrollview.smoothScrollTo(lastX-lastX%width, 0);
startX = scrollview.getScrollX();
initData();
//
}
}
} else {
lastX = scroller.getScrollX();
handler.sendMessageDelayed(handler.obtainMessage(touchEventId, scroller), 10);
Log.i("meiting","---------"+lastX);
}
}
}
}
};
public boolean onTouch(View v, MotionEvent event) {
isScoll = false;
int eventAction = event.getAction();
int X = (int) event.getRawX();
switch (eventAction) {
case MotionEvent.ACTION_DOWN:
if(isScolling){
startX = scrollview.getScrollX();
isScolling = false;
}
break;
case MotionEvent.ACTION_UP:
isScoll = true;
handler.sendMessageDelayed(handler.obtainMessage(touchEventId, v), 10);
break;
default:
break;
}
return false;
}
});