实现淘宝和QQ ToolBar透明渐变效果

哎,好久都没写博客了,最近有点懒惰了,今天端午节,在学校也是无聊的蛋疼啊,正好今天玩玩一些在其他app中常见的一些功能。



来看看效果图吧!

这个是人家的图,我懒得自己弄一个,就copy他的了,顺便帮你宣传一下你的简书,不算为过吧^-^. sou,传送门
之前是在简书上面看了一篇实现的这种功能,他是重写CoordinatorLayout的Behavior类来达到效果,也确实理解到了CoordinatorLayout的强大之处啊,但是自己跟着他的效果走的时候 ,感觉好像不是太理想的样子。



今天我来自己 写个

来看看我的效果图:

哇塞,好牛逼的样子,额,其实也就那么回事。

来讲讲思路吧

草稿画。。。。这个应该看的懂吧,就是一些控件的分布

自己用画图软件画的,自己看的都心醉心醉的。

从图中我们应该就能了解到,其实这些好像就那么回事,拿到高度,然后设置透明度就行了,其实,是这个样子的

首先,我们要知道设置View的透明度的代码

toolbar.getBackground().setAlpha(Interger);

参数设置的是透明度的变化值为0~255,颜色数嘛是吧。

然后看看获取变化距离区间的代码

headHeight= headView.getMeasuredHeight()-toolbar.getMeasuredHeight();

这样,我们就拿到距离的代码了,现在两样都齐全了,怎样才能将他们关联起来呢,我们想想,当前滚动的ScrollView的Y值去减去这个headHeight,这个相差值只允许他在headHeight的高度去变化,如果ScrollView滑动的距离超出这个高度的话,那么我们直接设置alpha为255直接显示变透明,如果这个ScrollView滑动的到顶部时,我们直接设置alpha为0为透明,我们首先拿到这个变化的距离,然后去除以这个headHeight高度拿到这个百分比,然后去乘上255拿到同等比例中的透明度的值,记得这个数值都得是float类型,高度也是,要是int的话这样相除的话就变成0了。

alpha=((float)(getScrollY()-headHeight)/headHeight)*255

拿到这个透明度后就可以设置进去了,思路就是这么简单,现在来贴下代码。

MainActivity.class

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        AlphaTitleScrollView scroll = (AlphaTitleScrollView) findViewById(R.id.scrollview);
        LinearLayout title = (LinearLayout) findViewById(R.id.title);
        ImageView head = (ImageView) findViewById(R.id.head);
        scroll.setTitleAndHead(title, head);
        title.getBackground().setAlpha(0);
    }

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

    <view.AlphaTitleScrollView
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/scrollview"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical" >

<!--             显示的head为ImageView -->
            <ImageView
                android:id="@+id/head"
                android:layout_width="match_parent"
                android:layout_height="500px"
                android:scaleType="fitXY"
                android:src="@drawable/a" />

            <TextView
                android:layout_width="match_parent"
                android:layout_height="100dp"
                android:gravity="center"
                android:text="haha" />

            <TextView
                android:layout_width="match_parent"
                android:layout_height="100dp"
                android:gravity="center"
                android:text="haha" />

            <TextView
                android:layout_width="match_parent"
                android:layout_height="100dp"
                android:gravity="center"
                android:text="haha" />

            <TextView
                android:layout_width="match_parent"
                android:layout_height="100dp"
                android:gravity="center"
                android:text="haha" />

            <TextView
                android:layout_width="match_parent"
                android:layout_height="100dp"
                android:gravity="center"
                android:text="haha" />

            <TextView
                android:layout_width="match_parent"
                android:layout_height="100dp"
                android:gravity="center"
                android:text="haha" />

            <TextView
                android:layout_width="match_parent"
                android:layout_height="100dp"
                android:gravity="center"
                android:text="haha" />

            <TextView
                android:layout_width="match_parent"
                android:layout_height="100dp"
                android:gravity="center"
                android:text="haha" />

            <TextView
                android:layout_width="match_parent"
                android:layout_height="100dp"
                android:gravity="center"
                android:text="haha" />

            <TextView
                android:layout_width="match_parent"
                android:layout_height="100dp"
                android:gravity="center"
                android:text="haha" />
        </LinearLayout>
    </view.AlphaTitleScrollView>
<!-- title标题栏-->
    <LinearLayout
        android:id="@+id/title"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:background="#FCFCFC"
        android:gravity="center_vertical"
        android:orientation="horizontal" >

        <ImageView
            android:layout_width="20dp"
            android:layout_height="20dp"
            android:layout_marginLeft="20dp"
            android:gravity="center_vertical"
            android:src="@drawable/arrow"
            android:textColor="#fff" />
    </LinearLayout>

