ListView+TitleBar实现滚动ListView时TitleBar的透明度随之变化

越来越多的应用用到这种效果,自己动手写了写,希望和大家互相交流学习,不足之处还请不吝赐教。闲话不多,先上图:




原理是根据ListView当前滑动的高度和一个固定的高度值(需要在此时设置TitleBarView的alpha值为1)相除,得到一个alpha值,来动态设置TitleBar的透明度。


布局文件如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >


    <ListView
        android:id="@+id/mlistview"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#f2f2f2"
        android:cacheColorHint="#00000000"/>


    <LinearLayout
        android:id="@+id/layout_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#FF0000" >


        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:padding="10dp"
            android:text="比赛页面"
            android:textColor="#FFFFFF"
            android:textSize="18sp" />
    </LinearLayout>


</RelativeLayout>



代码如下:

package com.example.testactivity;


import com.nineoldandroids.view.ViewHelper;


import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.util.SparseArray;
import android.view.View;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.ArrayAdapter;
import android.widget.LinearLayout;
import android.widget.ListView;


public class MainActivity extends Activity {

private ListView mlistview;
private LinearLayout layout_title;
private int MAX_NUMBER = 40;


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

layout_title = (LinearLayout) findViewById(R.id.layout_title);
mlistview = (ListView) findViewById(R.id.mlistview);

String[] arrayStr = new String[MAX_NUMBER];
for(int i = 0; i < MAX_NUMBER; i ++){
arrayStr[i] = i+"";
}
mlistview.setAdapter(new ArrayAdapter<String>(this, 
android.R.layout.simple_expandable_list_item_1, arrayStr));
mlistview.setOnScrollListener(new OnScrollListener() {

private SparseArray<ItemRecod> RecodSA = new SparseArray<>();
private int mFirstItem = 0;
private int defaultHeight = 0;

@Override
public void onScrollStateChanged(AbsListView arg0, int arg1) {
}

@SuppressLint("NewApi")
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
// firstVisibleItem 当前第一个item的坐标

mFirstItem = firstVisibleItem;
// 当前页的第一个Item的View对象
View firstView = view.getChildAt(0);
if (null != firstView) {
ItemRecod itemRecord = RecodSA.get(firstVisibleItem);
if (null == itemRecord) {
//处理快速滑动时,跳过的情况
//检测有没有跳过
for (int i = 0; i < firstVisibleItem; i++) {
if (null == RecodSA.get(i)) {
//被跳过了,取上一个的高度,top不用管
ItemRecod skipItem = new ItemRecod();
skipItem.height = defaultHeight;
RecodSA.append(i, skipItem);
}
}
itemRecord = new ItemRecod();
}
itemRecord.height = defaultHeight = firstView.getHeight();
itemRecord.top = firstView.getTop();
RecodSA.append(firstVisibleItem, itemRecord);
}
float alpha = ((float) (getScrollY()) / (float) (500));
if (alpha > 1.0f) {
alpha = 1.0f;
}
ViewHelper.setAlpha(layout_title, alpha);
}
private int getScrollY() {
int height = 0;
// 此处采用循环遍历的方式而不用height*item数量的原因是,item的高度可能不一致。
for (int i = 0; i < mFirstItem; i++) {
ItemRecod itemRecod = RecodSA.get(i);
//处理快速滑动
height += itemRecod.height;
}
ItemRecod itemRecod = RecodSA.get(mFirstItem);
if (null == itemRecod) {
itemRecod = new ItemRecod();
}
return height - itemRecod.top;
}

class ItemRecod{
int height;
int top;
}
});
}

}

猜你喜欢

转载自blog.csdn.net/u012487644/article/details/50427443