下面是个小例子,给listView设置一个背景,通过感应listView的滑动,让背景也跟着一块动,但是背景动作幅度要比listview大
// Prepare the header view for our list
headerView = new View(this);//headerView是一个只有宽高,没有内容的空白view
headerView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, TOP_HEIGHT));
headerView.setBackgroundColor(Color.BLUE);
mList.addHeaderView(headerView);//给listview设置一个header
mList.setAdapter(new ArrayAdapter<String>(this, R.layout.list_item, strings));
mList.setOnScrollListener(new OnScrollListener() {//listview的滑动监听器
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
/**
* Listen to the list scroll. This is where magic happens ;)
*/
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
// Calculate the ratio between the scroll amount and the list
// header weight to determinate the top picture alpha
Log.i("Alex", "listview的headerView getTop是"+headerView.getTop()+" bottom:"+headerView.getBottom()+" left"+headerView.getLeft()+" 高度"+headerView.getMeasuredHeight()+":"+headerView.getHeight());
alpha = (float) -headerView.getTop() / (float) TOP_HEIGHT;//用头部view距离listview的顶部的距离,除以700,算出一个模糊程度,这样徐化程度就是拖拉距离的正比了
// Apply a ceil
if (alpha > 1) {
alpha = 1;
}
// Apply on the ImageView if needed
if (mSwitch.isChecked()) {
mBlurredImage.setAlpha(alpha);
}
// Parallax effect : we apply half the scroll amount to our
// three views
mBlurredImage.setTop(headerView.getTop() * 2);//设置背景图片据屏幕顶部的距离
mNormalImage.setTop(headerView.getTop() * 2);//设置背景图片据屏幕顶部的距离,这样的话就用模糊的背景把原图盖住了
mBlurredImageHeader.handleScroll(headerView.getTop() / 2);
}
});
}
其中最重要的就是View的setTop和getTop方法,这个方法可以看做得到此view距离屏幕顶端的距离,而且可以动态的设定,与动态设置这个view的marginTop差不多,同时也方便我们定位这个view在屏幕中的相对位置
同理还有getLeft()和getBottom()和getRight(),这样我们就可以动态的获取view的坐标和设置view的位置。
其中view还有getHeight()和getMeasuredHeight()方法,在本例中这两个方法的返回值相同,但是有些需要measure的空间返回值是不同的(会动态更改高度的控件)