</RelativeLayout>
AlphaTitleScrollView.class
public class AlphaTitleScrollView extends ScrollView {
    public static final String TAG = "AlphaTitleScrollView";
    private int mSlop;
    private LinearLayout toolbar;
    private ImageView headView;

    public AlphaTitleScrollView(Context context, AttributeSet attrs,
            int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context);
    }

    public AlphaTitleScrollView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
        // TODO Auto-generated constructor stub
    }

    public AlphaTitleScrollView(Context context) {
        this(context, null);
    }

    private void init(Context context) {
        // mSlop = ViewConfiguration.get(context).getScaledDoubleTapSlop();
        mSlop = 10;
        Log.i(TAG, mSlop + "");
    }

    /**
     *
     * @param headLayout
     *            头部布局
     * @param imageview
     *            标题
     */
    public void setTitleAndHead(LinearLayout toolbar, ImageView headView) {
        this.toolbar = toolbar;
        this.headView = headView;
    }

    @Override
    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
        float headHeight = headView.getMeasuredHeight()
                - toolbar.getMeasuredHeight();
        int alpha = (int) (((float) t / headHeight) * 255);
        if (alpha >= 255)
            alpha = 255;
        if (alpha <= mSlop)
            alpha = 0;
        toolbar.getBackground().setAlpha(alpha);

        super.onScrollChanged(l, t, oldl, oldt);
    }
}

主要呢还是重写ScrollView,将需要变化的布局传递给他,然后重写ScrollView的onScrollChanged方法,里面的参数看看应该明白了,那是当前ScrollView的坐标距离顶部的top距离和左边left距离,和之前分析的一样,只不过getScrollY()的值变成了t而已,方法中的高度都给传给你了,那就更简单了。



来说说做的时候的误区和不解。
①、之前来改变这个透明度的时候我是重写了onTouchEvent方法,手指在滑动的时候来获取距离差来设置透明度,这样做确实是能做出来,但是在手指离开屏幕,scrollview还在滑动的时候,就不走move方法,这个比例值也就不再变化了,到达顶部的时候透明度都没有什么变化,所以,不能从这里入手,我上面说那位简书哥们给的方法,我体验的就是这样的,所以不是太好。
②、 mSlop=ViewConfiguration.get(context).getScaledDoubleTapSlop();
这个值好坑爹啊,之前看大神们写说是触动滑动事件最好是超过这个距离再来触发,我就用了这个,发现不对,log出来一下mSlop是300px,总共这个头部才没多少,所以就不用他了,直接自己定义为10px就差不多了,设这个主要是为了到达这个值的时候直接设置为全透明了,免得还要使劲滑到0才设置透明度的话,那样体验就不好了,给个缓冲值会更好点。
③、喜欢给距离设置dp的我也是醉了,200dp被我log出来是600,要好好注意点了,虽然这个没什么,不影响代码,但是还是要注意的。

时间: 2024-08-01 16:18:58

实现淘宝和QQ ToolBar透明渐变效果的相关文章

一个300多万关注的淘宝客QQ空间给站长的启示

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 前段时间常晓峰写过几篇关于7474.html">草根站长如何利用QQ空间来给网站导流量.今天继续分享关于QQ空间可以给我们草根站长带来的好处.现在的独立淘宝客网站是越来越难做了.然而一个300多万关注的淘宝客QQ空间让很多一直在迷惑的淘宝客们发现了新的机会,同样也是我们草根站长值得思考网站流量导入的新方向. 下面是今天分享的一

园友们注意:淘宝网上QQ会员 4钻 3元 等都为骗子行为

  淘宝以便利的购物方式,成为了越来越多的朋友们的选择. 很多朋友在淘宝购买各种QQ业务.大家知道,腾讯官方的业务是10元/月, 包括QQ7钻即: 红黄蓝绿粉紫钻(其中紫钻分为QQ堂和QQ音速),会员,交友, 这几个最低的成本价格也就是8.0/月. 那么,大家就要注意了,低于这个价格的,如果不是很离谱,有可能是卖家赔钱赚信誉的. 如果是低的很离谱的,比如"QQ黄钻每月3元","3个月9元","半年20元"这类的, 基本上可以断定为骗子,这种是根本

书慧:如何正确推理淘宝排名算法

