├── .gitignore ├── .travis.yml ├── README.md ├── build.gradle ├── demo.apk ├── demo ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── net │ │ └── wujingchao │ │ └── android │ │ └── demo │ │ └── ApplicationTest.java │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── net │ │ └── wujingchao │ │ └── android │ │ └── demo │ │ └── MainActivity.java │ └── res │ ├── drawable-hdpi │ ├── eff.jpeg │ ├── ent.jpg │ ├── ic_launcher.png │ ├── nuan1.jpg │ ├── nuan2.jpg │ └── qa.jpeg │ ├── drawable-mdpi │ └── ic_launcher.png │ ├── drawable-xhdpi │ └── ic_launcher.png │ ├── drawable-xxhdpi │ └── ic_launcher.png │ ├── drawable │ └── title_bar.xml │ ├── layout │ ├── activity_main.xml │ ├── background_view.xml │ └── image_item.xml │ ├── menu │ └── menu_main.xml │ ├── values-w820dp │ └── dimens.xml │ └── values │ ├── colors.xml │ ├── dimens.xml │ ├── strings.xml │ └── styles.xml ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── multi-card-menu ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── net │ │ └── wujingchao │ │ └── android │ │ └── demo │ │ └── ApplicationTest.java │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── net │ │ └── wujingchao │ │ └── android │ │ └── view │ │ ├── DarkFrameLayout.java │ │ └── MultiCardMenu.java │ └── res │ ├── drawable-hdpi │ └── ic_launcher.png │ ├── drawable-mdpi │ └── ic_launcher.png │ ├── drawable-xhdpi │ └── ic_launcher.png │ ├── drawable-xxhdpi │ └── ic_launcher.png │ ├── layout │ └── multi_card_view_transparent_background_view.xml │ └── values │ ├── attr.xml │ └── strings.xml ├── multi_card_menu_demo.gif ├── multi_card_menu_demo_static.png └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | # built application files 2 | #*.apk 3 | *.ap_ 4 | 5 | # files for the dex VM 6 | *.dex 7 | *.iml 8 | 9 | # Java class files 10 | *.class 11 | 12 | # libs 13 | 14 | # generated files 15 | bin/ 16 | .idea/ 17 | .gradle/ 18 | gen/ 19 | target/ 20 | build/ 21 | 22 | # Local configuration file (sdk path, etc) 23 | local.properties 24 | 25 | # Eclipse project files 26 | .classpath 27 | .project 28 | 29 | # Mac os 30 | .DS_Store 31 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: android 2 | android: 3 | components: 4 | - build-tools-22.0.1 5 | 6 | 7 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![Build Status](https://travis-ci.org/wujingchao/MultiCardMenu.svg?branch=master)](https://travis-ci.org/wujingchao/MultiCardMenu) 2 | [![Android Gems](http://www.android-gems.com/badge/wujingchao/MultiCardMenu.svg?branch=master)](http://www.android-gems.com/lib/wujingchao/MultiCardMenu) 3 | 4 | # MultiCardMenu 5 | A multicard menu that can open and close with animation on android,require API level >= 11 6 | 7 | ## Demo 8 | 9 | Screenshot 10 | 11 | 12 |
13 |

14 | Screenshot 15 |

