透明度可变的标题栏效果实现

我们在做类似于个人主页类应用的时候,可能会遇到这样的需求,效果如下

相信大家应该看明白是什么效果了,就是随着列表的滑动,上面的标题栏的透明度会随之变化。在IOS中,有很多的软件有这种效果,下面,我们看一下这种效果是如何实现的。

先看一下项目的目录

我们可以看到,目录结构很简单,因为我这个地方是使用的XListview代替的Listview,有很多文件都是XListview自带的,所以显得文件多一些,如果没使用过XListview,请先百度XListview看看。

这里面,我们需要重点关注的只有一个文件,就是MainActivity,我们的关键代码都在这里,下面,我们看一下代码实现

/**
 * 透明度可变的标题栏
 *
 * @author Zhao KaiQiang
 *
 * @Time 2014-6-20 上午11:46:42
 */
public class MainActivity extends Activity implements OnScrollListener {

	private XListView listView;
	// 标题栏的布局
	private RelativeLayout rl_title;
	// ListView的头布局
	private View headerView;
	// 头布局的高度
	private int headerHeight;
	private LayoutInflater inflater;
	private Handler handler = new Handler();

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		rl_title = (RelativeLayout) findViewById(R.id.rl_title);
		listView = (XListView) findViewById(R.id.list);

		rl_title.getBackground().setAlpha(0);
		inflater = LayoutInflater.from(this);
		headerView = inflater.inflate(R.layout.header_listview, null);
		// 添加头布局
		listView.addHeaderView(headerView);
		listView.setAdapter(new MyAdapter());
		// 设置滚动监听
		listView.setOnScrollListener(this);
		// 设置可以刷新与加载更多
		listView.setPullLoadEnable(true);
		listView.setPullRefreshEnable(true);
		listView.setXListViewListener(new IXListViewListener() {

			@Override
			public void onRefresh() {
				// 单纯的模拟刷新过程
				handler.postDelayed(new Runnable() {

					@Override
					public void run() {
						listView.stopRefresh();
					}
				}, 500);
			}

			@Override
			public void onLoadMore() {
				// 单纯的模拟加载过程
				handler.postDelayed(new Runnable() {

					@Override
					public void run() {
						listView.stopLoadMore();
					}
				}, 500);
			}
		});

	}

	// 自定义适配器
	private class MyAdapter extends BaseAdapter {

		// 默认显示10个item
		@Override
		public int getCount() {
			return 10;
		}

		@Override
		public Object getItem(int position) {
			return position;
		}

		@Override
		public long getItemId(int position) {
			return position;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			if (convertView == null) {
				convertView = inflater.inflate(R.layout.item_list, null);
			}

			return convertView;
		}

	}

	@Override
	public void onScrollStateChanged(AbsListView view, int scrollState) {

	}

	// 最重要的方法,标题栏的透明度变化在这个方法实现
	@Override
	public void onScroll(AbsListView listView, int firstVisibleItem,
			int visibleItemCount, int totalItemCount) {
		// 判断当前最上面显示的是不是头布局,因为Xlistview有刷新控件,所以头布局的位置是1,即第二个
		if (firstVisibleItem == 1) {
			// 获取头布局
			View view = listView.getChildAt(0);
			if (view != null) {
				// 获取头布局现在的最上部的位置的相反数
				int top = -view.getTop();
				// 获取头布局的高度
				headerHeight = view.getHeight();
				// 满足这个条件的时候,是头布局在XListview的最上面第一个控件的时候,只有这个时候,我们才调整透明度
				if (top <= headerHeight && top >= 0) {
					// 获取当前位置占头布局高度的百分比
					float f = (float) top / (float) headerHeight;
					rl_title.getBackground().setAlpha((int) (f * 255));
					// 通知标题栏刷新显示
					rl_title.invalidate();
				}
			}
		} else if (firstVisibleItem > 1) {
			rl_title.getBackground().setAlpha(255);
		} else {
			rl_title.getBackground().setAlpha(0);
		}
	}

}

代码是不是不复杂?我们只需要实现onScroll方法就可以,在这里面,完成我们对HeaderView的位置的检测,然后通过HeaderView的高度和显示的高度来计算比例,设置到TitleBar的背景图片的透明度即可。

透明度可变的标题栏效果实现,布布扣,bubuko.com

时间: 2024-08-07 11:24:01

透明度可变的标题栏效果实现的相关文章

Android之仿今日头条标题栏效果

学习Android应用开发已经有一段时间了,对涉及应用开发的主要基础知识已经有了一定的了解,学习过程中写的博客被我整理成立了一个专栏<Android应用开发基础>.但是基本上写的代码都是一些单一知识点的演示Demo,与一个完整的产品相差甚远.要具备开发复杂的产品级应用的能力,在掌握了应用开发的基础知识的前提下,最好的方法莫过于模仿别人开发的优秀应用.在模仿中循序渐进,以程序员角度去看待每一个APP是如何实现的,它有什么优缺点,并从中提升自己.模范别人应用其实就是一种开发的学习手段,因为如果自己

JS实现背景透明度可变,文字不透明的效果

最近项目里需要实现这么个功能,类似网游中的聊天框,背景都是透明的,但是文字是不透明.所以如果简单的使用opacity(非IE)和alpha滤镜(IE)是无法实现这个效果的,会造成全部透明. 解决办法如下: 1.实现完全透明: 设置background为transparent即可,两个浏览器通用 2.实现透明度可调节: 要求改透明度,这里IE和非IE需要分开处理 非IE浏览器可通过支持CSS3的方式处理(不支持CSS3的这里忽略了),css的写法是 padding: 0px; color: rgb

如何在Android中实现全屏,去掉标题栏效果

在进行Android UI设计时,我们经常需要将屏幕设置成无标题栏或者全屏.要实现起来也非常简单,主要有两种方法:配置xml文件和编写代码设置.   1.在xml文件中进行配置   在项目的清单文件AndroidManifest.xml中,找到需要全屏或设置成无标题栏的Activity,在该Activity进行如下配置即可.   实现全屏效果: android:theme="@android:style/Theme.NoTitleBar.Fullscreen" 实现无标题栏(但有系统自

漂亮的ActionBar效果

Newsstand—这个应用引进了新的方式,使得ActionBar达到了新的水平.如果你打开这个应用的发布页,你会注意到不带图标的ActionBar是半透明的,而且和一个大的图片集(一个大的杂志图标,描述了一些新闻)交叠在一起.一旦你开始下滑,大杂志图标会位移并缩放,以匹配ActionBar的图标所在. 这样做的主要优势是使ActionBar真正成为内容的一部分. 在这篇文章中,我主要解释一下如何制作整个发布页面(ActionBar效果和Ken Burns动画).我将详细介绍一下ActionBa

QT 窗体控件的透明度设置(三种方法)

整个窗体 当设置QT的窗体(QMainWindow, QDialog)时,直接用 [cpp] view plain copy targetForm->setWindowOpacity() 函数即可实现,效果为窗体及窗体内所有控件都透明化了. 二.自定义页面或控件 当设置一个QWidget(一般自定义页面或控件时用QWidget)时,直接设置其窗体透明度无法实现透明效果,目前找到的方法是将整个QWidget当做图形元素,对该图形元素进行设置透明度效果, [cpp] view plain copy

WPF 自定义标题栏

自定义标题栏效果如上,代码示例 <Grid> <Grid.Resources> <Style TargetType="RadioButton"> <Setter Property="Margin" Value="0.5,2"></Setter> <Setter Property="Template"> <Setter.Value> <Co

Android开发之动画效果浅析

Android开发之动画效果浅析 请尊重他人的劳动成果,转载请注明出处:Android开发之动画效果浅析 程序运行效果图: Android动画主要包含补间动画(Tween)View Animation.帧动画(Frame)Drawable Animation.以及属性动画Property Animation.下面依次介绍一下各个动画. 1.   补间动画(Tween) Tween动画,通过对View 的内容进行一系列的图形变换 (包括平移.缩放.旋转.改变透明度)来实现动画效果.动画效果的定义可

[学习记录] QT 窗体控件的透明度设置

整个窗体 当设置QT的窗体(QMainWindow, QDialog)时,直接用 targetForm->setWindowOpacity() 函数即可实现,效果为窗体及窗体内所有控件都透明化了. 二.自定义页面或控件 当设置一个QWidget(一般自定义页面或控件时用QWidget)时,直接设置其窗体透明度无法实现透明效果,目前找到的方法是将整个QWidget当做图形元素,对该图形元素进行设置透明度效果, QGraphicsOpacityEffect *opacityEffect=new QG

[ jquery 效果 fadeIn([speed,[easing],[fn]]) fadeOut([speed,[easing],[fn]]) ] 此方法用于通过不透明度的变化来实现所有匹配元素的淡入效果,并在动画完成后可选地触发一个回调函数

fadeIn([speed],[easing],[fn]): 通过不透明度的变化来实现所有匹配元素的淡入效果,并在动画完成后可选地触发一个回调函数,这个动画只调整元素的不透明度,也就是说所有匹配的元素的高度和宽度不会发生变化 fadeOut([speed],[easing],[fn]): 通过不透明度的变化来实现所有匹配元素的淡出效果,并在动画完成后可选地触发一个回调函数,这个动画只调整元素的不透明度,也就是说所有匹配的元素的高度和宽度不会发生变化 实例: <html lang='zh-cn'>