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

根据上一篇ActionBar随ScorllView上下拖动而透明度渐变效果的基本描述,我们自定义的actionbar滚动透明的效果使用起来可能有点繁琐。这次想要在上次的代码内容上(可自动切换、无限滑动的图片广告展示栏的实现分享(续1)),博主太懒了,,哈哈,实现这样的效果。

这次的demo很简单,老样子,你可以自己下载demo稍微看看,结构如下:

主界面代码:

package org.jan.adviewpaper.demo;import android.app.ActionBar;import android.app.Activity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.Toast;import com.achep.header2actionbar.FadingActionBarHelper;/** * demo 主界面 * @author jan */public class MainActivity extends Activity implements OnClickListener {private static final String TAG = "MainActivity";private ActionBar mActionBar;//这边的是ActionBar的辅助类,设置透明度在里面的干活!private FadingActionBarHelper mFadingActionBarHelper;private Button mSearchButton;//….@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mActionBar = getActionBar();// 使用自定义的布局的ActionBarmActionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);mActionBar.setCustomView(R.layout.my_actionbar);mSearchButton = (Button) mActionBar.getCustomView().findViewById(R.id.search_button);// 给搜索按钮添加点击事件mSearchButton.setOnClickListener(this);// 注意!定义Actionbar的背景色 ,这句不能忘记!mActionBar.getCustomView().setBackground(getResources().getDrawable(R.drawable.actionbar_bg));mFadingActionBarHelper = new FadingActionBarHelper(getActionBar(),getResources().getDrawable(R.drawable.actionbar_bg));if (savedInstanceState == null) {getFragmentManager().beginTransaction().add(R.id.container_view, new MyViewFragment()).commit();}}public FadingActionBarHelper getFadingActionBarHelper() {return mFadingActionBarHelper;}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.search_button:Log.d(TAG, "你点击了搜索按钮!");Toast.makeText(this, "you clicked search", 1000).show();break;}}}必须继承这个抽象类来实现效果HeaderFragment.java:

public abstract class HeaderFragment extends Fragment {private static final String TAG = "HeaderFragment";public static final int HEADER_BACKGROUND_SCROLL_NORMAL = 0;public static final int HEADER_BACKGROUND_SCROLL_PARALLAX = 1;public static final int HEADER_BACKGROUND_SCROLL_STATIC = 2;//TODO header’s height 你可以改变他public static int headerHeight=350;private FrameLayout mFrameLayout;private View mContentOverlay;// headerprivate View mHeader;private View mHeaderHeader;private View mHeaderBackground;private int mHeaderHeight;private int mHeaderScroll;private int mHeaderBackgroundScrollMode = HEADER_BACKGROUND_SCROLL_NORMAL;private Space mFakeHeader;private boolean isListViewEmpty;// listenersprivate AbsListView.OnScrollListener mOnScrollListener;private OnHeaderScrollChangedListener mOnHeaderScrollChangedListener;public interface OnHeaderScrollChangedListener {public void onHeaderScrollChanged(float progress, int height, int scroll);}public void setOnHeaderScrollChangedListener(OnHeaderScrollChangedListener listener) {mOnHeaderScrollChangedListener = listener;}public void setHeaderBackgroundScrollMode(int scrollMode) {mHeaderBackgroundScrollMode = scrollMode;}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {final Activity activity = getActivity();assert activity != null;mFrameLayout = new FrameLayout(activity);mHeader = onCreateHeaderView(inflater, mFrameLayout);mHeaderHeader = mHeader.findViewById(android.R.id.title);//mHeaderBackground = mHeader.findViewById(android.R.id.background);assert mHeader.getLayoutParams() != null;//mHeaderHeight = mHeader.getLayoutParams().height;View content = onCreateContentView(inflater, mFrameLayout);mHeaderHeight = headerHeight;mFakeHeader = new Space(activity);mFakeHeader.setLayoutParams(new ListView.LayoutParams(0, mHeaderHeight));mFakeHeader.setLayoutParams(new ListView.LayoutParams(0, 0));mHeaderBackground = content.findViewById(android.R.id.background);if (content instanceof ListView) {isListViewEmpty = true;final ListView listView = (ListView) content;listView.addHeaderView(mFakeHeader);listView.setOnScrollListener(new AbsListView.OnScrollListener() {@Overridepublic void onScrollStateChanged(AbsListView absListView, int scrollState) {if (mOnScrollListener != null) {mOnScrollListener.onScrollStateChanged(absListView, scrollState);}}@Overridepublic void onScroll(AbsListView absListView, int firstVisibleItem,int visibleItemCount, int totalItemCount) {if (mOnScrollListener != null) {mOnScrollListener.onScroll(absListView, firstVisibleItem,visibleItemCount, totalItemCount);}if (isListViewEmpty) {scrollHeaderTo(0);} else {final View child = absListView.getChildAt(0);assert child != null;scrollHeaderTo(child == mFakeHeader ? child.getTop() : -mHeaderHeight);}}});} else {// Merge fake header view and content view.final LinearLayout view = new LinearLayout(activity);view.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT));view.setOrientation(LinearLayout.VERTICAL);view.addView(mFakeHeader);view.addView(content);// Put merged content to ScrollViewfinal NotifyingScrollView scrollView = new NotifyingScrollView(activity);scrollView.addView(view);scrollView.setOnScrollChangedListener(new NotifyingScrollView.OnScrollChangedListener() {@Overridepublic void onScrollChanged(ScrollView who, int l, int t, int oldl, int oldt) {scrollHeaderTo(-t);}});content = scrollView;}mFrameLayout.addView(content);mFrameLayout.addView(mHeader);// Content overlay view always shows at the top of content.if ((mContentOverlay = onCreateContentOverlayView(inflater, mFrameLayout)) != null) {mFrameLayout.addView(mContentOverlay, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT));}// Post initial scrollmFrameLayout.post(new Runnable() {@Overridepublic void run() {scrollHeaderTo(0, true);}});return mFrameLayout;}private void scrollHeaderTo(int scrollTo) {scrollHeaderTo(scrollTo, false);}@TargetApi(Build.VERSION_CODES.HONEYCOMB)private void scrollHeaderTo(int scrollTo, boolean forceChange) {scrollTo = Math.min(Math.max(scrollTo, -mHeaderHeight), 0);if (mHeaderScroll == (mHeaderScroll = scrollTo) & !forceChange) return;setViewTranslationY(mHeader, scrollTo);setViewTranslationY(mHeaderHeader, -scrollTo);switch (mHeaderBackgroundScrollMode) {case HEADER_BACKGROUND_SCROLL_NORMAL:setViewTranslationY(mHeaderBackground, 0);break;case HEADER_BACKGROUND_SCROLL_PARALLAX:setViewTranslationY(mHeaderBackground, -scrollTo / 1.6f);break;case HEADER_BACKGROUND_SCROLL_STATIC:setViewTranslationY(mHeaderBackground, -scrollTo);break;}if (mContentOverlay != null) {final ViewGroup.LayoutParams lp = mContentOverlay.getLayoutParams();final int delta = mHeaderHeight + scrollTo;lp.height = mFrameLayout.getHeight() – delta;mContentOverlay.setLayoutParams(lp);mContentOverlay.setTranslationY(delta);}notifyOnHeaderScrollChangeListener((float) -scrollTo / mHeaderHeight,mHeaderHeight,-scrollTo);}@TargetApi(Build.VERSION_CODES.HONEYCOMB)private void setViewTranslationY(View view, float translationY) {if (view != null) view.setTranslationY(translationY);}private void notifyOnHeaderScrollChangeListener(float progress, int height, int scroll) {if (mOnHeaderScrollChangedListener != null) {mOnHeaderScrollChangedListener.onHeaderScrollChanged(progress, height, scroll);}}public abstract View onCreateHeaderView(LayoutInflater inflater, ViewGroup container);public abstract View onCreateContentView(LayoutInflater inflater, ViewGroup container);public abstract View onCreateContentOverlayView(LayoutInflater inflater, ViewGroup container);public void setListViewAdapter(ListView listView, ListAdapter adapter) {isListViewEmpty = adapter == null;listView.setAdapter(null);listView.removeHeaderView(mFakeHeader);listView.addHeaderView(mFakeHeader);listView.setAdapter(adapter);}/*** {@inheritDoc AbsListView#setOnScrollChangedListener}*/public void setListViewOnScrollChangedListener(AbsListView.OnScrollListener listener) {mOnScrollListener = listener;}// //////////////////////////////////////////// //////////// — GETTERS — ///////////////// //////////////////////////////////////////public View getHeaderView() {return mHeader;}public View getHeaderHeaderView() {return mHeaderHeader;}public View getHeaderBackgroundView() {return mHeaderBackground;}public int getHeaderBackgroundScrollMode() {return mHeaderBackgroundScrollMode;}}FadingActionBarHelper.java

看了哪些风景,遇到哪些人。尽管同学说,

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

相关文章:

你感兴趣的文章:

标签云: