Android 仿腾讯应用宝 之 Toolbar +Scroolview +tab滑动悬停效果

来源:互联网 作者:佚名 时间:2015-02-10 15:36

Android 仿腾讯应用宝 之 Toolbar +Scroolview +tab滑动悬停效果

先说下最近做应用市场,想要的效果如下:

1、上面actionbar使用的toolbar最新的工具条来代替acionbar.

2、toolbar下面有一个 app详情

3、app详情下面有一个滑动tab ,tab下是viewpage ,viewpage里面嵌套的是2个Fragment,,一个是Scrollview,一个是ListView。

要实现,监听Scrollview或者ListView滚动事件,来推挤tab向上移动,并且悬停在Toolbar下面。

具体效果如图:

代码不多解释,直接下载demo自行运行demo哈。稍后放源码。

声明:本代码基于其他开源项目,修改而来。

package com.github.ksoichiro.android.observablescrollview.samples;

import android.os.Bundle;

import android.support.v4.app.Fragment;

import android.support.v4.app.FragmentManager;

import android.support.v4.view.ViewCompat;

import android.support.v4.view.ViewPager;

import android.support.v7.app.ActionBarActivity;

import android.support.v7.widget.Toolbar;

import android.view.View;

import com.example.toolbar.R;

import com.github.ksoichiro.android.observablescrollview.ObservableScrollView;

import com.github.ksoichiro.android.observablescrollview.ObservableScrollViewCallbacks;

import com.github.ksoichiro.android.observablescrollview.ScrollState;

import com.github.ksoichiro.android.observablescrollview.ScrollUtils;

import com.google.samples.apps.iosched.ui.widget.SlidingTabLayout;

import com.nineoldandroids.view.ViewHelper;

import com.nineoldandroids.view.ViewPropertyAnimator;

public class ViewPagerTabScrollViewActivity extends ActionBarActivity implements ObservableScrollViewCallbacks {

private View mHeaderView;

private View appinfo;

private int mBaseTranslationY;

private ViewPager mPager;

private NavigationAdapter mPagerAdapter;

private Toolbar toolbar;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_viewpagertab);

toolbar=(Toolbar) findViewById(R.id.toolbar);

setSupportActionBar(toolbar);

mHeaderView = findViewById(R.id.header);

ViewCompat.setElevation(mHeaderView, getResources().getDimension(R.dimen.toolbar_elevation));

appinfo = findViewById(R.id.apptitleview);

mPagerAdapter = new NavigationAdapter(getSupportFragmentManager());

mPager = (ViewPager) findViewById(R.id.pager);

mPager.setAdapter(mPagerAdapter);

SlidingTabLayout slidingTabLayout = (SlidingTabLayout) findViewById(R.id.sliding_tabs);

slidingTabLayout.setCustomTabView(R.layout.tab_indicator, android.R.id.text1);

slidingTabLayout.setSelectedIndicatorColors(getResources().getColor(R.color.accent));

slidingTabLayout.setDistributeEvenly(true);

slidingTabLayout.setViewPager(mPager);

// When the page is selected, other fragments' scrollY should be adjusted

// according to the toolbar status(shown/hidden)

slidingTabLayout.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

@Override

public void onPageScrolled(int i, float v, int i2) {

}

@Override

public void onPageSelected(int i) {

propagateToolbarState(toolbarIsShown());

}

@Override

public void onPageScrollStateChanged(int i) {

}

});

propagateToolbarState(toolbarIsShown());

}

@Override

public void onScrollChanged(int scrollY, boolean firstScroll, boolean dragging) {

//判断如果是拖动

if (dragging) {

int toolbarHeight = appinfo.getHeight();

float currentHeaderTranslationY = ViewHelper.getTranslationY(mHeaderView);

if (firstScroll) {

if (-toolbarHeight < currentHeaderTranslationY) {

mBaseTranslationY = scrollY;

}

}

float headerTranslationY = ScrollUtils.getFloat(-(scrollY - mBaseTranslationY), -toolbarHeight, 0);

ViewPropertyAnimator.animate(mHeaderView).cancel();

ViewHelper.setTranslationY(mHeaderView, headerTranslationY);

}else{

if(!firstScroll){

int toolbarHeight = appinfo.getHeight();

float headerTranslationY = ScrollUtils.getFloat(-(scrollY - mBaseTranslationY), -toolbarHeight, 0);

ViewPropertyAnimator.animate(mHeaderView).cancel();

ViewHelper.setTranslationY(mHeaderView, headerTranslationY);

}

}

}

@Override

public void onDownMotionEvent() {

}

@Override

