Android ActionBar随ScorllView上下拖动而透明度渐变效果

转载:http://blog.csdn.net/jan_s/article/details/43772697

我看到越来越多的应用使用这样的效果,如QQ空间5.0的主界面,确实很好看!大概就搜了一下相关的实现方式,发现早就有了相关的方案:

仿QQ空间滚动ActionBar透明度变化Demo

还有我在github上看到就有这样的实现方式,这也是本博文的主要核心内容:

具体请查看:https://github.com/AChep/Header2ActionBar

效果如下:


这是Demo结构:


1.FadingActionBarHelper.java 这个类是处理Actionbar的核心类,处理对scroll事件对actionbar背景色alpha的处理。

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public class FadingActionBarHelper {  
  2.   
  3.     private static final String TAG = "FadingActionBarHelper";  
  4.   
  5.     private int mAlpha = 255;  
  6.     private Drawable mDrawable;  
  7.     private boolean isAlphaLocked;  
  8.   
  9.     private final ActionBar mActionBar;  
  10.   
  11.     public FadingActionBarHelper(final ActionBar actionBar) {  
  12.         mActionBar = actionBar;  
  13.     }  
  14.   
  15.     public FadingActionBarHelper(final ActionBar actionBar, final Drawable drawable) {  
  16.         mActionBar = actionBar;  
  17.         setActionBarBackgroundDrawable(drawable);  
  18.     }  
  19.   
  20.     public void setActionBarBackgroundDrawable(Drawable drawable) {  
  21.         setActionBarBackgroundDrawable(drawable, true);  
  22.     }  
  23.   
  24.     @TargetApi(Build.VERSION_CODES.KITKAT)  
  25.     public void setActionBarBackgroundDrawable(Drawable drawable, boolean mutate) {  
  26.         mDrawable = mutate ? drawable.mutate() : drawable;  
  27.         mActionBar.setBackgroundDrawable(mDrawable);  
  28.         if (mAlpha == 255) {  
  29.             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)  
  30.                 mAlpha = mDrawable.getAlpha();  
  31.         } else {  
  32.             setActionBarAlpha(mAlpha);  
  33.         }  
  34.     }  
  35.   
  36.     /** 
  37.      * An {@link android.app.ActionBar} background drawable. 
  38.      * 
  39.      * @see #setActionBarBackgroundDrawable(android.graphics.drawable.Drawable) 
  40.      * @see #setActionBarAlpha(int) 
  41.      */  
  42.     public Drawable getActionBarBackgroundDrawable() {  
  43.         return mDrawable;  
  44.     }  
  45.   
  46.     /** 
  47.      * Please use this method for global changes only! 
  48.      * This is helpful when you need to provide something like 
  49.      * Navigation drawer: lock ActionBar and set 
  50.      * {@link android.graphics.drawable.Drawable#setAlpha(int)} 
  51.      * to {@link #getActionBarBackgroundDrawable()} directly. 
  52.      * 
  53.      * @param alpha a value from 0 to 255 
  54.      * @see #getActionBarBackgroundDrawable() 
  55.      * @see #getActionBarAlpha() 
  56.      */  
  57.     public void setActionBarAlpha(int alpha) {  
  58.         if (mDrawable == null) {  
  59.             Log.w(TAG, "Set action bar background before setting the alpha level!");  
  60.             return;  
  61.         }  
  62.         if (!isAlphaLocked) {  
  63.             mDrawable.setAlpha(alpha);  
  64.             View view = mActionBar.getCustomView();  
  65.             if(view!=null){  
  66.                 //这里是对自定义actionbar背景的处理,我这边就草草了事了  
  67.                 if(alpha>=55){  
  68.                     view.findViewById(R.id.search_button).setBackgroundResource(R.drawable.search);  
  69.                     view.findViewById(R.id.refresh_button).setBackgroundResource(R.drawable.refresh);  
  70.                 }else{  
  71.                     view.findViewById(R.id.search_button).setBackgroundResource(R.drawable.skin_nav_icon_l_search_rev);  
  72.                     view.findViewById(R.id.refresh_button).setBackgroundResource(R.drawable.skin_nav_icon_r_refresh_rev);  
  73.                 }  
  74.                 Log.i(TAG, "search_button.alpha=>"+alpha);  
  75.             }  
  76.         }  
  77.         mAlpha = alpha;  
  78.     }  
  79.   
  80.     public int getActionBarAlpha() {  
  81.         return mAlpha;  
  82.     }  
  83.   
  84.     /** 
  85.      * When ActionBar's alpha is locked {@link #setActionBarAlpha(int)} 
  86.      * won't change drawable\'s alpha (but will change {@link #getActionBarAlpha()} level) 
  87.      * 
  88.      * @param lock 
  89.      */  
  90.     public void setActionBarAlphaLocked(boolean lock) {  
  91.   
  92.         // Update alpha level on unlock  
  93.         if (isAlphaLocked != (isAlphaLocked = lock) && !isAlphaLocked) {  
  94.             setActionBarAlpha(mAlpha);  
  95.         }  
  96.     }  
  97.   
  98.     public boolean isActionBarAlphaLocked() {  
  99.         return isAlphaLocked;  
  100.     }  
  101. }  

