Android scrollview 上滑固定某一控件(美团团购详情UI)完美版

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

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

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

Android scrollview 上滑固定某一控件(美团团购详情UI)完美版

时间: 2024-12-23 23:44:00

Android scrollview 上滑固定某一控件(美团团购详情UI)完美版的相关文章

Android学习笔记(七)——常见控件

//此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! Android 给我们提供了大量的 UI控件,下面我们简单试试几种常用的控件. 一.TextView 在布局文件中加入TextView元素: 1 <TextView android:text="This is TextView!" 2 android:gravity="center" 3 android:layout_width="match_parent&qu

android开源系列:CircleImageView自定义圆形控件的使用

1.自定义圆形控件github地址:https://github.com/hdodenhof/CircleImageView 主要的类: package de.hdodenhof.circleimageview; import edu.njupt.zhb.main.R; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Bitmap; import andr

Android自定义控件View(三)组合控件

不少人应该见过小米手机系统音量控制UI,一个圆形带动画效果的音量加减UI,效果很好看.它是怎么实现的呢?这篇博客来揭开它的神秘面纱.先上效果图 相信很多人都知道Android自定义控件的三种方式,Android自定义控件View(一)自绘控件,Android自定义控件View(二)继承控件,还有就是这一节即将学习到的组合控件.我们通过实现圆形音量UI来讲解组合控件的定义和使用. 组合控件 所谓组合控件就是有多个已有的控件组合而成一个复杂的控件.比如上图的音量控件就是一个完美的组合控件.我们来分析

android快速上手(三)常用控件使用

完成了android的第一个程序HelloWorld,下面就开始控件的学习,下面是一些常见的控件. (一)TextView 简单的文本描述 (二)EditText 编辑框,输入文字信息 (三)Button 按钮,点击后会触发点击事件,可以对事件进行处理 (四)ImageView 图片控件,可以加载图片显示 (五)ListView 列表,需要跟适配器Adapter结合,适配器提供数据 (六)Toast 闪现提示语,常用于普通的提示文本,只显示一小段时间自动消失 (七)ScrollView 一般用于

android在代码中四种设置控件背景颜色的方法(包括RGB)

转载请注明出处: http://blog.csdn.net/fth826595345/article/details/9208771  TextView tText=(TextView) findViewById(R.id.textv_name); //第1种: tText.setTextColor(android.graphics.Color.RED);//系统自带的颜色类 // 第2种: tText.setTextColor(0xffff00ff);//0xffff00ff是int类型的数据

如何获取上一个页面中checkbox控件选中的值

php开发中,<php开发中.<php开发中.如何获取上一个页面中checkbox控件选中的值呢?并输出出来,以下是代码示例: <? $music=$_POST['music']; //取得所选中的checkbox个数 $coun=count$music; ifis_arrai$music{ echo'您选择的 : '; foreach$musicas$kei=>$var echo'  ['.$var.']'; echo$key; } ?> *****************

获取activity上所有指定类型的控件

Android获取所有指定类型的子控件,这样就不需要逐个使用findViewByID来获取控件,来达到控制状态的目的了. /** * 获取所有指定类型的子控件 * @param T * @return */ private List<View> getAllChildViews(Class<?> T) { View view = this.getWindow().getDecorView(); return getAllChildViews(view, T); } private

解决设置selectedBackgroundView后会把cell上带背景颜色的控件遮住的问题

再给cell自定义选中的背景色时,当选中后会把cell上原来有背景色的控件遮住就像消失了一样,可以用下面的方法解决 我定义的cell的选中背景色是绿色 UIView *bgView = [[UIView alloc]initWithFrame:programCell.bg_View.bounds]; bgView.backgroundColor = [UIColor greenColor]; Cell.selectedBackgroundView = bgView; 未选中的效果 选中时的效果

android robotium获取相同id的的控件

android robotium获取相同id的的控件:http://blog.csdn.net/busjb/article/details/16808551 robotium中同一id的怎么确定点击哪一个:http://zhidao.baidu.com/link?url=QMTQ86nIqfGS8l1xkiytlIguSnG3UZC-C77q3qoGTfOc4AlzJNqVobbfYtfElhFEaEXfnmfla3spwC9snUfAeZGJykAlWLIDHfvTjuimXPG androi