闲下来,回顾一下以前做过的东西,总想着总结一下,却总是用没时间来搪塞自己,我也是服了,废话不多说,进入正题:
滑动渐变色,滑动控件悬浮是两个功能,不过这两个有关联,就写一起了,如有需要,分开粘贴就好;
首先说下思路:
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那里还是需要的,因为要动态的获取最上方控件在手机屏幕的显示着的高度
过几天闲下来更新其他控件,以及常用代码思路,感谢~