public void onUpOrCancelMotionEvent(ScrollState scrollState) {

mBaseTranslationY = 0;

Fragment fragment = getCurrentFragment();

if (fragment == null) {

return;

}

View view = fragment.getView();

if (view == null) {

return;

}

int toolbarHeight = appinfo.getHeight();

final ObservableScrollView scrollView = (ObservableScrollView) view.findViewById(R.id.scroll);

if (scrollView == null) {

return;

}

int scrollY = scrollView.getCurrentScrollY();

if (scrollState == ScrollState.DOWN) {//按下

//判断滑动到顶部的时候,开始显示 toolbar 不是顶部的 隐藏toolbar

if(scrollView.getScrollY()<=toolbarHeight){

showToolbar();

}else{

hideToolbar();

}

} else if (scrollState == ScrollState.UP) {//抬起

if (toolbarHeight <= scrollY) {

hideToolbar();

} else {

showToolbar();

}

} else {

//

// Even if onScrollChanged occurs without scrollY changing, toolbar should be adjusted

if (toolbarIsShown() || toolbarIsHidden()) {

// Toolbar is completely moved, so just keep its state

// and propagate it to other pages

propagateToolbarState(toolbarIsShown());

} else {

// Toolbar is moving but doesn't know which to move:

// you can change this to hideToolbar()

showToolbar();

}

}

}

private Fragment getCurrentFragment() {

return mPagerAdapter.getItemAt(mPager.getCurrentItem());

}

private void propagateToolbarState(boolean isShown) {

int toolbarHeight = appinfo.getHeight();

//设置scrollY尚未创建的片段

// Set scrollY for the fragments that are not created yet

mPagerAdapter.setScrollY(isShown ? 0 : toolbarHeight);

//设置活动scrollY碎片

// Set scrollY for the active fragments

for (int i = 0; i < mPagerAdapter.getCount(); i++) {

// Skip current item

if (i == mPager.getCurrentItem()) {

continue;

}

// Skip destroyed or not created item

Fragment f = mPagerAdapter.getItemAt(i);

if (f == null) {

continue;

}

ObservableScrollView scrollView = (ObservableScrollView) f.getView().findViewById(R.id.scroll);

if (isShown) {

// Scroll up

if (0 < scrollView.getCurrentScrollY()) {//滚动到 顶部

scrollView.scrollTo(0, 0);

}

} else {

// Scroll down (to hide padding)//滚动到底部

if (scrollView.getCurrentScrollY() < toolbarHeight) {

scrollView.scrollTo(0, toolbarHeight);

}

}

}

}

private boolean toolbarIsShown() {

return ViewHelper.getTranslationY(mHeaderView) == 0;

}

private boolean toolbarIsHidden() {

return ViewHelper.getTranslationY(mHeaderView) == -appinfo.getHeight();

}

private void showToolbar() {

float headerTranslationY = ViewHelper.getTranslationY(mHeaderView);

if (headerTranslationY != 0) {

ViewPropertyAnimator.animate(mHeaderView).cancel();

ViewPropertyAnimator.animate(mHeaderView).translationY(0).setDuration(200).start();

}

propagateToolbarState(true);

}

private void hideToolbar() {

float headerTranslationY = ViewHelper.getTranslationY(mHeaderView);

int toolbarHeight = appinfo.getHeight();

if (headerTranslationY != -toolbarHeight) {

ViewPropertyAnimator.animate(mHeaderView).cancel();

ViewPropertyAnimator.animate(mHeaderView).translationY(-toolbarHeight).setDuration(200).start();

}

propagateToolbarState(false);

}

private static class NavigationAdapter extends CacheFragmentStatePagerAdapter {

private static final String[] TITLES = new String[]{"Applepie", "Butter Cookie"};

private int mScrollY;

public NavigationAdapter(FragmentManager fm) {

super(fm);

}

public void setScrollY(int scrollY) {

mScrollY = scrollY;

}

@Override

protected Fragment createItem(int position) {

Fragment f = new ViewPagerTabScrollViewFragment();

if (0 <= mScrollY) {

Bundle args = new Bundle();

args.putInt(ViewPagerTabScrollViewFragment.ARG_SCROLL_Y, mScrollY);

f.setArguments(args);

}

return f;

}

@Override

public int getCount() {

return TITLES.length;

}

@Override

public CharSequence getPageTitle(int position) {

return TITLES[position];

}

}

}