2.其他的组件类我这不copy了,有兴趣的朋友自行下载github上的项目吧o(∩_∩)o。

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public class NotifyingScrollView extends ScrollView {  
  2.     // Edge-effects don't mix well with the translucent action bar in Android 2.X  
  3.     private boolean mDisableEdgeEffects = true;  
  4.   
  5.     /** 
  6.      * @author Cyril Mottier 
  7.      */  
  8.     public interface OnScrollChangedListener {  
  9.         void onScrollChanged(ScrollView who, int l, int t, int oldl, int oldt);  
  10.     }  
  11.   
  12.     private OnScrollChangedListener mOnScrollChangedListener;  
  13.   
  14.     public NotifyingScrollView(Context context) {  
  15.         super(context);  
  16.     }  
  17.   
  18.     public NotifyingScrollView(Context context, AttributeSet attrs) {  
  19.         super(context, attrs);  
  20.     }  
  21.   
  22.     public NotifyingScrollView(Context context, AttributeSet attrs, int defStyle) {  
  23.         super(context, attrs, defStyle);  
  24.     }  
  25.   
  26.     @Override  
  27.     protected void onScrollChanged(int l, int t, int oldl, int oldt) {  
  28.         super.onScrollChanged(l, t, oldl, oldt);  
  29.         if (mOnScrollChangedListener != null) {  
  30.             mOnScrollChangedListener.onScrollChanged(this, l, t, oldl, oldt);  
  31.         }  
  32.     }  
  33.   
  34.     public void setOnScrollChangedListener(OnScrollChangedListener listener) {  
  35.         mOnScrollChangedListener = listener;  
  36.     }  
  37.   
  38.     @Override  
  39.     protected float getTopFadingEdgeStrength() {  
  40.         // http://stackoverflow.com/a/6894270/244576  
  41.         if (mDisableEdgeEffects && Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {  
  42.             return 0.0f;  
  43.         }  
  44.         return super.getTopFadingEdgeStrength();  
  45.     }  
  46.   
  47.     @Override  
  48.     protected float getBottomFadingEdgeStrength() {  
  49.         // http://stackoverflow.com/a/6894270/244576  
  50.         if (mDisableEdgeEffects && Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {  
  51.             return 0.0f;  
  52.         }  
  53.         return super.getBottomFadingEdgeStrength();  
  54.     }  
  55. }  


3.对于普通的java程序员来说,你可以不知道怎么个原理,但是你一定要知道怎么运用它,如何运用到我们的实际项目中并且改造它,这是demo的主界面,用起来就几行代码,是不是很叼?

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public class MainActivity extends Activity {  
  2.   
  3.     private FadingActionBarHelper mFadingActionBarHelper;  
  4.     private ActionBar mActionBar;  
  5.   
  6.     @Override  
  7.     protected void onCreate(Bundle savedInstanceState) {  
  8.         super.onCreate(savedInstanceState);  
  9.         setContentView(R.layout.activity_main);  
  10.         mActionBar = getActionBar();  
  11.         //使用自定义的布局的ActionBar  
  12.         mActionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);  
  13.         mActionBar.setCustomView(R.layout.my_actionbar);  
  14.         //定义白色为Actionbar的背景色  
  15.         mFadingActionBarHelper = new FadingActionBarHelper(getActionBar(),  
  16.                 getResources().getDrawable(R.drawable.actionbar_bg));  
  17.   
  18.         if (savedInstanceState == null) {  
  19.             getFragmentManager().beginTransaction()  
  20.                     .add(R.id.container, new ListViewFragment())  
  21.                     .commit();  
  22.         }  
  23.     }  
  24.   
  25.   
  26.     @Override  
  27.     public boolean onCreateOptionsMenu(Menu menu) {  
  28.           
  29.         // Inflate the menu; this adds items to the action bar if it is present.  
  30.         //菜单页面碍于效果,即被隐藏  
  31. //        getMenuInflater().inflate(R.menu.main, menu);  
  32.         return true;  
  33.     }  
  34.   
  35.     @Override  
  36.     public boolean onOptionsItemSelected(MenuItem item) {  
  37.         // Handle action bar item clicks here. The action bar will  
  38.         // automatically handle clicks on the Home/Up button, so long  
  39.         // as you specify a parent activity in AndroidManifest.xml.  
  40.         return super.onOptionsItemSelected(item);  
  41.     }  
  42.       
  43.     //这段代码可不要忘了  
  44.     public FadingActionBarHelper getFadingActionBarHelper() {  
  45.         return mFadingActionBarHelper;  
  46.     }  
  47. }  

贴了主要的代码,其实这个实现方式还是有点复杂的,我想应该还有更简洁的方式吧,有的话请留言分享!分享代码是技术圈进步的一种有效方式哦!


----------------------------------------------------------

最后是Demo的下载链接,有兴趣的请自行下载:http://download.csdn.net/download/sunjundelove/8444749

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值