频道栏目
首页 > 程序开发 > 移动开发 > Android > 正文
Android scrollview 上滑固定某一控件(美团团购详情UI)完美版
2014-08-07 11:05:47         来源:Android  
收藏   我要投稿

在scrollview 上滑固定某一控件(美团团购详情UI)文中介绍了怎么用touchlistener实现类似上滑停住的效果,但是这种方法存在一个明显的bug,就是在内容比较多的时候, 大部分人都是以滑动方式查看内容,而不是touch的方式,这就会导致最上面的滑块出现不及时,或者延后的现象,这里介绍一个全新的方法去实现类似效果,可以很好的解决以上问题.

目前在scrollview中没有onscrolllistener所以需要自己去实现,先复写一个scrollview:

package com.example.meituandemo;

import android.content.Context;
import android.util.AttributeSet;
import android.widget.ScrollView;

public class MyScrollView extends ScrollView {
	private OnScrollListener onScrollListener;
	
	public MyScrollView(Context context) {
		this(context, null);
	}
	
	public MyScrollView(Context context, AttributeSet attrs) {
		this(context, attrs, 0);
	}

	public MyScrollView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
	}
	
	
	/**
	 * 设置滚动接口
	 * @param onScrollListener
	 */
	public void setOnScrollListener(OnScrollListener onScrollListener) {
		this.onScrollListener = onScrollListener;
	}
	

	@Override
	protected void onScrollChanged(int l, int t, int oldl, int oldt) {//滑动改变就会实时调用
		super.onScrollChanged(l, t, oldl, oldt);
		if(onScrollListener != null){
			onScrollListener.onScroll(t);
		}
	}

	/**
	 * 
	 * 滚动的回调接口
	 *
	 */
	public interface OnScrollListener{
		/**
		 * 回调方法, 返回MyScrollView滑动的Y方向距离
		 * @param scrollY
		 * 				、
		 */
		public void onScroll(int scrollY);
	}
}

然后就在mainactivity中调用:

package com.example.meituandemo;

import android.app.Activity;
import android.os.Bundle;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
import android.widget.LinearLayout;

import com.example.meituandemo.MyScrollView.OnScrollListener;

public class MainActivity extends Activity implements OnScrollListener{//注意继承的是自定义的listener
	/**
	 * 自定义的MyScrollView
	 */
	private MyScrollView myScrollView;
	/**
	 * 在MyScrollView里面的购买布局
	 */
	private LinearLayout mBuyLayout;
	/**
	 * 位于顶部的购买布局
	 */
	private LinearLayout mTopBuyLayout;
	

	@SuppressWarnings("deprecation")
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState); 
		setContentView(R.layout.activity_main);
		
		myScrollView = (MyScrollView) findViewById(R.id.scrollView);//你的scrollview
		mBuyLayout = (LinearLayout) findViewById(R.id.buy);//滑动的购买布局
		mTopBuyLayout = (LinearLayout) findViewById(R.id.top_buy_layout);//顶部出现的购买布局
		
		myScrollView.setOnScrollListener(this);
		
		//当布局的状态或者控件的可见性发生改变回调的接口
		findViewById(R.id.parent_layout).getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
			//
			@Override
			public void onGlobalLayout() {
				//这一步很重要,使得上面的购买布局和下面的购买布局重合
				onScroll(myScrollView.getScrollY());
			}
		});
	}

	@Override
	public void onScroll(int scrollY) {//这个是回调接口调用函数,layout函数是view重绘的方法,作用就是当下面的购买布局还没有滑到顶部时,把两个布局绘制在一起,当下面的购买布局滑出屏幕 ,就把顶部的购买布局绘制在顶部不动,就实现类似效果。
		int mBuyLayout2ParentTop = Math.max(scrollY, mBuyLayout.getTop());
		mTopBuyLayout.layout(0, mBuyLayout2ParentTop, mTopBuyLayout.getWidth(), mBuyLayout2ParentTop + mTopBuyLayout.getHeight());
	}
}

以上思路和部分代码是借鉴夏安明大神的文章,博客地址:https://blog.csdn.net/xiaanming

如有问题请留言,转载注明出处。

点击复制链接 与好友分享!回本站首页
相关TAG标签 团团 控件 详情
上一篇:android获取设备信息
下一篇:android如何在BaseAdapter内使用notifyDataSetChanged()方法以及线程的使用
相关文章
图文推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站