android tab 悬停效果代码,Android 仿腾讯应用宝 之 Toolbar +Scroolview +tab滑动悬停效果...
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滑动悬停效果...相关推荐
- android 仿ios动画效果代码,Android仿IOS上拉下拉弹性效果的实例代码
用过iphone的朋友相信都体验过页面上拉下拉有一个弹性的效果,使用起来用户体验很好:Android并没有给我们封装这样一个效果,我们来看下在Android里如何实现这个效果.先看效果,感觉有些时候还 ...
- android实现悬停效果代码,Android StickListView实现悬停效果
先看看效果图: 实现思路: 监听ListView的滑动,等目的项为列表第一个可见的ItemView时,添加一个一个的布局,产生悬停效果 实现代码: public class CustomViewAcy ...
- android 实现 效果代码,Android实现雷达View效果的示例代码
样式效果 还是先来看效果: 这是一个仿雷达扫描的效果,是之前在做地图sdk接入时就想实现的效果,但之前由于赶着毕业设计,就没有亲手去实现,不过现在自己撸一个发现还是挺简单的. 这里主要分享一下我的做法 ...
- android 滚动动画效果代码,Android Scroll滑动效果实例
相对于在Android2.x版本上出现的长按.点击事件的效果,不得不说,滑动操作具有更好的用户体验.因此,从Android 4.X版本开始,出现了更多滑动操作的效果.越来越多第三方应用模仿这样的效果, ...
- 【Android自定义View实战】之仿去哪儿网App图片按压显示指纹并缩放效果TouchFingerImageView
转载请注明出处:http://blog.csdn.net/linglongxin24/article/details/52986713 [DylanAndroid的csdn博客] 我们发现去哪儿网ap ...
- android桌面雪花效果代码,Android营造雪花和雨滴浪漫效果
本文在实现雪花效果的基础上,根据漫天飞舞雪花,实现下雨天场景的效果,使用eclipse android 版本,具体内容如下 雪花效果图: 具体代码: 1.漫天飞舞的雪花主要代码 SnowView pa ...
- Android微信通讯录界面代码,Android中使用Expandablelistview实现微信通讯录界面
之前的博文<Android 中使用ExpandableListView 实现分组的实例>我简单介绍了使用ExpandableListView实现简单的好友分组功能,今天我们针对之前的所做的 ...
- android长截屏代码,android长截屏原理及实现代码
android长截屏原理及实现代码 发布时间:2020-08-31 06:55:16 来源:脚本之家 阅读:158 作者:Android笔记 小米系统自带的长截屏应该很多人都用过,效果不错.当长截屏时 ...
- Android运行ListView的代码,Android ListView组件详解及示例代码
Android 列表组件 ListView 列表组件是开发中经常用到组件,使用该组件在使用时需要为它提供适配器,由适配器提供来确定显示样式和显示数据. 下面看一个例子: 新建一个项目Lesson8_L ...
最新文章
- 嵌入式Linux学习路线
- python基础代码事例-菜鸟世界 -python基础---set
- maven国内镜像(maven下载慢的解决方法)
- NetBeans IDE 7.0 Beta 发布
- 前端学习(3149):react-hello-react之总结生命周期
- 视差滚动(Parallax Scrolling)插件补充
- 计算机原子指令,计算机体系结构——多线程(核)访存“上锁”——原子指令...
- git mergetool 解决冲突的问题
- 最近在忙着做一个加密的项目,还自己找的私活.
- db_cxx.h: No such file or directory
- c语言编程能力提高,C语言编程能力的培养
- hdfs命令_HDFS命令
- python获取苏宁服务器的毫秒级时间
- 计算机用户密码怎么查看,怎么查看电脑开机密码【具体阐明】
- Typora主要常用快捷键
- 什么是大数据?大数据又有什么用处?
- 天呐!350道Java面试真题分享
- 主动雷达和被动雷达的区别
- 原型模式与深拷贝浅拷贝
- 机器学习--使用朴素贝叶斯进行垃圾邮件分类
热门文章
- pyradiomics的yaml文件参数设置解读、Li‘s have a solution and plan.
- js 操作vuex数据_Vuex 数据状态持久化如何处理?
- python 自己写个调试工具
- 【tensorboard】从tensorboard上看出模型是否存在过拟合
- 查询数据库返回cursor,如何判断没有符合条件的记录。判断条件不是cursor==null 哦
- LeetCode 316. Remove Duplicate Letters--贪心--Java,C++,Python解法
- lvs的十种调度算法概念
- 普通平键的主要尺寸有_快来收下这份家装尺寸表,衣柜不再鸡肋
- linux中硬链接文件,科学网—Linux:文件的符号链接和硬链接 - 刘洋洋的博文
- C++_STL——queue(and priority_queue)