4.4自定义状态栏比5.0系统提供改变颜色的更棒(仿QQ个人资料效果)
2016-12-07 16:42
351 查看
好久没写博客了。直接上3图看效果!!!!手机为 oppo r7 android 系统4.4
话不多简单代码如下。。。。
核心api:!!只有4.4以上的系统才有这特性,所以得判断的哟!!
//下面我们开始处理逻辑了。。一般情况下。我们如果没有用actionBar的话都会自定义一个高度用作标题栏。我也是这样做的。
我们前面是做判断>=19的。所以你就按照情况正常写。通过动态改变控件的高度已经控制里面内容显示。。
搞定60%!!!!!接下来就需要一个能监听滑动事件了。。。我是自定义的ScrollView。这个ScrollView 比较特别。也能做回弹效果。以后在将回弹吧。。这是自定义ScrollView
我也不直接贴源代码了。。。。差不多就是这样了。。。。。。
话不多简单代码如下。。。。
核心api:!!只有4.4以上的系统才有这特性,所以得判断的哟!!
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
//下面我们开始处理逻辑了。。一般情况下。我们如果没有用actionBar的话都会自定义一个高度用作标题栏。我也是这样做的。
我们前面是做判断>=19的。所以你就按照情况正常写。通过动态改变控件的高度已经控制里面内容显示。。
搞定60%!!!!!接下来就需要一个能监听滑动事件了。。。我是自定义的ScrollView。这个ScrollView 比较特别。也能做回弹效果。以后在将回弹吧。。这是自定义ScrollView
public class MyScrollView extends ScrollView { private OnScroll onScroll = null; private ScrollBottomListener scrollBottomListener; private ImageView mHeaderImg; private int mHeaderImgMaxHeight; private int mHeaderImgOriginalHeight; public MyScrollView(Context context) { super(context); } public MyScrollView(Context context, AttributeSet attrs) { super(context, attrs); } public MyScrollView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override protected void onScrollChanged(int l, int t, int oldl, int oldt) { if (t + getHeight() >= computeVerticalScrollRange()) { if (scrollBottomListener != null) { scrollBottomListener.scrollBottom(); } } /** * 滑动监听 */ if (onScroll != null) { onScroll.onScrollChanged(l, t, oldl, oldt); } } public void setScrollBottomListener(ScrollBottomListener scrollBottomListener) { this.scrollBottomListener = scrollBottomListener; } /** * 是否滚动到底部 */ public interface ScrollBottomListener { public void scrollBottom(); } public void setOnScrollStatus(OnScroll onScroll) { this.onScroll = onScroll; } public interface OnScroll { void onScrollChanged(int x, int y, int oldx, int oldy); } @Override /** * deltaY: 竖向滑动到头的值: -值就是拉到头了。+值就是拉到尾巴了 * maxOverScrollY:结束后最大超过的值 * isTouchEvent:是否按住拖动到头的值 true 一直为放开拖到到头,false 惯性滑动 */ protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) { // Log.e("masai", "deltaY:" + deltaY + " maxOverScrollY:" + maxOverScrollY + " " + "isTouchEvent:" + isTouchEvent); if (deltaY < 0 && isTouchEvent) { //按住拖到到头的。。动态的改变高度!! //--得正。。。当改变以后。必须得重新布局一下。重新测量一下 if (mHeaderImg != null) { int tempHeader = mHeaderImg.getHeight() - deltaY / 3; if (tempHeader < mHeaderImgMaxHeight) { mHeaderImg.getLayoutParams().height = tempHeader; mHeaderImg.requestLayout(); } } } return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, maxOverScrollY, isTouchEvent); } /** * addHeadr * @param i ImageView 的容器必须是 wrap_content */ public void addHeader(final ImageView i) { this.mHeaderImg = i; this.mHeaderImgMaxHeight = (int) (i.getDrawable().getIntrinsicHeight() * 1.4); //测量出最初的高度。用于回弹 i.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { public void onGlobalLayout() { mHeaderImgOriginalHeight = mHeaderImg.getHeight(); i.getViewTreeObserver().removeOnGlobalLayoutListener(this); } }); } @Override public boolean onTouchEvent(MotionEvent ev) { switch (ev.getAction()) { case MotionEvent.ACTION_UP: if (mHeaderImg != null) { ResetAnimation resetAnimation = new ResetAnimation(mHeaderImg, mHeaderImgOriginalHeight); startAnimation(resetAnimation); } break; } return super.onTouchEvent(ev); } private class ResetAnimation extends Animation { private View v; private int startHeight; private int endHeight; public ResetAnimation(View v, int endHeight) { super(); this.v = v; this.startHeight = v.getHeight(); this.endHeight = endHeight; //动画时间 setDuration(400); setInterpolator(new OvershootInterpolator()); } /** * 会循环调用该方法,表示动画执行的进度 * * @param interpolatedTime 0 - 1!!!动画执行的百分比,如果加了差时器的话可能到1.1,1.2 * @param t */ @Override protected void applyTransformation(float interpolatedTime, Transformation t) { super.applyTransformation(interpolatedTime, t); // 04-19 15:38:05.226 2151-2151/? E/TAG: 457新的高度 日志得知! 开始高度480 // 04-19 15:38:05.241 2151-2151/? E/TAG: 462新的高度 // 04-19 15:38:05.257 2151-2151/? E/TAG: 468新的高度 // 04-19 15:38:05.275 2151-2151/? E/TAG: 473新的高度 // 04-19 15:38:05.291 2151-2151/? E/TAG: 477新的高度 // 04-19 15:38:05.308 2151-2151/? E/TAG: 479新的高度 // 04-19 15:38:05.325 2151-2151/? E/TAG: 480新的高度 // 04-19 15:38:05.342 2151-2151/? E/TAG: 480新的高度 //运动的高度!!!结束的高度-开始运动的高度。是一个-值。然后+开始的高度。。。 int newHeader = (int) ((endHeight - startHeight) * interpolatedTime + startHeight); v.getLayoutParams().height = newHeader; v.requestLayout(); // Log.e("TAG", newHeader + "新的高度"); } } }
我也不直接贴源代码了。。。。差不多就是这样了。。。。。。
相关文章推荐
- 微信与QQ系统维护:月底前用户无法修改个人资料
- 教你把四十个QQ个人资料小图标全点亮
- DataGrid中鼠标点击、移动后行颜色改变效果
- 腾讯正紧急修复QQ个人资料出现异常的故障
- 一个小型的网站,比如个人网站,可以使用最简单的html静态页面就实现了,配合一些图片达到美化效果,所有的页面均存放在一个目录下,这样的网站对系统架构、性能的要求都很简单,随着互联网业务的不断丰富,网站
- 自动改变文字大小和颜色的javascript效果
- 转贴:在 RedHat 7.2 Linux 系统下实现提供个人主页空间服务的方法
- IOS 改变键盘颜色的实现---只有Number Pad和Phone Pad这两种数字键盘才有效果
- DIV+CSS:DHTML动画效果_改变指定DIV背景颜色;
- MFC RadioButton背景颜色改变(可以照此实现别的效果)
- 奉献给搞.NET和学习.NET的学习资料和自己收集的代码,个人的知识库系统
- 鼠标经过导航菜单时颜色改变效果
- 个人收集:QQ资料
- 败家女提供QQ伤感日志_喜欢1个人听着忧伤的歌
- 改变linux shell的输出效果[字体颜色,样式等]
- Swing制作高仿QQ界面包含主界面、聊天窗口、系统设置窗口|圆角界面|透明|颜色|渲染|换肤
- 系统自己提供的 非常方便进行轴向的改变。
- Asp.Net中GridView加入鼠标滑过的高亮效果和单击行颜色改变
- 图片的合成_改变图片颜色形成老照片水彩画效果
- javascript自动改变文字大小和颜色的效果的小例子