android tab 悬停效果代码,Android 仿腾讯应用宝 之 Toolbar +Scroolview +tab滑动悬停效果...相关推荐

  1. android 仿ios动画效果代码,Android仿IOS上拉下拉弹性效果的实例代码

    用过iphone的朋友相信都体验过页面上拉下拉有一个弹性的效果,使用起来用户体验很好:Android并没有给我们封装这样一个效果,我们来看下在Android里如何实现这个效果.先看效果,感觉有些时候还 ...

  2. android实现悬停效果代码,Android StickListView实现悬停效果

    先看看效果图: 实现思路: 监听ListView的滑动,等目的项为列表第一个可见的ItemView时,添加一个一个的布局,产生悬停效果 实现代码: public class CustomViewAcy ...

  3. android 实现 效果代码,Android实现雷达View效果的示例代码

    样式效果 还是先来看效果: 这是一个仿雷达扫描的效果,是之前在做地图sdk接入时就想实现的效果,但之前由于赶着毕业设计,就没有亲手去实现,不过现在自己撸一个发现还是挺简单的. 这里主要分享一下我的做法 ...

  4. android 滚动动画效果代码,Android Scroll滑动效果实例

    相对于在Android2.x版本上出现的长按.点击事件的效果,不得不说,滑动操作具有更好的用户体验.因此,从Android 4.X版本开始,出现了更多滑动操作的效果.越来越多第三方应用模仿这样的效果, ...

  5. 【Android自定义View实战】之仿去哪儿网App图片按压显示指纹并缩放效果TouchFingerImageView

    转载请注明出处:http://blog.csdn.net/linglongxin24/article/details/52986713 [DylanAndroid的csdn博客] 我们发现去哪儿网ap ...

  6. android桌面雪花效果代码,Android营造雪花和雨滴浪漫效果

    本文在实现雪花效果的基础上,根据漫天飞舞雪花,实现下雨天场景的效果,使用eclipse android 版本,具体内容如下 雪花效果图: 具体代码: 1.漫天飞舞的雪花主要代码 SnowView pa ...

  7. Android微信通讯录界面代码,Android中使用Expandablelistview实现微信通讯录界面

    之前的博文<Android 中使用ExpandableListView 实现分组的实例>我简单介绍了使用ExpandableListView实现简单的好友分组功能,今天我们针对之前的所做的 ...

  8. android长截屏代码,android长截屏原理及实现代码

    android长截屏原理及实现代码 发布时间:2020-08-31 06:55:16 来源:脚本之家 阅读:158 作者:Android笔记 小米系统自带的长截屏应该很多人都用过,效果不错.当长截屏时 ...

  9. Android运行ListView的代码,Android ListView组件详解及示例代码

    Android 列表组件 ListView 列表组件是开发中经常用到组件,使用该组件在使用时需要为它提供适配器,由适配器提供来确定显示样式和显示数据. 下面看一个例子: 新建一个项目Lesson8_L ...

最新文章

  1. 嵌入式Linux学习路线
  2. python基础代码事例-菜鸟世界 -python基础---set
  3. maven国内镜像(maven下载慢的解决方法)
  4. NetBeans IDE 7.0 Beta 发布
  5. 前端学习(3149):react-hello-react之总结生命周期
  6. 视差滚动(Parallax Scrolling)插件补充
  7. 计算机原子指令,计算机体系结构——多线程(核)访存“上锁”——原子指令...
  8. git mergetool 解决冲突的问题
  9. 最近在忙着做一个加密的项目,还自己找的私活.
  10. db_cxx.h: No such file or directory
  11. c语言编程能力提高,C语言编程能力的培养
  12. hdfs命令_HDFS命令
  13. python获取苏宁服务器的毫秒级时间
  14. 计算机用户密码怎么查看,怎么查看电脑开机密码【具体阐明】
  15. Typora主要常用快捷键
  16. 什么是大数据?大数据又有什么用处?
  17. 天呐!350道Java面试真题分享
  18. 主动雷达和被动雷达的区别
  19. 原型模式与深拷贝浅拷贝
  20. 机器学习--使用朴素贝叶斯进行垃圾邮件分类

热门文章

  1. pyradiomics的yaml文件参数设置解读、Li‘s have a solution and plan.
  2. js 操作vuex数据_Vuex 数据状态持久化如何处理?
  3. python 自己写个调试工具
  4. 【tensorboard】从tensorboard上看出模型是否存在过拟合
  5. 查询数据库返回cursor,如何判断没有符合条件的记录。判断条件不是cursor==null 哦
  6. LeetCode 316. Remove Duplicate Letters--贪心--Java,C++,Python解法
  7. lvs的十种调度算法概念
  8. 普通平键的主要尺寸有_快来收下这份家装尺寸表,衣柜不再鸡肋
  9. linux中硬链接文件,科学网—Linux:文件的符号链接和硬链接 - 刘洋洋的博文
  10. C++_STL——queue(and priority_queue)