16 | 17 |
18 | 19 | ##Usage 20 | 21 | 34 | 35 | ....(Your ChildViews) 36 | 37 | 38 | 39 | License 40 | ------- 41 | MIT 42 | -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | buildscript { 3 | repositories { 4 | jcenter() 5 | maven { 6 | url 'https://maven.google.com/' 7 | name 'Google' 8 | } 9 | google() 10 | } 11 | dependencies { 12 | classpath 'com.android.tools.build:gradle:3.1.2' 13 | // NOTE: Do not place your application dependencies here; they belong 14 | // in the individual module build.gradle files 15 | } 16 | } 17 | 18 | allprojects { 19 | repositories { 20 | jcenter() 21 | maven { 22 | url 'https://maven.google.com/' 23 | name 'Google' 24 | } 25 | } 26 | } -------------------------------------------------------------------------------- /demo.apk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wujingchao/MultiCardMenu/65669909f6afe77b801b50a096c25c77a9d25af4/demo.apk -------------------------------------------------------------------------------- /demo/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /demo/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 26 5 | buildToolsVersion '27.0.3' 6 | 7 | defaultConfig { 8 | applicationId "net.wujingchao.android.view" 9 | minSdkVersion 14 10 | targetSdkVersion 26 11 | versionCode 1 12 | versionName "1.0" 13 | } 14 | buildTypes { 15 | release { 16 | minifyEnabled false 17 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 18 | } 19 | } 20 | } 21 | 22 | dependencies { 23 | implementation fileTree(dir: 'libs', include: ['*.jar']) 24 | implementation 'com.android.support:appcompat-v7:26.1.0' 25 | implementation project(':multi-card-menu') 26 | implementation 'com.android.support.constraint:constraint-layout:1.1.2' 27 | } 28 | -------------------------------------------------------------------------------- /demo/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 D:\Program Files (x86)\Android\android-studio\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 | -------------------------------------------------------------------------------- /demo/src/androidTest/java/net/wujingchao/android/demo/ApplicationTest.java: -------------------------------------------------------------------------------- 1 | package net.wujingchao.android.demo; 2 | 3 | import android.app.Application; 4 | import android.test.ApplicationTestCase; 5 | 6 | /** 7 | * Testing Fundamentals 8 | */ 9 | public class ApplicationTest extends ApplicationTestCase { 10 | public ApplicationTest() { 11 | super(Application.class); 12 | } 13 | } -------------------------------------------------------------------------------- /demo/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 10 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /demo/src/main/java/net/wujingchao/android/demo/MainActivity.java: -------------------------------------------------------------------------------- 1 | package net.wujingchao.android.demo; 2 | 3 | import android.app.Activity; 4 | import android.support.v4.view.PagerAdapter; 5 | import android.support.v4.view.ViewPager; 6 | import android.os.Bundle; 7 | import android.util.Log; 8 | import android.view.LayoutInflater; 9 | import android.view.View; 10 | import android.view.ViewGroup; 11 | import android.widget.ArrayAdapter; 12 | import android.widget.CheckBox; 13 | import android.widget.CompoundButton; 14 | import android.widget.ImageView; 15 | import android.widget.ListView; 16 | import android.widget.Toast; 17 | import net.wujingchao.android.view.MultiCardMenu; 18 | 19 | 20 | 21 | public class MainActivity extends Activity { 22 | 23 | private static final String TAG = "MainActivity"; 24 | 25 | MultiCardMenu mc; 26 | 27 | @Override 28 | protected void onCreate(Bundle savedInstanceState) { 29 | super.onCreate(savedInstanceState); 30 | setContentView(R.layout.activity_main); 31 | initView(); 32 | } 33 | 34 | private void initView() { 35 | mc = (MultiCardMenu) findViewById(R.id.multi_card_menu); 36 | mc.setOnDisplayOrHideListener(new MultiCardMenu.OnDisplayOrHideListener() { 37 | @Override 38 | public void onDisplay(int which) { 39 | Log.d(TAG,"onDisplay:" + which); 40 | } 41 | 42 | @Override 43 | public void onHide(int which) { 44 | Log.d(TAG, "onHide:" + which); 45 | } 46 | 47 | @Override 48 | public void onTouchCard(int which) { 49 | Log.d(TAG,"onTouchCard:" + which); 50 | } 51 | }); 52 | CheckBox fade = (CheckBox) findViewById(R.id.fade); 53 | fade.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 54 | @Override 55 | public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 56 | mc.setFade(isChecked); 57 | } 58 | }); 59 | CheckBox boundary = (CheckBox) findViewById(R.id.boundary); 60 | boundary.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 61 | @Override 62 | public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 63 | mc.setBoundary(isChecked); 64 | } 65 | }); 66 | // int [] imgRes = {R.drawable.ent,R.drawable.qa}; 67 | final int [] imgRes = {R.drawable.nuan1,R.drawable.nuan2,R.drawable.ic_launcher, 68 | R.drawable.qa,R.drawable.ent,R.drawable.nuan1,R.drawable.nuan2,R.drawable.ic_launcher, 69 | R.drawable.qa,R.drawable.ent,R.drawable.nuan1,R.drawable.nuan2,R.drawable.ic_launcher, 70 | R.drawable.qa,R.drawable.ent}; 71 | final ViewPager mViewPager = (ViewPager) findViewById(R.id.view_pager); 72 | mViewPager.setOffscreenPageLimit(imgRes.length); 73 | mViewPager.setAdapter(new PagerAdapter() { 74 | @Override 75 | public int getCount() { 76 | return imgRes.length; 77 | } 78 | 79 | @Override 80 | public boolean isViewFromObject(View view, Object object) { 81 | return view == object; 82 | } 83 | 84 | @Override 85 | public void destroyItem(ViewGroup container, int position, Object object) { 86 | mViewPager.removeView((View) object); 87 | } 88 | 89 | @Override 90 | public Object instantiateItem(ViewGroup container, int position) { 91 | ImageView imageView = new ImageView(MainActivity.this); 92 | imageView.setImageResource(imgRes[position]); 93 | container.addView(imageView); 94 | return imageView; 95 | } 96 | }); 97 | 98 | 99 | ListView listView = (ListView) findViewById(R.id.lv); 100 | listView.setAdapter(new ArrayAdapter<>(this,android.R.layout.simple_list_item_1,data)); 101 | 102 | } 103 | 104 | String data [] = {"mother" , 105 | "passion ", 106 | "smile " , 107 | "love " , 108 | "eternity " , 109 | "fantastic " , 110 | "destiny " , 111 | "freedom " , 112 | "liberty " , 113 | "tranquility " , 114 | "peace " , 115 | "blossom " , 116 | "sunshine " , 117 | "sweetheart " , 118 | "gorgeous " , 119 | "cherish " , 120 | "enthusiasm" , 121 | "hope " , 122 | "grace " , 123 | "rainbow " , 124 | "blue " , 125 | "sunflower " , 126 | "twinkle " , 127 | "serendipity" , 128 | "bliss " , 129 | "lullaby " , 130 | "sophisticated " , 131 | "renaissance " , 132 | "cute " , 133 | "cosy ", 134 | "butterfly ", 135 | "galaxy ", 136 | "hilarious ", 137 | "moment", 138 | "extravaganza ", 139 | "aqua ", 140 | "sentiment ", 141 | "cosmopolitan ", 142 | "bubble ", 143 | "pumpkin", 144 | "banana", 145 | "lollipop ", 146 | "if  ", 147 | "bumblebee ", 148 | "giggle ", 149 | "paradox ", 150 | "peek-a-boo ", 151 | "umbrella ", 152 | "kangaroo ", 153 | "flabbergasted" , 154 | "hippopotamus ", 155 | "gothic ", 156 | "coconut ", 157 | "smashing ", 158 | "whoops ", 159 | "tickle ", 160 | "loquacious ", 161 | "flip-flop ", 162 | "smithereens", 163 | "hi" , 164 | "gazebo", 165 | "hiccup", 166 | "hodgepodge" , 167 | "shipshape", 168 | "explosion" , 169 | "fuselage", 170 | "zing", 171 | "gum", 172 | "hen-night "}; 173 | 174 | public void hide(View view) { 175 | mc.hide(mc.getDisplayingCard()); 176 | } 177 | 178 | @Override 179 | public void onBackPressed() { 180 | if(mc.isDisplaying()) { 181 | mc.hide(mc.getDisplayingCard()); 182 | }else { 183 | super.onBackPressed(); 184 | } 185 | } 186 | 187 | public void blue(View view) { 188 | Toast.makeText(this,"Blue",Toast.LENGTH_SHORT).show(); 189 | } 190 | 191 | public void fail(View view) { 192 | Toast.makeText(this,"Fail",Toast.LENGTH_SHORT).show(); 193 | } 194 | 195 | public void one(View view) { 196 | mc.show(0); 197 | } 198 | 199 | public void two(View view) { 200 | mc.show(1); 201 | } 202 | 203 | public void three(View view) { 204 | mc.show(2); 205 | } 206 | 207 | public void four(View view) { 208 | mc.show(3); 209 | } 210 | 211 | } 212 | -------------------------------------------------------------------------------- /demo/src/main/res/drawable-hdpi/eff.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wujingchao/MultiCardMenu/65669909f6afe77b801b50a096c25c77a9d25af4/demo/src/main/res/drawable-hdpi/eff.jpeg -------------------------------------------------------------------------------- /demo/src/main/res/drawable-hdpi/ent.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wujingchao/MultiCardMenu/65669909f6afe77b801b50a096c25c77a9d25af4/demo/src/main/res/drawable-hdpi/ent.jpg -------------------------------------------------------------------------------- /demo/src/main/res/drawable-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wujingchao/MultiCardMenu/65669909f6afe77b801b50a096c25c77a9d25af4/demo/src/main/res/drawable-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /demo/src/main/res/drawable-hdpi/nuan1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wujingchao/MultiCardMenu/65669909f6afe77b801b50a096c25c77a9d25af4/demo/src/main/res/drawable-hdpi/nuan1.jpg -------------------------------------------------------------------------------- /demo/src/main/res/drawable-hdpi/nuan2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wujingchao/MultiCardMenu/65669909f6afe77b801b50a096c25c77a9d25af4/demo/src/main/res/drawable-hdpi/nuan2.jpg -------------------------------------------------------------------------------- /demo/src/main/res/drawable-hdpi/qa.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wujingchao/MultiCardMenu/65669909f6afe77b801b50a096c25c77a9d25af4/demo/src/main/res/drawable-hdpi/qa.jpeg -------------------------------------------------------------------------------- /demo/src/main/res/drawable-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wujingchao/MultiCardMenu/65669909f6afe77b801b50a096c25c77a9d25af4/demo/src/main/res/drawable-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /demo/src/main/res/drawable-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wujingchao/MultiCardMenu/65669909f6afe77b801b50a096c25c77a9d25af4/demo/src/main/res/drawable-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /demo/src/main/res/drawable-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wujingchao/MultiCardMenu/65669909f6afe77b801b50a096c25c77a9d25af4/demo/src/main/res/drawable-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /demo/src/main/res/drawable/title_bar.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /demo/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 4 | 14 | 15 | 16 | 20 | 21 | 31 | 32 | 35 | 36 | 41 | 42 | 51 | 52 | 61 | 62 | 71 | 72 | 81 | 82 | 91 | 92 | 101 | 102 | 111 | 112 | 121 | 122 | 131 | 132 | 141 | 142 | 151 | 152 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 171 | 172 | 182 | 183 | 187 | 188 | 189 | 190 |