距离上次已经有两个多月没写过文章了,现在分享的是:标题栏仿QQ空间(透明度变化)效果,以下是showtime时间:
在上次的代码(banner轮播图缓存实现(内存+硬盘+网络))的基础上,加入了一些新的元素进去。里面主要实现了两个效果:1、标题栏仿QQ空间(透明度)效果;2、标题栏在下拉列表是隐藏,上拉列表时出现。
一、主要代码段:
1、在MainActivity中的代码块如下:
@Override
public void moveLogic() {
mListView.setOnAlphaChangedListener(new OnAlphaChangedListener() {
@Override
public void alphaChange(float delta, int firstVisibleItem,
int visibleItemCount) {
**//注释的这段代码是实现下拉是title消失,上拉时title出现的效果**
/* int top = 0;
if (delta < 0 && title_rl.getY() > -1 * title_rl.getHeight()) // 向上滑动
{
top = top - title_rl.getHeight() + 2;
title_rl.setY(top);
mListView.setMarginTop(top);
title_rl.invalidate();
}
if (delta > 0 && title_rl.getY() < 0) // 下拉 的时候 topView复原就不再滑动
{
// top = top;
title_rl.setY(top);
mListView.setMarginTop(top);
title_rl.invalidate();
}*/
Log.e(TAG, "Y" + title_rl.getY());
**//此处为仿QQ空间title处的效果**
if(firstVisibleItem == 1 && delta != 0)
{
int distance = getScrollY();
float bannerViewH = bannerView.getHeight() * 1.0f;
if(distance >= 0 && distance <= bannerViewH / 2)
{
float alpha = (float) (1 - (distance / bannerViewH) * 1.6);
title_rl.setAlpha(alpha);
}
else
{
if(distance > bannerViewH / 2 && distance <= bannerViewH)
{
float alpha = (float) (-0.6 + (distance / bannerViewH) * 1.6);
title_rl.setAlpha(alpha);
}
}
}
else
{
title_rl.setAlpha(1.0f);
}
}
});
}
/** 获取第一个item距离顶部的距离(减掉了banner的高度) */
public int getScrollY() {
View c = mListView.getChildAt(0);
if (c == null) {
return 0;
}
int firstVisiblePosition = mListView.getFirstVisiblePosition();
int top = c.getTop();
return -top + firstVisiblePosition * c.getHeight()
- bannerView.getHeight();
}
2、在XListView中的代码块如下:
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
**//关键代码**
if (mDeltaY != 0) {
onAlphaChangedListener.alphaChange(mDeltaY, firstVisibleItem,
visibleItemCount);
}
// 发送到用户的侦听器
mTotalItemCount = totalItemCount;
if (mScrollListener != null) {
mScrollListener.onScroll(view, firstVisibleItem, visibleItemCount,
totalItemCount);
}
}
二、调用时机:
这次的代码中我简单的参考了MVP的设计模式android中MVP模式(一),在此谢谢原作者,调用的入口如下:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
//调用入口
IPresenter presenter = new IPresenter(this);
presenter.setAlphaChange();
DisplayMetrics dm = new DisplayMetrics();
// 获取屏幕信息
getWindowManager().getDefaultDisplay().getMetrics(dm);
int screenWidth = dm.widthPixels;
Ipresenter里面的代码:
/**
* 逻辑处理调用(主导器)
* @author jackom z
*
*/
public class IPresenter {
private IView mView;
private IModel mModel;
public IPresenter(IView mView)
{
this.mView = mView;
mModel = new MyModel();
}
public void doModelLogic()
{
mModel.doLogic();
}
public void setAlphaChange()
{
mView.moveLogic();
}
}
IView接口里面的代码:
/**
* View的接口管理类(更新ui中的view状态)
* @author jackom z
*
*/
public interface IView {
/** 刷新数据 */
public void refreshData();
/** 滑动逻辑 */
public void moveLogic();
}
IModel接口里面的代码:
/**
* 模型接口(处理业务逻辑,这里指数据读写)
* @author jackom z
*
*/
public interface IModel {
/** 处理逻辑 */
public void doLogic();
}
MyModel类里面的代码:
/**
* 实际模型类
* @author jackom z
*
*/
public class MyModel implements IModel {
@Override
public void doLogic() {
//暂时用不上,待用
}
}
大致的源码界面如下: