标题栏仿QQ空间(透明度变化)效果

距离上次已经有两个多月没写过文章了,现在分享的是:标题栏仿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() {
        //暂时用不上,待用
    }
}

大致的源码界面如下:
大致源码界面

源码传送门

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值