有些时候,安卓要向IOS一样,将安卓自己的actionbar隐藏自设一个标题栏,而且有时需求又要将这个自设的标题栏实现内容滚动后能够跟着透明渐变。我在百度搜索了一大堆废话文章后,找了一个类似的功能改造成自己需求的效果。demo实现的简陋,见谅!
首先我们看看布局,非常简单:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ListView
android:id="@+id/ma_listview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="none"
android:divider="@android:color/black"
android:dividerHeight="0.5dp"
android:cacheColorHint="@android:color/transparent"
android:headerDividersEnabled="false"
android:footerDividersEnabled="false"
android:listSelector="@android:color/transparent" >
</ListView>
<LinearLayout
android:id="@+id/title_view"
android:layout_width="match_parent"
android:layout_height="60dp"
android:background="#E42F47"
android:orientation="horizontal" >
<TextView
android:id="@+id/tt_t1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="left|center"
android:text="《《《"
android:textSize="18sp"
android:layout_margin="10dp"
android:textAppearance="?android:attr/textAppearanceMedium" />
<TextView
android:id="@+id/tt_t2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="Test_Title"
android:gravity="center"
android:textSize="16sp"
android:textAppearance="?android:attr/textAppearanceMedium" />
</LinearLayout>
</FrameLayout>
其中,id为title_view的LinearLayout即是自设的一个标题栏,我们要实现的就是随着listview的滚动,它能够跟着透明渐变。
那么开始!首先findViewById找出标题栏和listview,然后listview去setAdapter(),重点来了,给listview实现setOnScrollListener的监听事件。我们的思路就是通过获取被监听的控件即listview的第一个item的顶点(top)所在的位置,用它所在顶点的相反值(为什么要相反值?因为获取的这个值往往是个负数,需要取反)去被标题栏控件的高度除,得出一个float的值作为透明的百分比,实时设置标题栏的透明度变化。同时要注意,只有listview第一个item在标题栏周围时才去实现透明渐变。
关键代码在此:
OnScrollListener scrolListener = new OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
// 判断当前最上面显示的是不是头布局
if(firstVisibleItem == 0) {
if(title != null) {
View head_child = view.getChildAt(0);
if(head_child!=null) {
int top = -head_child.getTop();
// 获取头布局的高度
int height = title.getHeight();
// 满足这个条件的时候,只有这个时候,我们才调整透明度
if (top <= height && top >= 0) {
// 获取当前位置占头布局高度的百分比
float alpha = (float)top/(float)height;
title.getBackground().setAlpha((int) (alpha * 255));
// 通知标题栏刷新显示
title.invalidate();
}
}
}
}else if(firstVisibleItem > 0) {
title.getBackground().setAlpha(255);
}else {
title.getBackground().setAlpha(0);
}
}
};
demo地址在这里:
http://download.youkuaiyun.com/detail/u014436704/9284861