HorizontalScrollView中遇到的问题及解决方法

            简述:实现日期滑动,滑动到某一日期后使其滚动和下方对齐,然后加载数据

            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;
}
});

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值