仿网易图集详情页

       近期我们可爱的产品提了一个需求,要向大厂看齐。仿照某易新闻客户端,在浏览图集的时候,希望底下的文字可以滚动。怎么样个滚动法呢,效果如下:

                                                

       当文本过长时,可以和标题一起向上滚动。当滚动到一个最大高度时,如果文本还未完全显示,可以继续滚动。需求看似很简单,一开始的思路是Scrollview进行嵌套,一番研究后发现一个问题。Scrollview的TouchEvent事件中判断如果是拖动操作会一直拦截,导致即使外层的Scrollview滑到顶部了,里层的Scrollview也接受不到触摸事件。

	@Override
	public boolean onInterceptTouchEvent(MotionEvent ev) {
    		/*
     		* This method JUST determines whether we want to intercept the motion.
     		* If we return true, onMotionEvent will be called and we do the actual
     		* scrolling there.
     		*/

    		/*
    		* Shortcut the most recurring case: the user is in the dragging
    		* state and he is moving his finger.  We want to intercept this
    		* motion.
    		*/
    		final int action = ev.getAction();
   		if ((action == MotionEvent.ACTION_MOVE) && (mIsBeingDragged)) {
        		return true;
    		}

    		/*
     		* Don't try to intercept touch if we can't scroll anyway.
     		*/
    		if (getScrollY() == 0 && !canScrollVertically(1)) {
        		return false;
    		}
 
    		........
	}
    截取了其中的一段源码,mIsBeingDragged变量一旦置为true,ScrollView会直接拦截触摸事件并处理,直到执行完ACTION_UP。这就很尴尬了啊,我必须先滑动父Scrollview到顶部,然后松开手指,再滑动子Scrollview才能滚动文本。类似如下的效果:
                                               

       不是如丝般顺滑,怎么能接受呢。如果想继续优化,必须对触摸事件的分发和拦截重新复写,感觉是个无底洞,果断放弃。后来无意间看到一个ObservableScrollView的Demo,受到了启发。

                                               

        和我的需求很吻合啊,如获至宝,研读一番发现,如来它只有一个Scrollview,标题根据滚动的距离来tranlation,很鸡贼啊!本着拿来主义的精神,立即对其一番改造。在图集的ViewPage上加一层头部透明的Scrollview,title的高度进行计算设置,不就OK了么!但有一个问题需要注意,即ScrollView透明的头部用户看不见,但是响应滑动事件,同时拦截了下面ViewPage的翻页操作,这显然是个bug。我们只需在上面ScrollView中的dispatchTouchEvent做下处理就行了。

	@Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        boolean dispatch = super.dispatchTouchEvent(ev);
        if (mIgnoreTouchRect != null) {
            Rect curTouchRect = new Rect(mIgnoreTouchRect.left, mIgnoreTouchRect.top, mIgnoreTouchRect.right, mIgnoreTouchRect.bottom - mScrollY > 0 ? mIgnoreTouchRect.bottom - mScrollY : 0);
            if (curTouchRect.contains((int)ev.getX(), (int)ev.getY())) {
                return false;
            } else {
                return dispatch;
            }
        } else {
            return dispatch;
        }
    }
    这里的mIgnoreTouchRect是初始化时设置的,即我们不拦截触摸操作的区域,之所以又减了个mScrollY的高度,是考虑到ScrollView滚动后,非触摸操作区域的变化。好了,到这所有的问题都完美解决了。
                           
 
 
    怎么样?perfect!希望对有相同需求的同学有一点帮助,需要源码的可以给我留言。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
1.无须数据库支持,直接处理服务器图片目录 <br>2.为大图片生成缩略图,并存放到专门的目录,提高相册预览图片的效率 <br>3.简化图片添加过程,直接上传图片到图片目录即可,相册自动获取、遍历新上传的图片,并生成缩略图 <br>4.增加多页跳转功能 <br>5.简单易用,直接插入控件到你的页面,并进行相关设置即可使用 <br><br><br>PhotoAlbum 控件说明: <br>1.该控件在页面加载的时候,会搜索当前网站指定目录所有jpg格式的文件,在使用时需要指定原图片存放地址和生成的缩略图存放地址,需要添加到web.config文件中: <br><br>try <br>{ <br>smallfoldername = Server.MapPath(ConfigurationManager.AppSettings["SmallPath"]); <br>bigfoldername = Server.MapPath(ConfigurationManager.AppSettings["NormalPath"]); <br>} <br>catch <br>{ <br>smallfoldername = Server.MapPath("./Photo/SmallPics/"); <br>bigfoldername = Server.MapPath("./Photo/NormalPics/"); <br>} <br><br>如果获取用户配置路径失败,控件默认采用./Photo/SmallPics/ 和./Photo/NormalPics/ 两个目录 <br>NormalPics为用户上传原图片的地址,SmallPics为控件生成并存放缩略图的地址。 <br><br>2.控件在页面加载的时候,遍历原图地址,并逐个生成缩略图,存放到缩略图地址目录。第一次运行,会牺牲效率,当缩略图生成完毕后,运行速度大幅提高。 <br><br>3.生成缩略图,采用ImageThumbnail类的MakeThumbnail方法实现,缩略图的大小和生成方式,可以自行设置。可以分别按高、宽生成,不过图片可能会产生变形,也可以用CUT裁剪方式。 <br><br>4.相册处理图片文件,并把图片文件展现给前端浏览器。相册可视化部分,采用DataList控件实现。 <br>

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值