├── .gitignore ├── README.md ├── README_CN.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── wingsofts │ │ └── byeburgerbardemo │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── wingsofts │ │ │ └── byeburgerbardemo │ │ │ ├── HolderFragment.java │ │ │ ├── HomeFragment.java │ │ │ ├── MainActivity.java │ │ │ └── NoScrollViewPager.java │ └── res │ │ ├── drawable-hdpi │ │ ├── ic_account_circle_black_24dp.png │ │ ├── ic_home_black_24dp.png │ │ ├── ic_search_black_24dp.png │ │ └── ic_settings_black_24dp.png │ │ ├── drawable-mdpi │ │ ├── ic_account_circle_black_24dp.png │ │ ├── ic_home_black_24dp.png │ │ ├── ic_search_black_24dp.png │ │ └── ic_settings_black_24dp.png │ │ ├── drawable-xhdpi │ │ ├── ic_account_circle_black_24dp.png │ │ ├── ic_home_black_24dp.png │ │ ├── ic_search_black_24dp.png │ │ └── ic_settings_black_24dp.png │ │ ├── drawable-xxhdpi │ │ ├── ic_account_circle_black_24dp.png │ │ ├── ic_home_black_24dp.png │ │ ├── ic_search_black_24dp.png │ │ └── ic_settings_black_24dp.png │ │ ├── drawable-xxxhdpi │ │ ├── ic_account_circle_black_24dp.png │ │ ├── ic_home_black_24dp.png │ │ ├── ic_search_black_24dp.png │ │ └── ic_settings_black_24dp.png │ │ ├── layout │ │ ├── activity_main.xml │ │ ├── fragment_holder.xml │ │ ├── fragment_home.xml │ │ └── item_main.xml │ │ ├── menu │ │ └── bottom.xml │ │ ├── mipmap-hdpi │ │ └── ic_launcher.png │ │ ├── mipmap-mdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxxhdpi │ │ └── ic_launcher.png │ │ ├── values-w820dp │ │ └── dimens.xml │ │ └── values │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── com │ └── wingsofts │ └── byeburgerbardemo │ └── ExampleUnitTest.java ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── img ├── book.gif ├── title.gif └── webview.gif ├── library ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── wingsofts │ │ └── byeburgernavigationview │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── wingsofts │ │ │ └── byeburgernavigationview │ │ │ ├── AnimateHelper.java │ │ │ ├── ByeBurgerBehavior.java │ │ │ ├── ByeBurgerBottomBehavior.java │ │ │ ├── ByeBurgerFloatButtonBehavior.java │ │ │ ├── ByeBurgerTitleBehavior.java │ │ │ ├── ScaleAnimateHelper.java │ │ │ └── TranslateAnimateHelper.java │ └── res │ │ └── values │ │ └── strings.xml │ └── test │ └── java │ └── com │ └── wingsofts │ └── byeburgernavigationview │ └── ExampleUnitTest.java └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/workspace.xml 5 | /.idea/libraries 6 | .DS_Store 7 | /build 8 | /captures 9 | /.idea 10 | .externalNativeBuild 11 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ByeBurger 2 | [![](https://jitpack.io/v/githubwing/ByeBurger.svg)](https://jitpack.io/#githubwing/ByeBurger) 3 | 4 | 5 | Bye Burger~ this is a easy way to make your title or bottom navigation hiding on scroll like this 6 | 7 | [Bye, Bye Burger! 8 | What we learned from implementing the new Android Bottom Navigation](https://medium.com/startup-grind/bye-bye-burger-5bd963806015#.qibuxdc1t) 9 | 10 | 11 | # [中文文档](https://github.com/githubwing/ByeBurger/blob/master/README_CN.md) 12 | 13 | ![image](https://github.com/githubwing/ByeBurgerNavigationView/raw/master/img/title.gif) 14 | ![image](https://github.com/githubwing/ByeBurgerNavigationView/raw/master/img/book.gif) 15 | ![image](https://github.com/githubwing/ByeBurgerNavigationView/raw/master/img/webview.gif) 16 | 17 | 18 | 19 | > **Hiding on scroll:** We wanted to provide as much content as possible on our user’s screens. Consequently, we decided to make the navigation hide on scroll, thus making more room for the content area. Scrolling up makes the navigation fade back in. 20 | 21 | > **Shifting navigation** : The Material Design bottom bar comes with a very slick animation, which is referred to as the Shifting navigation — when navigating between destinations the selected section icon is enlarged, moving the unselected element to the back. Flipping through destinations on the nav bar thus feels a bit like browsing through a carousel. We decided to utilize this effect as it adds a playful note to switching sections, which we hoped would nudge our users into navigating to different areas in the app more often. Further, the animation plays a major part in our next point… 22 | 23 | 24 | # USAGE 25 | 26 | compile the library in your build.gralde 27 | 28 | ```gradle 29 | 30 | allprojects { 31 | repositories { 32 | jcenter() 33 | maven { url "https://jitpack.io" } 34 | } 35 | } 36 | 37 | 38 | dependencies { 39 | compile 'com.github.githubwing:ByeBurger:1.2.3' 40 | compile 'com.android.support:design:25.0.0' 41 | } 42 | ``` 43 | 44 | You only need to change the root view to CoordinatorLayout, 45 | And add one line code "app:layout_behavior" like the bottom 46 | into **ANY** view, Then your view hiding on scroll. 47 | Your titleBar can be Toolbar,LinearLayout and so on. 48 | Your NavigationView can be BottomNavigationView or TabLayout, 49 | or **Any** View you put in xml. 50 | 51 | ```xml 52 | 53 | 54 | 55 | 58 | 62 | 65 | 66 | 67 | ``` 68 | 69 | You can control it by call method show() hide() 70 | 71 | ```java 72 | ByeBurgerBehavior.from(mToolbar).hide() 73 | 74 | ByeBurgerBehavior.from(mFloatButton).show() 75 | 76 | ``` 77 | 78 | 79 | # License 80 | 81 | Copyright 2016 androidwing1992 82 | 83 | Licensed under the Apache License, Version 2.0 (the "License"); 84 | you may not use this file except in compliance with the License. 85 | You may obtain a copy of the License at 86 | 87 | http://www.apache.org/licenses/LICENSE-2.0 88 | 89 | Unless required by applicable law or agreed to in writing, software 90 | distributed under the License is distributed on an "AS IS" BASIS, 91 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 92 | See the License for the specific language governing permissions and 93 | limitations under the License. 94 | -------------------------------------------------------------------------------- /README_CN.md: -------------------------------------------------------------------------------- 1 | # ByeBurger 2 | 拜拜吧 汉堡菜单, 这是一个极其简便的快速实现隐藏标题栏和导航栏的库。 3 | 4 | [![](https://jitpack.io/v/githubwing/ByeBurger.svg)](https://jitpack.io/#githubwing/ByeBurger) 5 | 6 | 7 | 这是一个全新底部菜单交互的实现 [再见,汉堡菜单,我们有了新的 Android 交互设计方案](https://github.com/xitu/gold-miner/blob/master/TODO/bye-bye-burger.md) 8 | 9 | 10 | ![image](https://github.com/githubwing/ByeBurgerNavigationView/raw/master/img/title.gif) 11 | ![image](https://github.com/githubwing/ByeBurgerNavigationView/raw/master/img/book.gif) 12 | ![image](https://github.com/githubwing/ByeBurgerNavigationView/raw/master/img/webview.gif) 13 | 14 | 15 | > * **滚动时隐藏:** 我们希望在用户的屏幕上显示尽可能多的内容。因此,我们决定在向下滚动的时候隐藏导航栏,从而给内容区域提供更多的空间。而向上滚动可以使导航栏重新显现。 16 | > * **变换式导航栏:** Material Design 底部栏有一个非常平滑的动画,它参考了变换式导航栏——在不同目标间切换的时候,被选中的部分会被放大,同时未被选中的元素会被向后移动,从而在导航栏上浏览不同的目标就有点像在浏览一个旋转木马。我们决定要使用这种效果因为它使得切换导航目标变得更加有趣了。我们希望这可以推动我们的用户更多地在应用的不同功能组间切换。同时,该动画在我们的下一个观点中非常重要。 17 | 18 | # 使用 19 | 20 | 在gradle 编译库文件 21 | 22 | ```gralde 23 | 24 | allprojects { 25 | repositories { 26 | jcenter() 27 | maven { url "https://jitpack.io" } 28 | } 29 | } 30 | 31 | 32 | dependencies { 33 | compile 'com.github.githubwing:ByeBurger:1.2.3' 34 | compile 'com.android.support:design:25.0.0' 35 | } 36 | ``` 37 | 38 | 你只需要在布局中,使用CoordinatorLayout作为根布局,然后向你的**任何**View中插入一句app:layout_behavior属性,即可实现滑动的隐藏和显示。你的标题栏可以是Toolbar或者LinearLayout或者什么鬼,同样你的底部导航栏可以是最新的BottomNavigationView亦或者TabLayout在古老一点的RadioButton都可以! 39 | 40 | 最新添加了对悬浮按钮的支持。 41 | 42 | ```xml 43 | 44 | 45 | <--! 这里放你的布局内容,可以是任意view--> 46 | 49 | 53 | 56 | 57 | 58 | ``` 59 | # 注意 60 | CoordinatorLayout类似于FrameLayout,所以注意xml层次,Title和Bottom Tab要在xml下方。 61 | 62 | 只有实现NestScorll接口View的才可以实现监听,例如RecyclerView、NestScrollView. 63 | 64 | 在**ListView**下,是**不生效**的。 65 | 66 | **所有需要隐藏的,必须作为CoordinatorLayout的直接子view** 67 | 68 | 你也可以手动调用如下方法,来控制显隐。 69 | 70 | ``` 71 | ByeBurgerBehavior.from(mToolbar).hide() 72 | 73 | ByeBurgerBehavior.show(mFloatButton).show() 74 | ``` 75 | 76 | # License 77 | 78 | Copyright 2016 androidwing1992 79 | 80 | Licensed under the Apache License, Version 2.0 (the "License"); 81 | you may not use this file except in compliance with the License. 82 | You may obtain a copy of the License at 83 | 84 | http://www.apache.org/licenses/LICENSE-2.0 85 | 86 | Unless required by applicable law or agreed to in writing, software 87 | distributed under the License is distributed on an "AS IS" BASIS, 88 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 89 | See the License for the specific language governing permissions and 90 | limitations under the License. 91 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 25 5 | buildToolsVersion "25.0.0" 6 | defaultConfig { 7 | applicationId "com.wingsofts.byeburgerbardemo" 8 | minSdkVersion 15 9 | targetSdkVersion 25 10 | versionCode 1 11 | versionName "1.0" 12 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 13 | } 14 | buildTypes { 15 | release { 16 | minifyEnabled false 17 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 18 | } 19 | } 20 | } 21 | 22 | dependencies { 23 | compile fileTree(dir: 'libs', include: ['*.jar']) 24 | androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { 25 | exclude group: 'com.android.support', module: 'support-annotations' 26 | }) 27 | compile 'com.android.support:appcompat-v7:25.0.0' 28 | compile 'com.android.support:design:25.0.0' 29 | compile 'com.android.support:recyclerview-v7:25.0.0' 30 | compile project(':library') 31 | testCompile 'junit:junit:4.12' 32 | } 33 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /Users/wing/Library/Android/sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /app/src/androidTest/java/com/wingsofts/byeburgerbardemo/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.wingsofts.byeburgerbardemo; 2 | 3 | import android.content.Context; 4 | import android.support.test.InstrumentationRegistry; 5 | import android.support.test.runner.AndroidJUnit4; 6 | 7 | import org.junit.Test; 8 | import org.junit.runner.RunWith; 9 | 10 | import static org.junit.Assert.*; 11 | 12 | /** 13 | * Instrumentation test, which will execute on an Android device. 14 | * 15 | * @see Testing documentation 16 | */ 17 | @RunWith(AndroidJUnit4.class) public class ExampleInstrumentedTest { 18 | @Test public void useAppContext() throws Exception { 19 | // Context of the app under test. 20 | Context appContext = InstrumentationRegistry.getTargetContext(); 21 | 22 | assertEquals("com.wingsofts.byeburgerbardemo", appContext.getPackageName()); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 11 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/java/com/wingsofts/byeburgerbardemo/HolderFragment.java: -------------------------------------------------------------------------------- 1 | package com.wingsofts.byeburgerbardemo; 2 | 3 | import android.os.Bundle; 4 | import android.support.annotation.Nullable; 5 | import android.support.v4.app.Fragment; 6 | import android.view.LayoutInflater; 7 | import android.view.View; 8 | import android.view.ViewGroup; 9 | import android.widget.TextView; 10 | 11 | /** 12 | * Created by wing on 11/4/16. 13 | */ 14 | 15 | public class HolderFragment extends Fragment { 16 | public static String NAME = "NAME"; 17 | 18 | @Nullable @Override 19 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, 20 | @Nullable Bundle savedInstanceState) { 21 | View v = View.inflate(getContext(), R.layout.fragment_holder, null); 22 | return v; 23 | } 24 | 25 | @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 26 | super.onViewCreated(view, savedInstanceState); 27 | 28 | TextView textView = (TextView) view.findViewById(R.id.text); 29 | textView.setText(getArguments().getString(NAME)); 30 | } 31 | 32 | public static HolderFragment newInstance(String text) { 33 | Bundle args = new Bundle(); 34 | args.putString(NAME, text); 35 | HolderFragment fragment = new HolderFragment(); 36 | fragment.setArguments(args); 37 | return fragment; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /app/src/main/java/com/wingsofts/byeburgerbardemo/HomeFragment.java: -------------------------------------------------------------------------------- 1 | package com.wingsofts.byeburgerbardemo; 2 | 3 | import android.os.Bundle; 4 | import android.support.annotation.Nullable; 5 | import android.support.v4.app.Fragment; 6 | import android.support.v7.widget.LinearLayoutManager; 7 | import android.support.v7.widget.RecyclerView; 8 | import android.view.LayoutInflater; 9 | import android.view.View; 10 | import android.view.ViewGroup; 11 | import android.widget.TextView; 12 | 13 | /** 14 | * Created by wing on 11/4/16. 15 | */ 16 | 17 | public class HomeFragment extends Fragment { 18 | @Nullable @Override 19 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, 20 | @Nullable Bundle savedInstanceState) { 21 | View v = View.inflate(getContext(), R.layout.fragment_home, null); 22 | RecyclerView recyclerView = (RecyclerView) v.findViewById(R.id.recyclerView); 23 | recyclerView.setAdapter(new Adapter()); 24 | recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); 25 | return v; 26 | } 27 | 28 | public static HomeFragment newInstance() { 29 | Bundle args = new Bundle(); 30 | HomeFragment fragment = new HomeFragment(); 31 | fragment.setArguments(args); 32 | return fragment; 33 | } 34 | 35 | class Adapter extends RecyclerView.Adapter { 36 | 37 | @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 38 | return new ViewHolder(View.inflate(parent.getContext(), R.layout.item_main, null)); 39 | } 40 | 41 | @Override public void onBindViewHolder(ViewHolder holder, int position) { 42 | 43 | } 44 | 45 | @Override public int getItemCount() { 46 | return 20; 47 | } 48 | 49 | class ViewHolder extends RecyclerView.ViewHolder { 50 | TextView textView; 51 | 52 | public ViewHolder(View itemView) { 53 | super(itemView); 54 | textView = (TextView) itemView.findViewById(R.id.text); 55 | } 56 | } 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /app/src/main/java/com/wingsofts/byeburgerbardemo/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.wingsofts.byeburgerbardemo; 2 | 3 | import android.graphics.Color; 4 | import android.support.annotation.NonNull; 5 | import android.support.design.widget.BottomNavigationView; 6 | import android.support.design.widget.FloatingActionButton; 7 | import android.support.v4.app.Fragment; 8 | import android.support.v4.app.FragmentPagerAdapter; 9 | import android.support.v4.view.ViewPager; 10 | import android.support.v7.app.AppCompatActivity; 11 | import android.os.Bundle; 12 | import android.support.v7.widget.RecyclerView; 13 | import android.support.v7.widget.Toolbar; 14 | import android.view.MenuItem; 15 | import com.wingsofts.byeburgernavigationview.ByeBurgerBehavior; 16 | import java.util.ArrayList; 17 | import java.util.List; 18 | 19 | public class MainActivity extends AppCompatActivity { 20 | private RecyclerView mRecyclerView; 21 | private ViewPager mViewPager; 22 | private List fragmentList; 23 | private BottomNavigationView mNavigationView; 24 | private FloatingActionButton mFloatButton; 25 | private ByeBurgerBehavior mBehavior; 26 | private Toolbar mToolbar; 27 | 28 | @Override protected void onCreate(Bundle savedInstanceState) { 29 | super.onCreate(savedInstanceState); 30 | setContentView(R.layout.activity_main); 31 | initData(); 32 | initView(); 33 | } 34 | 35 | private void initView() { 36 | mToolbar = (Toolbar) findViewById(R.id.toolbar); 37 | mToolbar.setTitleTextColor(Color.WHITE); 38 | mToolbar.setTitle("Bye! Bye! Burger"); 39 | setSupportActionBar(mToolbar); 40 | mViewPager = (ViewPager) findViewById(R.id.viewpager); 41 | mNavigationView = (BottomNavigationView) findViewById(R.id.bye_burger); 42 | mFloatButton = (FloatingActionButton) findViewById(R.id.floatButton); 43 | 44 | mBehavior = ByeBurgerBehavior.from(mFloatButton); 45 | 46 | mViewPager.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) { 47 | @Override public Fragment getItem(int position) { 48 | return fragmentList.get(position); 49 | } 50 | 51 | @Override public int getCount() { 52 | return fragmentList.size(); 53 | } 54 | }); 55 | 56 | 57 | mNavigationView.setOnNavigationItemSelectedListener( 58 | new BottomNavigationView.OnNavigationItemSelectedListener() { 59 | @Override public boolean onNavigationItemSelected(@NonNull MenuItem item) { 60 | if(item.getTitle().equals("home")){ 61 | mBehavior.show(); 62 | mViewPager.setCurrentItem(0); 63 | }else if(item.getTitle().equals("search")){ 64 | ByeBurgerBehavior.from(mToolbar).hide(); 65 | mBehavior.hide(); 66 | mViewPager.setCurrentItem(1); 67 | }else if(item.getTitle().equals("me")){ 68 | 69 | mBehavior.hide(); 70 | mViewPager.setCurrentItem(2); 71 | }else if(item.getTitle().equals("setting")){ 72 | mBehavior.hide(); 73 | mViewPager.setCurrentItem(3); 74 | } 75 | return false; 76 | } 77 | }); 78 | 79 | } 80 | 81 | private void initData() { 82 | fragmentList = new ArrayList<>(); 83 | fragmentList.add(HomeFragment.newInstance()); 84 | 85 | fragmentList.add(HolderFragment.newInstance("search")); 86 | 87 | fragmentList.add(HolderFragment.newInstance("me")); 88 | 89 | fragmentList.add(HolderFragment.newInstance("setting")); 90 | } 91 | } -------------------------------------------------------------------------------- /app/src/main/java/com/wingsofts/byeburgerbardemo/NoScrollViewPager.java: -------------------------------------------------------------------------------- 1 | package com.wingsofts.byeburgerbardemo; 2 | 3 | import android.content.Context; 4 | import android.support.v4.view.ViewPager; 5 | import android.util.AttributeSet; 6 | import android.view.MotionEvent; 7 | 8 | /** 9 | * Created by wing on 11/4/16. 10 | */ 11 | 12 | public class NoScrollViewPager extends ViewPager { 13 | 14 | private boolean isPagingEnabled = false; 15 | public NoScrollViewPager(Context context) { 16 | super(context); 17 | } 18 | 19 | public NoScrollViewPager(Context context, AttributeSet attrs) { 20 | super(context, attrs); 21 | } 22 | 23 | @Override 24 | public boolean onTouchEvent(MotionEvent event) { 25 | return this.isPagingEnabled && super.onTouchEvent(event); 26 | } 27 | 28 | @Override 29 | public boolean onInterceptTouchEvent(MotionEvent event) { 30 | return this.isPagingEnabled && super.onInterceptTouchEvent(event); 31 | } 32 | 33 | @Override public void scrollTo(int x, int y) { 34 | super.scrollTo(x, y); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_account_circle_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githubwing/ByeBurger/471c2d61b4384d7d2118cc640d12f5ac9253f5a0/app/src/main/res/drawable-hdpi/ic_account_circle_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_home_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githubwing/ByeBurger/471c2d61b4384d7d2118cc640d12f5ac9253f5a0/app/src/main/res/drawable-hdpi/ic_home_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_search_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githubwing/ByeBurger/471c2d61b4384d7d2118cc640d12f5ac9253f5a0/app/src/main/res/drawable-hdpi/ic_search_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_settings_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githubwing/ByeBurger/471c2d61b4384d7d2118cc640d12f5ac9253f5a0/app/src/main/res/drawable-hdpi/ic_settings_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_account_circle_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githubwing/ByeBurger/471c2d61b4384d7d2118cc640d12f5ac9253f5a0/app/src/main/res/drawable-mdpi/ic_account_circle_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_home_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githubwing/ByeBurger/471c2d61b4384d7d2118cc640d12f5ac9253f5a0/app/src/main/res/drawable-mdpi/ic_home_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_search_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githubwing/ByeBurger/471c2d61b4384d7d2118cc640d12f5ac9253f5a0/app/src/main/res/drawable-mdpi/ic_search_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_settings_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githubwing/ByeBurger/471c2d61b4384d7d2118cc640d12f5ac9253f5a0/app/src/main/res/drawable-mdpi/ic_settings_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_account_circle_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githubwing/ByeBurger/471c2d61b4384d7d2118cc640d12f5ac9253f5a0/app/src/main/res/drawable-xhdpi/ic_account_circle_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_home_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githubwing/ByeBurger/471c2d61b4384d7d2118cc640d12f5ac9253f5a0/app/src/main/res/drawable-xhdpi/ic_home_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_search_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githubwing/ByeBurger/471c2d61b4384d7d2118cc640d12f5ac9253f5a0/app/src/main/res/drawable-xhdpi/ic_search_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_settings_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githubwing/ByeBurger/471c2d61b4384d7d2118cc640d12f5ac9253f5a0/app/src/main/res/drawable-xhdpi/ic_settings_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_account_circle_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githubwing/ByeBurger/471c2d61b4384d7d2118cc640d12f5ac9253f5a0/app/src/main/res/drawable-xxhdpi/ic_account_circle_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_home_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githubwing/ByeBurger/471c2d61b4384d7d2118cc640d12f5ac9253f5a0/app/src/main/res/drawable-xxhdpi/ic_home_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_search_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githubwing/ByeBurger/471c2d61b4384d7d2118cc640d12f5ac9253f5a0/app/src/main/res/drawable-xxhdpi/ic_search_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_settings_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githubwing/ByeBurger/471c2d61b4384d7d2118cc640d12f5ac9253f5a0/app/src/main/res/drawable-xxhdpi/ic_settings_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_account_circle_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githubwing/ByeBurger/471c2d61b4384d7d2118cc640d12f5ac9253f5a0/app/src/main/res/drawable-xxxhdpi/ic_account_circle_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_home_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githubwing/ByeBurger/471c2d61b4384d7d2118cc640d12f5ac9253f5a0/app/src/main/res/drawable-xxxhdpi/ic_home_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_search_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githubwing/ByeBurger/471c2d61b4384d7d2118cc640d12f5ac9253f5a0/app/src/main/res/drawable-xxxhdpi/ic_search_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_settings_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githubwing/ByeBurger/471c2d61b4384d7d2118cc640d12f5ac9253f5a0/app/src/main/res/drawable-xxxhdpi/ic_settings_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | 17 | 18 | 19 | 20 | 31 | 32 | 39 | 40 | 41 | 42 | 43 | 53 | 54 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_holder.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_home.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/menu/bottom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 9 | 10 | 15 | 21 | 27 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githubwing/ByeBurger/471c2d61b4384d7d2118cc640d12f5ac9253f5a0/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githubwing/ByeBurger/471c2d61b4384d7d2118cc640d12f5ac9253f5a0/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githubwing/ByeBurger/471c2d61b4384d7d2118cc640d12f5ac9253f5a0/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githubwing/ByeBurger/471c2d61b4384d7d2118cc640d12f5ac9253f5a0/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githubwing/ByeBurger/471c2d61b4384d7d2118cc640d12f5ac9253f5a0/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/values-w820dp/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 64dp 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #03A9F4 4 | #0288D1 5 | #FF4081 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16dp 4 | 16dp 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | ByeBurgerBarDemo 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/test/java/com/wingsofts/byeburgerbardemo/ExampleUnitTest.java: -------------------------------------------------------------------------------- 1 | package com.wingsofts.byeburgerbardemo; 2 | 3 | import org.junit.Test; 4 | 5 | import static org.junit.Assert.*; 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * @see Testing documentation 11 | */ 12 | public class ExampleUnitTest { 13 | @Test public void addition_isCorrect() throws Exception { 14 | assertEquals(4, 2 + 2); 15 | } 16 | } -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | 3 | buildscript { 4 | repositories { 5 | jcenter() 6 | } 7 | dependencies { 8 | classpath 'com.android.tools.build:gradle:2.2.2' 9 | classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3' 10 | // NOTE: Do not place your application dependencies here; they belong 11 | // in the individual module build.gradle files 12 | } 13 | } 14 | 15 | allprojects { 16 | repositories { 17 | jcenter() 18 | maven { url "https://jitpack.io" } 19 | } 20 | } 21 | 22 | task clean(type: Delete) { 23 | delete rootProject.buildDir 24 | } 25 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | ## Project-wide Gradle settings. 2 | # 3 | # For more details on how to configure your build environment visit 4 | # http://www.gradle.org/docs/current/userguide/build_environment.html 5 | # 6 | # Specifies the JVM arguments used for the daemon process. 7 | # The setting is particularly useful for tweaking memory settings. 8 | # Default value: -Xmx1024m -XX:MaxPermSize=256m 9 | # org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 10 | # 11 | # When configured, Gradle will run in incubating parallel mode. 12 | # This option should only be used with decoupled projects. More details, visit 13 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 14 | # org.gradle.parallel=true 15 | #Sat Nov 19 19:37:33 CST 2016 16 | systemProp.http.proxyHost=127.0.0.1 17 | org.gradle.jvmargs=-Xmx1536m 18 | systemProp.http.proxyPort=8123 19 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githubwing/ByeBurger/471c2d61b4384d7d2118cc640d12f5ac9253f5a0/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Mon Dec 28 10:00:20 PST 2015 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip 7 | -------------------------------------------------------------------------------- /gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | ############################################################################## 4 | ## 5 | ## Gradle start up script for UN*X 6 | ## 7 | ############################################################################## 8 | 9 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 10 | DEFAULT_JVM_OPTS="" 11 | 12 | APP_NAME="Gradle" 13 | APP_BASE_NAME=`basename "$0"` 14 | 15 | # Use the maximum available, or set MAX_FD != -1 to use that value. 16 | MAX_FD="maximum" 17 | 18 | warn ( ) { 19 | echo "$*" 20 | } 21 | 22 | die ( ) { 23 | echo 24 | echo "$*" 25 | echo 26 | exit 1 27 | } 28 | 29 | # OS specific support (must be 'true' or 'false'). 30 | cygwin=false 31 | msys=false 32 | darwin=false 33 | case "`uname`" in 34 | CYGWIN* ) 35 | cygwin=true 36 | ;; 37 | Darwin* ) 38 | darwin=true 39 | ;; 40 | MINGW* ) 41 | msys=true 42 | ;; 43 | esac 44 | 45 | # Attempt to set APP_HOME 46 | # Resolve links: $0 may be a link 47 | PRG="$0" 48 | # Need this for relative symlinks. 49 | while [ -h "$PRG" ] ; do 50 | ls=`ls -ld "$PRG"` 51 | link=`expr "$ls" : '.*-> \(.*\)$'` 52 | if expr "$link" : '/.*' > /dev/null; then 53 | PRG="$link" 54 | else 55 | PRG=`dirname "$PRG"`"/$link" 56 | fi 57 | done 58 | SAVED="`pwd`" 59 | cd "`dirname \"$PRG\"`/" >/dev/null 60 | APP_HOME="`pwd -P`" 61 | cd "$SAVED" >/dev/null 62 | 63 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 64 | 65 | # Determine the Java command to use to start the JVM. 66 | if [ -n "$JAVA_HOME" ] ; then 67 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 68 | # IBM's JDK on AIX uses strange locations for the executables 69 | JAVACMD="$JAVA_HOME/jre/sh/java" 70 | else 71 | JAVACMD="$JAVA_HOME/bin/java" 72 | fi 73 | if [ ! -x "$JAVACMD" ] ; then 74 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 75 | 76 | Please set the JAVA_HOME variable in your environment to match the 77 | location of your Java installation." 78 | fi 79 | else 80 | JAVACMD="java" 81 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 82 | 83 | Please set the JAVA_HOME variable in your environment to match the 84 | location of your Java installation." 85 | fi 86 | 87 | # Increase the maximum file descriptors if we can. 88 | if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then 89 | MAX_FD_LIMIT=`ulimit -H -n` 90 | if [ $? -eq 0 ] ; then 91 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 92 | MAX_FD="$MAX_FD_LIMIT" 93 | fi 94 | ulimit -n $MAX_FD 95 | if [ $? -ne 0 ] ; then 96 | warn "Could not set maximum file descriptor limit: $MAX_FD" 97 | fi 98 | else 99 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 100 | fi 101 | fi 102 | 103 | # For Darwin, add options to specify how the application appears in the dock 104 | if $darwin; then 105 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 106 | fi 107 | 108 | # For Cygwin, switch paths to Windows format before running java 109 | if $cygwin ; then 110 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 111 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 112 | JAVACMD=`cygpath --unix "$JAVACMD"` 113 | 114 | # We build the pattern for arguments to be converted via cygpath 115 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 116 | SEP="" 117 | for dir in $ROOTDIRSRAW ; do 118 | ROOTDIRS="$ROOTDIRS$SEP$dir" 119 | SEP="|" 120 | done 121 | OURCYGPATTERN="(^($ROOTDIRS))" 122 | # Add a user-defined pattern to the cygpath arguments 123 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 124 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 125 | fi 126 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 127 | i=0 128 | for arg in "$@" ; do 129 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 130 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 131 | 132 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 133 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 134 | else 135 | eval `echo args$i`="\"$arg\"" 136 | fi 137 | i=$((i+1)) 138 | done 139 | case $i in 140 | (0) set -- ;; 141 | (1) set -- "$args0" ;; 142 | (2) set -- "$args0" "$args1" ;; 143 | (3) set -- "$args0" "$args1" "$args2" ;; 144 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;; 145 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 146 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 147 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 148 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 149 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 150 | esac 151 | fi 152 | 153 | # Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules 154 | function splitJvmOpts() { 155 | JVM_OPTS=("$@") 156 | } 157 | eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS 158 | JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" 159 | 160 | exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" 161 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 12 | set DEFAULT_JVM_OPTS= 13 | 14 | set DIRNAME=%~dp0 15 | if "%DIRNAME%" == "" set DIRNAME=. 16 | set APP_BASE_NAME=%~n0 17 | set APP_HOME=%DIRNAME% 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windowz variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | if "%@eval[2+2]" == "4" goto 4NT_args 53 | 54 | :win9xME_args 55 | @rem Slurp the command line arguments. 56 | set CMD_LINE_ARGS= 57 | set _SKIP=2 58 | 59 | :win9xME_args_slurp 60 | if "x%~1" == "x" goto execute 61 | 62 | set CMD_LINE_ARGS=%* 63 | goto execute 64 | 65 | :4NT_args 66 | @rem Get arguments from the 4NT Shell from JP Software 67 | set CMD_LINE_ARGS=%$ 68 | 69 | :execute 70 | @rem Setup the command line 71 | 72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 73 | 74 | @rem Execute Gradle 75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 76 | 77 | :end 78 | @rem End local scope for the variables with windows NT shell 79 | if "%ERRORLEVEL%"=="0" goto mainEnd 80 | 81 | :fail 82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 83 | rem the _cmd.exe /c_ return code! 84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 85 | exit /b 1 86 | 87 | :mainEnd 88 | if "%OS%"=="Windows_NT" endlocal 89 | 90 | :omega 91 | -------------------------------------------------------------------------------- /img/book.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githubwing/ByeBurger/471c2d61b4384d7d2118cc640d12f5ac9253f5a0/img/book.gif -------------------------------------------------------------------------------- /img/title.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githubwing/ByeBurger/471c2d61b4384d7d2118cc640d12f5ac9253f5a0/img/title.gif -------------------------------------------------------------------------------- /img/webview.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githubwing/ByeBurger/471c2d61b4384d7d2118cc640d12f5ac9253f5a0/img/webview.gif -------------------------------------------------------------------------------- /library/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /library/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.library' 2 | android { 3 | compileSdkVersion 25 4 | buildToolsVersion "25.0.0" 5 | 6 | defaultConfig { 7 | minSdkVersion 15 8 | targetSdkVersion 25 9 | versionCode 1 10 | versionName "1.0" 11 | 12 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 13 | } 14 | buildTypes { 15 | release { 16 | minifyEnabled false 17 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 18 | } 19 | } 20 | } 21 | 22 | dependencies { 23 | compile fileTree(dir: 'libs', include: ['*.jar']) 24 | androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { 25 | exclude group: 'com.android.support', module: 'support-annotations' 26 | }) 27 | compile 'com.android.support:appcompat-v7:25.0.0' 28 | testCompile 'junit:junit:4.12' 29 | compile 'com.android.support:design:25.0.0' 30 | } 31 | -------------------------------------------------------------------------------- /library/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /Users/wing/Library/Android/sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /library/src/androidTest/java/com/wingsofts/byeburgernavigationview/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.wingsofts.byeburgernavigationview; 2 | 3 | import android.content.Context; 4 | import android.support.test.InstrumentationRegistry; 5 | import android.support.test.runner.AndroidJUnit4; 6 | 7 | import org.junit.Test; 8 | import org.junit.runner.RunWith; 9 | 10 | import static org.junit.Assert.*; 11 | 12 | /** 13 | * Instrumentation test, which will execute on an Android device. 14 | * 15 | * @see Testing documentation 16 | */ 17 | @RunWith(AndroidJUnit4.class) public class ExampleInstrumentedTest { 18 | @Test public void useAppContext() throws Exception { 19 | // Context of the app under test. 20 | Context appContext = InstrumentationRegistry.getTargetContext(); 21 | 22 | assertEquals("com.wingsofts.byeburgernavigationview.test", appContext.getPackageName()); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /library/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | -------------------------------------------------------------------------------- /library/src/main/java/com/wingsofts/byeburgernavigationview/AnimateHelper.java: -------------------------------------------------------------------------------- 1 | package com.wingsofts.byeburgernavigationview; 2 | 3 | /** 4 | * Created by wing on 11/8/16. 5 | */ 6 | 7 | public interface AnimateHelper { 8 | public static int STATE_SHOW = 1; 9 | public static int STATE_HIDE = 0; 10 | void show(); 11 | void hide(); 12 | void setStartY(float y); 13 | void setMode(int modeBottom); 14 | int getState(); 15 | } 16 | -------------------------------------------------------------------------------- /library/src/main/java/com/wingsofts/byeburgernavigationview/ByeBurgerBehavior.java: -------------------------------------------------------------------------------- 1 | package com.wingsofts.byeburgernavigationview; 2 | 3 | import android.content.Context; 4 | import android.support.design.widget.CoordinatorLayout; 5 | import android.support.v4.view.ViewCompat; 6 | import android.util.AttributeSet; 7 | import android.view.View; 8 | import android.view.ViewConfiguration; 9 | import android.view.ViewGroup; 10 | 11 | /** 12 | * Base Behavior 13 | * Created by wing on 11/8/16. 14 | */ 15 | 16 | abstract public class ByeBurgerBehavior extends CoordinatorLayout.Behavior { 17 | 18 | protected final int mTouchSlop; 19 | protected boolean isFirstMove = true; 20 | protected boolean canInit = true; 21 | protected AnimateHelper mAnimateHelper; 22 | 23 | public ByeBurgerBehavior(Context context, AttributeSet attrs) { 24 | super(context, attrs); 25 | mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop(); 26 | } 27 | 28 | // on Scroll Started 29 | @Override public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, View child, 30 | View directTargetChild, View target, int nestedScrollAxes) { 31 | 32 | return (nestedScrollAxes & ViewCompat.SCROLL_AXIS_VERTICAL) != 0; 33 | } 34 | 35 | @Override 36 | public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, View child, View target, 37 | int dx, int dy, int[] consumed) { 38 | onNestPreScrollInit(child); 39 | 40 | if (Math.abs(dy) > 2) { 41 | if (dy < 0) { 42 | if (mAnimateHelper.getState() == TranslateAnimateHelper.STATE_HIDE) { 43 | mAnimateHelper.show(); 44 | } 45 | } else if (dy > 0) { 46 | if (mAnimateHelper.getState() == TranslateAnimateHelper.STATE_SHOW) { 47 | mAnimateHelper.hide(); 48 | } 49 | } 50 | } 51 | } 52 | 53 | protected abstract void onNestPreScrollInit(View child); 54 | 55 | public void show() { 56 | mAnimateHelper.show(); 57 | } 58 | 59 | public void hide() { 60 | mAnimateHelper.hide(); 61 | } 62 | 63 | public static ByeBurgerBehavior from(View view) { 64 | ViewGroup.LayoutParams params = view.getLayoutParams(); 65 | if (!(params instanceof CoordinatorLayout.LayoutParams)) { 66 | throw new IllegalArgumentException("The view is not a child of CoordinatorLayout"); 67 | } 68 | CoordinatorLayout.Behavior behavior = ((CoordinatorLayout.LayoutParams) params).getBehavior(); 69 | if (!(behavior instanceof ByeBurgerBehavior)) { 70 | throw new IllegalArgumentException("The view is not associated with ByeBurgerBehavior"); 71 | } 72 | return (ByeBurgerBehavior) behavior; 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /library/src/main/java/com/wingsofts/byeburgernavigationview/ByeBurgerBottomBehavior.java: -------------------------------------------------------------------------------- 1 | package com.wingsofts.byeburgernavigationview; 2 | 3 | import android.content.Context; 4 | import android.support.design.widget.CoordinatorLayout; 5 | import android.support.v4.view.ViewCompat; 6 | import android.util.AttributeSet; 7 | import android.view.View; 8 | import android.view.ViewConfiguration; 9 | 10 | /** 11 | * Bye Bye Burger Navigation Bar Behavior 12 | * 13 | * Created by wing on 11/5/16. 14 | */ 15 | 16 | public class ByeBurgerBottomBehavior extends ByeBurgerBehavior { 17 | 18 | public ByeBurgerBottomBehavior(Context context, AttributeSet attrs) { 19 | super(context, attrs); 20 | } 21 | 22 | @Override public boolean layoutDependsOn(CoordinatorLayout parent, View child, View dependency) { 23 | 24 | 25 | return true; 26 | } 27 | 28 | @Override 29 | public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency) { 30 | if (canInit) { 31 | canInit = false; 32 | mAnimateHelper = TranslateAnimateHelper.get(child); 33 | mAnimateHelper.setStartY(child.getY()); 34 | mAnimateHelper.setMode(TranslateAnimateHelper.MODE_BOTTOM); 35 | } 36 | return super.onDependentViewChanged(parent, child, dependency); 37 | } 38 | 39 | 40 | 41 | @Override protected void onNestPreScrollInit(View child) { 42 | 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /library/src/main/java/com/wingsofts/byeburgernavigationview/ByeBurgerFloatButtonBehavior.java: -------------------------------------------------------------------------------- 1 | package com.wingsofts.byeburgernavigationview; 2 | 3 | import android.content.Context; 4 | import android.support.design.widget.CoordinatorLayout; 5 | import android.support.v4.view.ViewCompat; 6 | import android.util.AttributeSet; 7 | import android.view.View; 8 | import android.view.ViewConfiguration; 9 | 10 | /** 11 | * Behavior for Float Button 12 | * Created by wing on 11/8/16. 13 | */ 14 | 15 | public class ByeBurgerFloatButtonBehavior extends ByeBurgerBehavior { 16 | 17 | public ByeBurgerFloatButtonBehavior(Context context, AttributeSet attrs) { 18 | super(context, attrs); 19 | } 20 | 21 | @Override public boolean layoutDependsOn(CoordinatorLayout parent, View child, View dependency) { 22 | if(canInit) { 23 | mAnimateHelper = ScaleAnimateHelper.get(child); 24 | canInit = false; 25 | } 26 | return super.layoutDependsOn(parent, child, dependency); 27 | } 28 | 29 | 30 | @Override protected void onNestPreScrollInit(View child) { 31 | 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /library/src/main/java/com/wingsofts/byeburgernavigationview/ByeBurgerTitleBehavior.java: -------------------------------------------------------------------------------- 1 | package com.wingsofts.byeburgernavigationview; 2 | 3 | /** 4 | * Created by wing on 11/5/16. 5 | */ 6 | 7 | import android.content.Context; 8 | import android.support.design.widget.CoordinatorLayout; 9 | import android.support.v4.view.ViewCompat; 10 | import android.util.AttributeSet; 11 | import android.view.View; 12 | import android.view.ViewConfiguration; 13 | 14 | /** 15 | * Bye Bye Burger Android Title Bar Behavior 16 | * 17 | * Created by wing on 11/4/16. 18 | */ 19 | 20 | public class ByeBurgerTitleBehavior extends ByeBurgerBehavior { 21 | public ByeBurgerTitleBehavior(Context context, AttributeSet attrs) { 22 | super(context, attrs); 23 | } 24 | 25 | @Override public boolean layoutDependsOn(CoordinatorLayout parent, View child, View dependency) { 26 | if (canInit) { 27 | mAnimateHelper = TranslateAnimateHelper.get(child); 28 | canInit = false; 29 | } 30 | return super.layoutDependsOn(parent, child, dependency); 31 | } 32 | 33 | 34 | @Override protected void onNestPreScrollInit(View child) { 35 | 36 | if (isFirstMove) { 37 | isFirstMove = false; 38 | mAnimateHelper.setStartY(child.getY()); 39 | mAnimateHelper.setMode(TranslateAnimateHelper.MODE_TITLE); 40 | } 41 | } 42 | } 43 | 44 | -------------------------------------------------------------------------------- /library/src/main/java/com/wingsofts/byeburgernavigationview/ScaleAnimateHelper.java: -------------------------------------------------------------------------------- 1 | package com.wingsofts.byeburgernavigationview; 2 | 3 | import android.animation.ValueAnimator; 4 | import android.view.View; 5 | import android.view.animation.Animation; 6 | import android.view.animation.ScaleAnimation; 7 | 8 | /** 9 | * ScaleAnimateHelper using for float button 10 | * 11 | * Created by wing on 11/8/16. 12 | */ 13 | 14 | public class ScaleAnimateHelper implements AnimateHelper { 15 | 16 | public View mTarget; 17 | public int mCurrentState = STATE_SHOW; 18 | 19 | private ScaleAnimateHelper(View view) { 20 | mTarget = view; 21 | } 22 | 23 | public static ScaleAnimateHelper get(View view) { 24 | return new ScaleAnimateHelper(view); 25 | } 26 | 27 | @Override public void show() { 28 | ValueAnimator va = ValueAnimator.ofFloat(mTarget.getScaleX(), 1); 29 | va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 30 | @Override public void onAnimationUpdate(ValueAnimator valueAnimator) { 31 | float scale = (Float) valueAnimator.getAnimatedValue(); 32 | mTarget.setScaleX(scale); 33 | mTarget.setScaleY(scale); 34 | } 35 | }); 36 | va.setDuration(300); 37 | va.start(); 38 | 39 | mCurrentState = STATE_SHOW; 40 | } 41 | 42 | @Override public void hide() { 43 | ValueAnimator va = ValueAnimator.ofFloat(mTarget.getScaleX(), 0); 44 | va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 45 | @Override public void onAnimationUpdate(ValueAnimator valueAnimator) { 46 | float scale = (Float) valueAnimator.getAnimatedValue(); 47 | mTarget.setScaleX(scale); 48 | mTarget.setScaleY(scale); 49 | } 50 | }); 51 | va.setDuration(300); 52 | va.start(); 53 | mCurrentState = STATE_HIDE; 54 | } 55 | 56 | @Override public void setStartY(float y) { 57 | 58 | } 59 | 60 | @Override public void setMode(int modeBottom) { 61 | 62 | } 63 | 64 | public int getState() { 65 | return mCurrentState; 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /library/src/main/java/com/wingsofts/byeburgernavigationview/TranslateAnimateHelper.java: -------------------------------------------------------------------------------- 1 | package com.wingsofts.byeburgernavigationview; 2 | 3 | import android.animation.ValueAnimator; 4 | import android.support.design.widget.CoordinatorLayout; 5 | import android.view.View; 6 | import android.view.animation.TranslateAnimation; 7 | 8 | /** 9 | * A Animate Helper to control view's visibility 10 | * Created by wing on 11/5/16. 11 | */ 12 | 13 | public class TranslateAnimateHelper implements AnimateHelper { 14 | public View mTarget; 15 | public float mStartY; 16 | public int mCurrentState = STATE_SHOW; 17 | public int mMode = MODE_TITLE; 18 | public static int MODE_TITLE = 233; 19 | public static int MODE_BOTTOM = 2333; 20 | private float mFirstY = 0; 21 | private float mMargin; 22 | 23 | private TranslateAnimateHelper(View view) { 24 | mTarget = view; 25 | mFirstY = mTarget.getY(); 26 | mMargin = ((CoordinatorLayout.LayoutParams) mTarget.getLayoutParams()).topMargin 27 | + ((CoordinatorLayout.LayoutParams) mTarget.getLayoutParams()).bottomMargin; 28 | } 29 | 30 | public static TranslateAnimateHelper get(View target) { 31 | return new TranslateAnimateHelper(target); 32 | } 33 | 34 | public void show() { 35 | if (mMode == MODE_TITLE) { 36 | showTitle(); 37 | } else if (mMode == MODE_BOTTOM) { 38 | showBottom(); 39 | } 40 | } 41 | 42 | private void hideTitle() { 43 | ValueAnimator va = ValueAnimator.ofFloat(mTarget.getY(), -mTarget.getHeight()); 44 | va.setDuration(300); 45 | va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 46 | @Override public void onAnimationUpdate(ValueAnimator valueAnimator) { 47 | mTarget.setY((Float) valueAnimator.getAnimatedValue()); 48 | } 49 | }); 50 | va.start(); 51 | mCurrentState = STATE_HIDE; 52 | } 53 | 54 | private void showTitle() { 55 | 56 | ValueAnimator va = ValueAnimator.ofFloat(mTarget.getY(), 0); 57 | va.setDuration(300); 58 | va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 59 | @Override public void onAnimationUpdate(ValueAnimator valueAnimator) { 60 | mTarget.setY((Float) valueAnimator.getAnimatedValue()); 61 | } 62 | }); 63 | va.start(); 64 | mCurrentState = STATE_SHOW; 65 | } 66 | 67 | public void hide() { 68 | if (mMode == MODE_TITLE) { 69 | hideTitle(); 70 | } else if (mMode == MODE_BOTTOM) { 71 | hideBottom(); 72 | } 73 | } 74 | 75 | private void showBottom() { 76 | 77 | ValueAnimator va = ValueAnimator.ofFloat(mTarget.getY(), mFirstY); 78 | va.setDuration(300); 79 | va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 80 | @Override public void onAnimationUpdate(ValueAnimator valueAnimator) { 81 | mTarget.setY((Float) valueAnimator.getAnimatedValue()); 82 | } 83 | }); 84 | 85 | va.start(); 86 | mCurrentState = STATE_SHOW; 87 | } 88 | 89 | private void hideBottom() { 90 | ValueAnimator va = ValueAnimator.ofFloat(mTarget.getY(), mFirstY + mTarget.getHeight()+mMargin); 91 | va.setDuration(300); 92 | va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 93 | @Override public void onAnimationUpdate(ValueAnimator valueAnimator) { 94 | mTarget.setY((Float) valueAnimator.getAnimatedValue()); 95 | } 96 | }); 97 | 98 | va.start(); 99 | mCurrentState = STATE_HIDE; 100 | } 101 | 102 | public void setStartY(float y) { 103 | mStartY = y; 104 | } 105 | 106 | public int getState() { 107 | return mCurrentState; 108 | } 109 | 110 | public void setMode(int mode) { 111 | mMode = mode; 112 | } 113 | 114 | private void setState(int state) { 115 | mCurrentState = state; 116 | } 117 | } 118 | -------------------------------------------------------------------------------- /library/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | ByeBurgerNavigationView 3 | com.wingsofts.byeburgernavigationview.ByeBurgerFloatButtonBehavior 4 | 5 | com.wingsofts.byeburgernavigationview.ByeBurgerBottomBehavior 6 | com.wingsofts.byeburgernavigationview.ByeBurgerTitleBehavior 7 | 8 | 9 | -------------------------------------------------------------------------------- /library/src/test/java/com/wingsofts/byeburgernavigationview/ExampleUnitTest.java: -------------------------------------------------------------------------------- 1 | package com.wingsofts.byeburgernavigationview; 2 | 3 | import org.junit.Test; 4 | 5 | import static org.junit.Assert.*; 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * @see Testing documentation 11 | */ 12 | public class ExampleUnitTest { 13 | @Test public void addition_isCorrect() throws Exception { 14 | assertEquals(4, 2 + 2); 15 | } 16 | } -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app', ':library' 2 | --------------------------------------------------------------------------------