作为一个资深淘宝卖家,你是否有以下三种困惑: 1.密切关注淘宝搜索排名,可多年后依然对排名因素认识模糊? 2.不管如何努力,销量不低,但排在首页的却仍然是别人的宝贝? 3.无奈之下,为生存,只能依靠直通车带来流量,结果流量越大,排名越靠后? 为什么淘宝开店多年后,依然对淘宝搜索排名认识模糊? 因为淘宝排名是决定了300万淘宝卖家利益分配的极为敏感问题.可能是为卖家之间的公平,可能是为避免纠纷,可能是为避免竞争对手效仿.但不管是出于哪种原因,淘宝都是不会公布排名算法和相应权重的,即使公布也都是无关

单页面做淘宝客的几个必须了解的知识

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 引言: Google中国的退出,中小站长朋友似乎都感受到了一些不利影响.本人做adsense也有一年时间,流量80%来自搜索引擎,而Google又占据了搜索流量的75%以上.可想而知,Google的退出,已经给我们这些靠其流量吃饭的小站长造成很大影响,Google收录量锐减,流量暴跌,adsense收入也只有以前的30%左右.而马云适时推出的

刷单被罚,小卖家围攻大卖家事件,接下来是淘宝BUG,流量被劫

2013年,对淘宝C店卖家来说是紧张的一年,刷单被罚,小卖家围攻大卖家事件,接下来是淘宝BUG,流量被劫.C店卖家,还能更"背"一点么?于是,业内陆续出来一些文章,试图去探讨"命途多舛"的淘宝C店出路在何方.想了很多,酝酿了许久,我试着从公正客观的角度来写一篇,讲讲C店的地位,C店到底该怎么走. 淘宝,天使还是恶魔? 12月5日,C店卖家刷单招致下架,引发小卖家集体围攻大卖事件爆发.第一时间,我打电话给两个C店掌柜朋友,询问他们店铺是否受到影响,得到的答案一个是没有

淘宝网曝光台上线用户可对伪劣商品和不良商家进行举报

和讯科技消息 3月8日,淘宝网曝光台上线.该平台不仅会定期公布淘宝网店铺处罚名单及网购中的一些不良现象,同时,用户也可以通过曝光台这一入口对伪劣商品和不良商家进行举报. 淘宝网表示,曝光台将成为一个面向消费者和社会公众的曝光平台,定期公布网购中的一些不良现象和淘宝网近期的店铺处罚情况,将淘宝网的处罚和抽检结果完全公开化.同时,淘宝也会通过这个平台接受广大用户监督和举报.这是淘宝网打造安全透明的网络购物平台,净化网购环境的一项有力举措. 淘宝网曝光台上线,意味着淘宝网将排查.处罚的结果由后台转向前

淘宝网三个半月打击假货180万件

4月21日,亚洲最大网络零售商圈淘宝网宣布,2010年1月至4月20日,淘宝网一共打击 假货180万余件,处罚网店超过八千家.目前已有547家品牌厂商加入到淘宝联合打假的行动中. 2009年12月,淘宝网宣布拿出一亿元来支持打假行动和建设网购保障.此举是继重拳打击外部炒作信用黑色产业链后,开展的新一轮"全民打假"运动,呼吁广大消费者.品牌厂商加入到打假行列中,共同打假网络售假行为.2010年3月8日,淘宝网联合瑞士军刀.阿迪达斯.爱普生.优衣库.李宁.以纯等二十余品牌商在杭州共同签署发

淘宝联盟新规则下没有跨店权限双十二怎么过?(一)

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 人生一世,不可能一帆风顺,淘宝联盟大规模去掉用户跨店结算权限,这意味着今天淘宝客的双十二不好过,不过,日子虽然难过,但也不是不能过,如果现在没有可以取代淘宝客的产品,那么,您还是要把淘宝客当做主要盈利手段的. 对于淘宝客接触时间不长的朋友,可能不是很了解跨店结算权限的引申含义,给您提个醒,如果没有跨店结算权限,您就不能够推广天猫的任何活动,如

腾讯电商紧随淘宝身后推出了多个品牌的 B2B2C 业务

腾讯电商在拍拍的 C2C 失利后,又紧随淘宝身后推出了多个品牌的 B2B2C 业务,然而仍未取得想要的成效. 编者注:腾讯以 IM 起家,在门户.SNS.游戏等领域都获得了较大的市场份额,但是在电商领域却一直默默无闻.时至今日,腾讯的电商业务已经耕耘 8 年之久,从 05 年的种子项目 C2C 拍拍网到 08 年 B2B2C 平台 QQ 商城,从电子商务业务并入 B2 业务线从而诞生的 QQ 网购再到去年分拆独立被赋予更高的战略意义.自 2013 年起,腾讯电商已然频繁出现在公众的视线之中. 本