安卓顶部标题栏随页面的滑动渐变
来源:互联网 发布:淘宝网开衫 编辑:程序博客网 时间:2024/06/04 20:05
我看到越来越多的应用使用这样的效果,如QQ空间5.0的主界面,确实很好看!大概就搜了一下相关的实现方式,发现早就有了相关的方案:
仿QQ空间滚动ActionBar透明度变化Demo
还有我在github上看到就有这样的实现方式,这也是本博文的主要核心内容:
有图:
这是Demo结构:
1.FadingActionBarHelper.java 这个类是处理Actionbar的核心类,处理对scroll事件对actionbar背景色alpha的处理。
public class FadingActionBarHelper { private static final String TAG = FadingActionBarHelper; private int mAlpha = 255; private Drawable mDrawable; private boolean isAlphaLocked; private final ActionBar mActionBar; public FadingActionBarHelper(final ActionBar actionBar) { mActionBar = actionBar; } public FadingActionBarHelper(final ActionBar actionBar, final Drawable drawable) { mActionBar = actionBar; setActionBarBackgroundDrawable(drawable); } public void setActionBarBackgroundDrawable(Drawable drawable) { setActionBarBackgroundDrawable(drawable, true); } @TargetApi(Build.VERSION_CODES.KITKAT) public void setActionBarBackgroundDrawable(Drawable drawable, boolean mutate) { mDrawable = mutate ? drawable.mutate() : drawable; mActionBar.setBackgroundDrawable(mDrawable); if (mAlpha == 255) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) mAlpha = mDrawable.getAlpha(); } else { setActionBarAlpha(mAlpha); } } /** * An {@link android.app.ActionBar} background drawable. * * @see #setActionBarBackgroundDrawable(android.graphics.drawable.Drawable) * @see #setActionBarAlpha(int) */ public Drawable getActionBarBackgroundDrawable() { return mDrawable; } /** * Please use this method for global changes only! * This is helpful when you need to provide something like * Navigation drawer: lock ActionBar and set * {@link android.graphics.drawable.Drawable#setAlpha(int)} * to {@link #getActionBarBackgroundDrawable()} directly. * * @param alpha a value from 0 to 255 * @see #getActionBarBackgroundDrawable() * @see #getActionBarAlpha() */ public void setActionBarAlpha(int alpha) { if (mDrawable == null) { Log.w(TAG, Set action bar background before setting the alpha level!); return; } if (!isAlphaLocked) { mDrawable.setAlpha(alpha); View view = mActionBar.getCustomView(); if(view!=null){ //这里是对自定义actionbar背景的处理,我这边就草草了事了 if(alpha>=55){ view.findViewById(R.id.search_button).setBackgroundResource(R.drawable.search); view.findViewById(R.id.refresh_button).setBackgroundResource(R.drawable.refresh); }else{ view.findViewById(R.id.search_button).setBackgroundResource(R.drawable.skin_nav_icon_l_search_rev); view.findViewById(R.id.refresh_button).setBackgroundResource(R.drawable.skin_nav_icon_r_refresh_rev); } Log.i(TAG, search_button.alpha=>+alpha); } } mAlpha = alpha; } public int getActionBarAlpha() { return mAlpha; } /** * When ActionBar's alpha is locked {@link #setActionBarAlpha(int)} * won't change drawable's alpha (but will change {@link #getActionBarAlpha()} level) * * @param lock */ public void setActionBarAlphaLocked(boolean lock) { // Update alpha level on unlock if (isAlphaLocked != (isAlphaLocked = lock) && !isAlphaLocked) { setActionBarAlpha(mAlpha); } } public boolean isActionBarAlphaLocked() { return isAlphaLocked; }}
2,这里是自定义的ScrollView
public class NotifyingScrollView extends ScrollView { // Edge-effects don't mix well with the translucent action bar in Android 2.X private boolean mDisableEdgeEffects = true; /** * @author Cyril Mottier */ public interface OnScrollChangedListener { void onScrollChanged(ScrollView who, int l, int t, int oldl, int oldt); } private OnScrollChangedListener mOnScrollChangedListener; public NotifyingScrollView(Context context) { super(context); } public NotifyingScrollView(Context context, AttributeSet attrs) { super(context, attrs); } public NotifyingScrollView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override protected void onScrollChanged(int l, int t, int oldl, int oldt) { super.onScrollChanged(l, t, oldl, oldt); if (mOnScrollChangedListener != null) { mOnScrollChangedListener.onScrollChanged(this, l, t, oldl, oldt); } } public void setOnScrollChangedListener(OnScrollChangedListener listener) { mOnScrollChangedListener = listener; } @Override protected float getTopFadingEdgeStrength() { // http://stackoverflow.com/a/6894270/244576 if (mDisableEdgeEffects && Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) { return 0.0f; } return super.getTopFadingEdgeStrength(); } @Override protected float getBottomFadingEdgeStrength() { // http://stackoverflow.com/a/6894270/244576 if (mDisableEdgeEffects && Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) { return 0.0f; } return super.getBottomFadingEdgeStrength(); }}
3,自定义在ScrollView中的ListView
public class MyListView extends ListView{ public MyListView(Context context, AttributeSet attrs) { super(context, attrs); } public MyListView(Context context) { super(context); } public MyListView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, expandSpec); }}
4,在项目里面的用法:
public class MainActivity extends Activity { private FadingActionBarHelper mFadingActionBarHelper; private ActionBar mActionBar; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mActionBar = getActionBar(); //使用自定义的布局的ActionBar mActionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM); mActionBar.setCustomView(R.layout.my_actionbar); //定义白色为Actionbar的背景色 mFadingActionBarHelper = new FadingActionBarHelper(getActionBar(), getResources().getDrawable(R.drawable.actionbar_bg)); if (savedInstanceState == null) { getFragmentManager().beginTransaction() .add(R.id.container, new ListViewFragment()) .commit(); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. //菜单页面碍于效果,即被隐藏// getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. return super.onOptionsItemSelected(item); } //这段代码可不要忘了 public FadingActionBarHelper getFadingActionBarHelper() { return mFadingActionBarHelper; }}
好了~有问题的朋友请留言~
0 0
- 安卓顶部标题栏随页面的滑动渐变
- 顶部标题栏随滑动时的渐变隐藏和渐变显示
- 关于安卓页面顶部的状态栏,标题栏,actionBar,topBar
- android页面滑动时,顶部title背景渐变的实现
- 标题栏颜色渐变和顶部悬浮效果(标题栏颜色随着页面上滑渐变,页面某模块到达标题栏下方是位置固定,不再随页面滚动)
- android颜色渐变的顶部标题栏
- 标题栏滑动渐变效果的实现
- 安卓标题栏随屏幕滑动改变颜色
- android标题栏滑动渐变效果
- 随着RecycleView的滑动实现标题栏透明度渐变:
- jquery 滑动返回到页面的顶部
- 安卓学习笔记---自定义app顶部标题栏
- 安卓页面去掉顶部标题
- 自定义的顶部标题栏
- Android中自定义ScrollView的滑动监听事件,并在滑动时渐变标题栏背景颜色
- ScrollView滑动实现标题栏透明度随之渐变
- Android 标题栏滑动渐变背景色
- 安卓RecyclerView视图滑动对齐不到顶部(底部)的校准
- 15章实例5
- Swift 类型标注
- C++文件操作常用函数
- [FAQ14188]SensorService发生NE分析
- animation中CrossFade的问题
- 安卓顶部标题栏随页面的滑动渐变
- undefined reference to错误的解决方法
- SQLSERVER SQLServer导入mdf和ldf的方法
- QTP测试实验
- maven 最佳实践:版本管理
- Tomcat中JVM内存溢出及合理配置
- 【R语言】【规范】编程规范
- 如何配置Mysql慢日志
- sqlserver中的CAST()函数