安卓上下滑动头部渐变色以及上下滑动控件悬浮一起来

    闲下来,回顾一下以前做过的东西,总想着总结一下,却总是用没时间来搪塞自己,我也是服了,废话不多说,进入正题

    滑动渐变色,滑动控件悬浮是两个功能,不过这两个有关联,就写一起了,如有需要,分开粘贴就好;

首先说下思路:

        1。滑动渐变色:利用ListView(或者第三方ListView,比如pullToRefresh的或者Swipe的等等都可以,最终都是会回到AbsListView)的OnScrollListener监听来做,检测ListView头部控件的滑动高度来改变颜色,如果你当前页面只有一个ListView,那当然就非常容易了,直接检测ListView滑动就行,但是现在产品几乎都不会这样设计,基本上都是最上面一个广告条啊,中间来个gridview啊,下面在来点条目啊,比如(淘宝,京东),那么这时候有人就会用ScrollView嵌套gridview或者listview来做了,然后会去给ScrollView做滑动监听,记得这样是不可以的,千万不要用ScrollView,千万不要用ScrollView,千万不要用ScrollView,重要的事情说三遍,scrollView的滑动是不准的,一旦手指离开手机屏幕,滑动惯性所造成的那一小部分滑动是监听不到的,所以一定要用ListView,然后通过listview的添加头布局,脚布局方法去写页面(不知道方法,自行百度);

        2。上下滑动控件悬浮:原理其实不是这个控件悬浮在那里了,而这其实是两个控件,在刚初始化的时候的控件A,和滑动悬浮时候的控件B,长相虽然一样,但其实是两个东西,在向上滑动的时候A逐渐消失,此时B显示出来,并且一直存在,在向下滑动的时候,到达一个临界点B消失,A自然出来;

渐变色部分

        mListView.setOnScrollListener(new AbsListView.OnScrollListener() {

            @Override

            public void onScrollStateChanged(AbsListView view, int scrollState) {

            }

            @Override

            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {

                //listview添加的最上方的控件高度  

                int dx = (-1) * mAdImageCycleView.getTop();

                if (dx > 0) {

//mAdImageCycleView.getTop() 控件高度;

//mAdImageCycleView.getMeasuredHeight()控件显示在屏幕上的高度

                    if (dx > mAdImageCycleView.getTop() + mAdImageCycleView.getMeasuredHeight()) {

//R.color.tool_bar_bg_color 向下滑动时候,渐变的最终颜色

                        mToolbar.setBackgroundColor(ContextCompat.getColor(getActivity(), R.color.tool_bar_bg_color));

                    } else{

//设置渐变时候色值变化

                        float persent = dx * 1f / (mAdImageCycleView.getTop() + mAdImageCycleView.getMeasuredHeight());

                        int alpha = (int) (255 * persent);

                        int color = Color.argb(alpha, 249, 249, 249);

                        mToolbar.setBackgroundColor(color);

                    }

                }else if (dx == 0){

//R.color.transparent  透明色

                    mToolbar.setBackgroundColor(ContextCompat.getColor(getActivity(), R.color.transparent));

                }

                //处理头布局是否显示,如果不需要控件悬浮的,可以不要这部分代码

                // 获取筛选View、距离顶部的高度

                if (itemHeaderFilterView == null) {

                    itemHeaderFilterView = lv.getChildAt(filterViewPosition - firstVisibleItem);

                }

                if (itemHeaderFilterView != null) {

//用来判断滑动到什么位置时候显示悬浮(filterViewTopMargin 就是一个数值,判断滑动距离)

//DensityUtil工具类往下看

                    filterViewTopMargin = DensityUtil.px2dip(getActivity(), itemHeaderFilterView.getTop());

                }

                // 处理筛选是否吸附在顶部

                if (filterViewTopMargin <= mToolbarHeight || firstVisibleItem > filterViewPosition) {

                    mLayoutHeader.setVisibility(View.VISIBLE);

                    mLayoutFlyline.setVisibility(View.VISIBLE);

                } else {

                    mLayoutHeader.setVisibility(View.INVISIBLE);

                    mLayoutFlyline.setVisibility(View.INVISIBLE);

                }

            }

        });


import android.app.Activity;

import android.content.Context;

import android.util.DisplayMetrics;

/**

* Created by Administrator on 2016/1/19.

*/

public class DensityUtil {

    // 根据手机的分辨率将dp的单位转成px(像素)

    public static int dip2px(Context context, float dpValue) {

        final float scale = context.getResources().getDisplayMetrics().density;

        return (int) (dpValue * scale + 0.5f);

    }

    // 根据手机的分辨率将px(像素)的单位转成dp

    public static int px2dip(Context context, float pxValue) {

        final float scale = context.getResources().getDisplayMetrics().density;

        return (int) (pxValue / scale + 0.5f);

    }

    // 将px值转换为sp值

    public static int px2sp(Context context, float pxValue) {

        final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;

        return (int) (pxValue / fontScale + 0.5f);

    }

    // 将sp值转换为px值

    public static int sp2px(Context context, float spValue) {

        final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;

        return (int) (spValue * fontScale + 0.5f);

    }

    // 屏幕宽度(像素)

    public static  int getWindowWidth(Activity context){

        DisplayMetrics metric = new DisplayMetrics();

        context.getWindowManager().getDefaultDisplay().getMetrics(metric);

        return metric.widthPixels;

    }

    // 屏幕高度(像素)

    public static int getWindowHeight(Activity activity){

        DisplayMetrics metric = new DisplayMetrics();

        activity.getWindowManager().getDefaultDisplay().getMetrics(metric);

        return metric.heightPixels;

    }

}


另外说一下,我最上方控件是一个定死高度的广告条,那么,你可以用死值去写,省去getTop那个步骤,但是getMesure那里还是需要的,因为要动态的获取最上方控件在手机屏幕的显示着的高度

过几天闲下来更新其他控件,以及常用代码思路,感谢~

你可能感兴趣的:(安卓上下滑动头部渐变色以及上下滑动控件悬浮一起来)