material_materials - CSDN
精华内容
参与话题
  • 十大Material Design开源项目

    万次阅读 2014-11-26 17:22:32
    摘要:本文详细介绍了十个Material Design开源项目,从示例、FAB、菜单、动画、Ripple到Dialog,看被誉为“Google第一次在设计语言和规范上超越了Apple”的Material Design是如何逐渐成为App的一种全新设计标准。...
    
    摘要:本文详细介绍了十个Material Design开源项目,从示例、FAB、菜单、动画、Ripple到Dialog,看被誉为“Google第一次在设计语言和规范上超越了Apple”的Material Design是如何逐渐成为App的一种全新设计标准。

    介于拟物和扁平之间的Material Design自面世以来,便引起了很多人的关注与思考,就此产生的讨论也不绝于耳。本文详细介绍了在Android开发者圈子里颇受青睐的十个Material Design开源项目,从示例、FAB、菜单、动画、Ripple到Dialog,看被称为“Google第一次在设计语言和规范上超越了Apple”的Material Design是如何逐渐成为App的一种全新设计标准。

    1. MaterialDesignLibrary

    在众多新晋库中,MaterialDesignLibrary可以说是颇受开发者瞩目的一个控件效果库,能够让开发者在Android 2.2系统上使用Android 5.0才支持的控件效果,比如扁平、矩形、浮动按钮,复选框以及各式各样的进度指示器等。


    除上述之外,MaterialDesignLibrary还拥有SnackBar、Dialog、Color selector组件,可非常便捷地对应用界面进行设置。

    进度指示器样式效果设置:

    1. <com.gc.materialdesign.views.ProgressBarCircularIndetermininate    
    2.                 android:id="@+id/progressBarCircularIndetermininate"    
    3.                 android:layout_width="32dp"    
    4.                 android:layout_height="32dp"    
    5.                 android:background="#1E88E5" />  
    Dialog:

    1. Dialog dialog = new Dialog(Context context,String title, String message);  
    2. dialog.show();  
    Dialog dialog = new Dialog(Context context,String title, String message);
    dialog.show();

    相关链接:MaterialDesignLibrary的mobilehub主页

    2. RippleEffect

    由来自法兰西的Robin Chutaux开发的RippleEffect基于MIT许可协议开源,能够在Android API 9+上实现Material Design,为开发者提供了一种极为简易的方式来创建带有可扩展视图的header视图,并且允许最大程度上的自定制。


    用法(在XML文件中声明一个RippleView):

    1. <com.andexert.library.RippleView  
    2.   android:id="@+id/more"  
    3.   android:layout_width="?android:actionBarSize"  
    4.   android:layout_height="?android:actionBarSize"  
    5.   android:layout_toLeftOf="@+id/more2"  
    6.   android:layout_margin="5dp"  
    7.   ripple:rv_centered="true">  
    8.   
    9.   <ImageView  
    10.     android:layout_width="?android:actionBarSize"  
    11.     android:layout_height="?android:actionBarSize"  
    12.     android:src="@android:drawable/ic_menu_edit"  
    13.     android:layout_centerInParent="true"  
    14.     android:padding="10dp"  
    15.     android:background="@android:color/holo_blue_dark"/>  
    16.   
    17. </com.andexert.library.RippleView>  

    相关链接:RippleEffect的mobilehub主页

    3. MaterialEditText

    随着Material Design的到来,AppCompat v21也为开发者提供了Material Design的控件外观支持,其中就包括EditText,但却并不好用,没有设置颜色的API,也没有任何Google Material Design Spec中提到的特性。于是,来自国内的开发者“扔物线”开发了MaterialEditText库,直接继承EditText,无需修改Java文件即能实现自定义控件颜色。


    自定义Base Color:

    1. app:baseColor="#0056d3"  


    自定义Error Color:

    1. app:maxCharacters="10"  
    2. app:errorColor="#ddaa00"  


    相关链接:MaterialEditText的mobilehub主页

    4. Android-LollipopShowcase

    Android-LollipopShowcase是由来自奥地利的移动、后端及Web开发者Mike Penz所开发的演示应用,集中演示了新Material Design中所有的UI效果,以及Android Lollipop中其他非常酷炫的特性元素,比如Toolbar、RecyclerView、ActionBarDrawerToggle、Floating Action Button(FAB)、Android Compat Theme等。


    相关链接:Android-LollipopShowcase的mobilehub主页

    5. MaterialList

    MaterialList是一个能够帮助所有Android开发者获取谷歌UI设计规范中新增的CardView(卡片视图)的开源库,支持Android 2.3+系统。作为ListView的扩展,MaterialList可以接收、存储卡片列表,并根据它们的Android风格和设计模式进行展示。此外,开发者还可以创建专属于自己的卡片布局,并轻松将其添加到CardList中。

    使用过程代码,在布局中声明MaterialListView:

    1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    2.     android:layout_width="match_parent"  
    3.     android:layout_height="match_parent"  
    4.     android:paddingLeft="@dimen/activity_horizontal_margin"  
    5.     android:paddingRight="@dimen/activity_horizontal_margin"  
    6.     android:paddingTop="@dimen/activity_vertical_margin"  
    7.     android:paddingBottom="@dimen/activity_vertical_margin">  
    8.   
    9.     <com.dexafree.materiallistviewexample.view.MaterialListView  
    10.         android:layout_width="fill_parent"  
    11.         android:layout_height="fill_parent"  
    12.         android:id="@+id/material_listview"/>  
    13.   
    14. </RelativeLayout>  

    相关链接:MaterialList的mobilehub主页

    6. android-floating-action-button

    Floating Action Button(FAB)是众多专家大牛针对Material Design讨论比较细化的一个点,通过圆形元素与分割线、卡片、各种Bar的直线形成鲜明对比,并使用色彩设定中鲜艳的辅色,带来更具突破性的视觉效果。也正因如此,在Github上,有着许多与FAB相关的开源项目,基于Material Design规范的开源Android浮动Action Button控件android-floating-action-button便是其中之一。

     

    其主要特性如下:

    • 支持常规56dp和最小40dp的按钮;
    • 支持自定义正常、Press状态以及可拖拽图标的按钮背景颜色;
    • AddFloatingActionButton类能够让开发者非常方便地直接在代码中写入加号图标;
    • FloatingActionsMenu类支持展开/折叠显示动作。

    相关链接:android-floating-action-button的mobilehub主页

    7. android-ui

    android-ui是Android UI组件类库,支持Android API 14+,包含了ActionView、RevealColorView等UI组件。其中,ActionView可使Action动作显示动画效果,而RevealColorView则带来了Android 5.0中的圆形显示/隐藏动画体验。


    相关链接:android-ui的mobilehub主页

    8. Material Menu

    Material Menu为开发者带来了非常酷炫的Android菜单、返回、删除以及检查按钮变形,完全控制动画,并为开发者提供了两种MaterialMenuDrawable包装。


    自定义颜色等操作:

    1. // change color  
    2. MaterialMenu.setColor(int color)  
    3.   
    4. // change transformation animation duration  
    5. MaterialMenu.setTransformationDuration(int duration)  
    6.   
    7. // change pressed animation duration  
    8. MaterialMenu.setPressedDuration(int duration)  
    9.   
    10. // change transformation interpolator  
    11. MaterialMenu.setInterpolator(Interpolator interpolator)  
    12.   
    13. // set RTL layout support  
    14. MaterialMenu.setRTLEnabled(boolean enabled)  
    // change color
    MaterialMenu.setColor(int color)
    
    // change transformation animation duration
    MaterialMenu.setTransformationDuration(int duration)
    
    // change pressed animation duration
    MaterialMenu.setPressedDuration(int duration)
    
    // change transformation interpolator
    MaterialMenu.setInterpolator(Interpolator interpolator)
    
    // set RTL layout support
    MaterialMenu.setRTLEnabled(boolean enabled)

    相关链接:Material Menu的mobilehub主页

    9. Android-ObservableScrollView

    Android-ObservableScrollView是一款用于在滚动视图中观测滚动事件的Android库。它能够轻而易举地与Android 5.0 Lollipop引进的工具栏(Toolbar)进行交互,还可以帮助开发者实现拥有Material Design应用视觉体验的界面外观,支持ListView、ScrollView、WebView、RecyclerView、GridView组件。


    交互代码回调:

    1. @Override  
    2.     public void onUpOrCancelMotionEvent(ScrollState scrollState) {  
    3.         ActionBar ab = getSupportActionBar();  
    4.         if (scrollState == ScrollState.UP) {  
    5.             if (ab.isShowing()) {  
    6.                 ab.hide();  
    7.             }  
    8.         } else if (scrollState == ScrollState.DOWN) {  
    9.             if (!ab.isShowing()) {  
    10.                 ab.show();  
    11.             }  
    12.         }  
    13.     }  
    @Override
        public void onUpOrCancelMotionEvent(ScrollState scrollState) {
            ActionBar ab = getSupportActionBar();
            if (scrollState == ScrollState.UP) {
                if (ab.isShowing()) {
                    ab.hide();
                }
            } else if (scrollState == ScrollState.DOWN) {
                if (!ab.isShowing()) {
                    ab.show();
                }
            }
        }

    相关链接:Android-ObservableScrollView的mobilehub主页

    10. Material Design Icons

    最后,再来介绍一下Google Material Design规范的官方开源图标集Material Design Icons。良心Google开源了包括Material Design系统图标包在内的750个字形,涵盖动作、音视频、通信、内容、编辑器、文件、硬件、图像、地图、导航、通知、社交等各个方面,适用于Web、Android和iOS应用开发,绝对是开发者及设计师必备的资源。


    图标格式主要包括: 

    • SVG格式,24px和48px;
    • SVG和CSS Sprites;
    • 适用于Web平台的1x、2x PNG格式图标;
    • 适用于iOS的1x、2x、3x PNG图标;
    • 所有图标的Hi-dpi版本(hdpi、mdpi、xhdpi、xxhdpi、xxxhdpi)。

    相关链接:Material Design Icons的mobilehub主页


    展开全文
  • Material Design-入门全套

    千次阅读 2018-05-09 14:05:24
    1.简介Material Design中文翻译:质感设计(材料设计)为什么要这个设计? 使手机屏幕中的UI更真实,效果更好.如何使用?使用Material Design的兼容函数库 Design Support Library,使用库中的控件.2.添加兼容函数库的...

    1.简介Material Design

    中文翻译:质感设计(材料设计)

    为什么要这个设计? 使手机屏幕中的UI更真实,效果更好.

    如何使用?使用Material Design的兼容函数库 Design Support Library,使用库中的控件.

    2.添加兼容函数库的依赖

    compile 'com.android.support:design:23.2.0'

    有的可能还需要添加v7的包:

    compile 'com.android.support:appcompat-v7:26.0.0-alpha1'

    3.Snackbar控件使用如下:

    public class MainActivity extends AppCompatActivity {
    
        LinearLayout linearLayout;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            Button snackerbar = (Button) findViewById(R.id.snackbar);
            linearLayout = (LinearLayout) findViewById(R.id.linearlayout);
    
            snackerbar.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    showSnackerbar();
                }
            });
        }
    
        private void showSnackerbar() {
            Snackbar.make(linearLayout , "标题" , Snackbar.LENGTH_LONG)//第一个参数为父布局
                    .setAction("点击事件", new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            Toast.makeText(MainActivity.this, "Toast", Toast.LENGTH_SHORT).show();
                        }
                    }).setDuration(Snackbar.LENGTH_LONG)
                    .show();
        }
    }
    

    4.TextInputLayout控件使用如下:

    主要作用: 作为editText的容器,当点击editText时,hint字符,自动移到editText的左上角。常用来做登录界面的帐号密码输入。

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/linearlayout"
        android:orientation="vertical">
    
        <android.support.design.widget.TextInputLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
            <EditText
                android:layout_width="match_parent"
                android:layout_height="wrap_content" 
                android:hint="username"/>
            
        </android.support.design.widget.TextInputLayout>
        
        <android.support.design.widget.TextInputLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
            <EditText
                
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="password"/>
            
        </android.support.design.widget.TextInputLayout>
    
    
    </LinearLayout>

    5.TabLayout控件使用如下:

    一般和ViewPager结合使用.

    布局如下:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/linearlayout"
        android:orientation="vertical">
        <android.support.design.widget.TabLayout
            android:id="@+id/tab1"
            android:background="#9732a60f"
            app:tabIndicatorColor="#9b1414"
    app:tabIndicatorHeight="5dp"
    app:tabTextColor=""    //Tab文本默认颜色
    app:tabSelectedTextColor=""     //Tab文本被选中后的颜色
    app:tabTextAppearance=""      //为Tab文本设置样式,一般是需要为Tab加图标时使用
    
            app:tabMode="scrollable"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"> <!--app:tabMode="scrollable"表示tab可滑动,fixed表示不可滑动-->
    
        </android.support.design.widget.TabLayout>
    
        <android.support.v4.view.ViewPager
            android:background="#9d717c53"
            android:id="@+id/viewpager1"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_behavior="@string/appbar_scrolling_view_behavior">
    
        </android.support.v4.view.ViewPager><!--app:layout_behavior与tablayout配合使用的必须要的-->
    
    </LinearLayout>

    代码使用如下:

    public class MainActivity extends AppCompatActivity {
        private ViewPager viewpager;
        private TabLayout tab;
    
        LinearLayout linearLayout;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            linearLayout = (LinearLayout) findViewById(R.id.linearlayout);
            tab = (TabLayout) findViewById(R.id.tab1);
            viewpager = (ViewPager) findViewById(R.id.viewpager1);
    
            List<String> tbs = new ArrayList<>();
            for (int i = 0; i < 10; i++) {
                tbs.add("内容" + i);
            }
            for (int i = 0; i < tbs.size(); i++) {
                tab.addTab(tab.newTab().setText(tbs.get(i)));
            }
    
            List<Fragment> fragments = new ArrayList<>();
            for (int i = 0; i < tbs.size(); i++) {
                Fragment1 f1 = new Fragment1();
                fragments.add(f1);
            }
    
    
            MyAdapter adapter = new MyAdapter(getSupportFragmentManager(), fragments, tbs);
            viewpager.setAdapter(adapter); //AAA:viewpager和tablayout使用一个adapter
            tab.setTabsFromPagerAdapter(adapter); //AAA:viewpager和tablayout使用一个adapter
            tab.setupWithViewPager(viewpager);//将tablayout与viewpager关联起来
    
        }
        
    }

    用到的fragment如下:

    public class Fragment1 extends Fragment {
    
        public Fragment1() {
            super();
        }
    
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            LayoutInflater i = LayoutInflater.from(getActivity());
            View f = i.inflate(R.layout.ff, null);
            final TextView tw = (TextView) f.findViewById(R.id.text1);
            Button dianjia = (Button) f.findViewById(R.id.dianji);
            dianjia.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    tw.setText("235253325235");
                }
            });
    
            return f;
    
        }
    }

    adapter如下:

    public class MyAdapter extends FragmentStatePagerAdapter {
        private List<Fragment> fragments;
        private List<String> titles;
    
        public MyAdapter(FragmentManager fm, List<Fragment> fragments, List<String> tbs) {
            super(fm);
            this.fragments = fragments;
            this.titles = tbs;
        }
    
        @Override
        public int getCount() {
            return fragments.size();
        }
    
        @Override
        public Fragment getItem(int position) {
            return fragments.get(position);
        }
    
        @Override
        public CharSequence getPageTitle(int position) {
            return titles.get(position);
        }
    }

    还有扩展部分:如tablayout中加图标,以后有时间再写文章总结.

    6.DrawerLayout侧滑布局控件的使用如下:

    <android.support.v4.widget.DrawerLayout
    
        id.drawelayout
        android:layout_height="match_parent"
        android:layout_width="match_parent">
        <LinearLayout 
        </LinearLayout>
        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_gravity="start"/></android.support.v4.widget.DrawerLayout>
    LinearLayout表示主页面布局
    android:layout_gravity="start"这一句表示要侧滑的布局,侧滑布局并不一定只限于textview,可以用Relativelayout,在里面可以放多个控件.

    代码打开侧滑如下:

    d = (DrawerLayout) findViewById(R.id.drawelayout);
    d.openDrawer(GravityCompat.START);

    7.NavigationView导航抽屉控件使用如下:

    和DrawerLayout控件一起使用,为侧滑布局设置抽屉式item菜单,和导航头部布局.

    layout代码如下:

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/activity_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true">
    
        <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:app="http://schemas.android.com/apk/res-auto"
            android:id="@+id/linearlayout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">
    
            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                android:background="#2caa3f">
    
            </android.support.v7.widget.Toolbar>
    
            <android.support.design.widget.TabLayout
                android:id="@+id/tablayout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:tabIndicatorColor="#9ca04848"
                app:tabMode="scrollable">
    
            </android.support.design.widget.TabLayout>
    
    
            <android.support.v4.view.ViewPager
                android:id="@+id/viewpager"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                app:layout_behavior="@string/appbar_scrolling_view_behavior">
    
            </android.support.v4.view.ViewPager>
    
        </LinearLayout>
    
        <android.support.design.widget.NavigationView
            android:id="@+id/navigation1"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            app:headerLayout="@layout/navigation_header"
            app:menu="@menu/drawer_view">
    
        </android.support.design.widget.NavigationView>
    
    
    </android.support.v4.widget.DrawerLayout>
    

    主要看NavigationView的设置:

    app:headerLayout :设置侧滑布局的头部布局

    app:menu :设置侧滑布局的抽屉式item菜单

    头布局如下:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal">
        <ImageView
            android:id="@+id/imageview"
            android:background="@mipmap/ic_launcher"
            android:layout_width="100dp"
            android:layout_height="100dp" />
    
        <TextView
            android:text="账户名"
            android:layout_marginLeft="20dp"
            android:layout_marginTop="40dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    
    </LinearLayout>

    item菜单如下:

    如果想要在group上下画上一条分割线:只要给group一个id就行了

    在res/menu文件下新建 xml文件:

    <?xml version="1.0" encoding="utf-8"?>
    <menu xmlns:android="http://schemas.android.com/apk/res/android">
        <group android:checkableBehavior="single"
            > <!--single表示只有一个能选中-->
            <item
            android:id="@+id/home"
            android:icon="@mipmap/ic_launcher"
            android:title="首页"
            />
            <item
                android:id="@+id/message"
                android:icon="@mipmap/ic_launcher"
                android:title="消息"
                />
            <item
                android:id="@+id/music"
                android:icon="@mipmap/ic_launcher"
                android:title="音乐"
                />
            <item
                android:id="@+id/discuss"
                android:icon="@mipmap/ic_launcher"
                android:title="讨论"
                />
        </group>
    
        <item android:title="其他">
            <menu>
                <item
                    android:title="设置"
                />
    
                <item
                    android:title="关于我们" />
    
            </menu>
        </item>
    
    </menu>

    代码使用如下:

    public class MainActivity extends AppCompatActivity {
        private DrawerLayout drawerLayout;
        private Toolbar toolbar;
        private TabLayout tabLayout;
        private ViewPager viewPager;
        private NavigationView navigationView;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            drawerLayout = (DrawerLayout) findViewById(R.id.activity_main);
            toolbar = (Toolbar) findViewById(R.id.toolbar);
            tabLayout = (TabLayout) findViewById(R.id.tablayout);
            viewPager = (ViewPager) findViewById(R.id.viewpager);
            navigationView = (NavigationView) findViewById(R.id.navigation1);
    
            toolbar.setTitle("我的自定义toolbar和navigation饿tablayout");
            setSupportActionBar(toolbar);
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);//在toolbar中设置导航按钮
    
    
            List<String> titles = new ArrayList<>();
            for (int i = 0 ; i < 5 ; i++){
                titles.add("内容" + i);
            }
            for (int i = 0 ; i <titles.size() ;i++){
                tabLayout.addTab(tabLayout.newTab().setText(titles.get(i)));
            }
            List<Fragment> fragments = new ArrayList<>();
            for (int i = 0 ; i< titles.size() ; i++){
                Fragment1 fragment1 = new Fragment1();
                fragments.add(fragment1);
            }
            Myadapter adapter = new Myadapter(getSupportFragmentManager() , fragments , titles);
            viewPager.setAdapter(adapter);
            tabLayout.setupWithViewPager(viewPager);
            tabLayout.setTabsFromPagerAdapter(adapter);
        }
    
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            switch (item.getItemId()){
                case android.R.id.home: //toolbar中导航按钮的固定id
                    Toast.makeText(this, "导航按钮", Toast.LENGTH_SHORT).show();
                    drawerLayout.openDrawer(GravityCompat.START);//点击导航按钮打开侧滑菜单
                default:
                    break;
            }
            return true;
        }
    
    }

    对侧滑布局的item菜单监听示例如下:

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        drawerLayout = (DrawerLayout) findViewById(R.id.activity_main);
        toolbar = (Toolbar) findViewById(R.id.toolbar);
        tabLayout = (TabLayout) findViewById(R.id.tablayout);
        viewPager = (ViewPager) findViewById(R.id.viewpager);
        navigationView = (NavigationView) findViewById(R.id.navigation1);
    
        navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(MenuItem item) {
                String title = item.getTitle().toString();
                Toast.makeText(MainActivity.this, title , Toast.LENGTH_SHORT).show();
                drawerLayout.closeDrawers();
                return true;
            }
        });}

    8.FloatingActionButton浮动按钮使用如下:

    什么时候使用? 在activity中需要一直显示的,要高频使用的,重要的操作.

    它继承自ImageView.


    <android.support.design.widget.FloatingActionButton
    
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:backgroundTint="#6e6b6b" //自己设置颜色,不然就是ColorAccent的颜色
        app:elevation="3dp"  //阴影默认为6dp
        app:pressedTranslationZ="6dp"/> //点击时的阴影默认为12dp
    app:rippleColor="" 可以设置波纹颜色 

    9.CoordinatorLayout使用如下:

    为什么要使用CoordinatorLayout布局控件?

    在使用一般布局时,弹出snackbar会挡住floatingactionbutton,但是使用了coordinatorlayout,则不会,当有snackbar弹出的时候,floatingactionbutton会自动往上移,snackbar消失时,floatingactionbutton自动往下移.

    <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/activity_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <FloatingActionButton
    
        />
    
    </android.support.design.widget.CoordinatorLayout>

    扩展:coordinatorlayout还可以自定义其包裹的视图之间的行为behavior,上面例子是默认的行为。以后有时间再写文章总结.

    10.BottomSheetBehavior使用如下:

    效果:在当前界面从下往上弹出一个界面,并且可滑动隐藏。如,支付宝支付界面

    主界面:

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <Button
            android:id="@+id/b1"
            android:text="改变bottom_sheet状态"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
        <Button
            android:id="@+id/b2"
            android:layout_marginTop="50dp"
            android:text="设置底部动作条能不能下滑隐藏"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    
        <!--向支付宝支付时一样,从下往上弹出界面-->
        <!-- include bottom sheet -->
        <include layout="@layout/bottom_sheet" /> <!--这里面就是底部动作条-->
    
    </android.support.design.widget.CoordinatorLayout>

    底部动作条界面:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/bottom_sheet"
        android:layout_width="match_parent"
        android:layout_height="340dp"
        android:background="@android:color/darker_gray"
        android:orientation="vertical"
        app:behavior_hideable="true"
        app:behavior_peekHeight="80dp"
        app:layout_behavior="android.support.design.widget.BottomSheetBehavior">
        <!--
        app:layout_behavior="android.support.design.widget.BottomSheetBehavior"
        主要就是该属性的引入,变成底部动作条
        -->
        <!--
        app:behavior_peekHeight="80dp" //定义底部动作条的可见高度,这里正好是第一个textview的高度
        app:behavior_hideable //定义是否可以下滑隐藏底部动作条
    
        -->
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="80dp"
            android:background="@color/colorAccent"
            android:gravity="center"
            android:text="bottom_sheet_peek"
            android:textColor="@android:color/white" />
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center"
            android:text="bottom_sheet_content"
            android:textColor="@android:color/white" />
    
    </LinearLayout>

    控制如下:

    public class MainActivity extends AppCompatActivity {
        Button b1;
        Button b2;
        BottomSheetBehavior bottomSheetBehavior;
        int i = 0;
    
        int j = 0;
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            b1 = (Button) findViewById(R.id.b1);
            b2 = (Button) findViewById(R.id.b2);
    
            View bottomSheet = findViewById(R.id.bottom_sheet);
            bottomSheetBehavior = BottomSheetBehavior.from(bottomSheet);
    
            //改变底部动作条的状态
    //        bottomSheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
    //        bottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED);
    //        bottomSheetBehavior.setState(BottomSheetBehavior.STATE_HIDDEN);
    
            //设置底部动作条显示高度
            //bottomSheetBehavior.setPeekHeight(340);
    
            //定义是否可以下滑隐藏底部动作条
            b2.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (i == 0) {
                        bottomSheetBehavior.setHideable(false);
                        i = 1;
                    } else if (i == 1){
                        bottomSheetBehavior.setHideable(true);
                        i = 0;
                    }
                }
            });
    
            //回调监听
            bottomSheetBehavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
                @Override
                public void onStateChanged(@NonNull View bottomSheet, int newState) {
                    Log.i("mydate" , "onStateChanged : " + newState);
                    Log.i("mydate" , "\n");
                }
    
                @Override
                public void onSlide(@NonNull View bottomSheet, float slideOffset) {
                    Log.i("mydate" , "onslide : " + slideOffset);
                    Log.i("mydate" , "\n");
                }
            });
    
        }
    
    }

    11.还有其他的或补充的,以后补充


    展开全文
  • IDEA插件之颜值篇Material Theme UI

    万次阅读 多人点赞 2020-03-30 23:22:27
    今天推荐一个IDEA颜值类插件:Material Theme UI 大致效果 安装方式 IDEA插件官网地址:https://plugins.jetbrains.com/plugin/8006-material-theme-ui GITHUB地址:https://github.com/C...

    俗话说,工欲善其事必先利其器。

    工具的颜值也很重要,好的主题让人赏心悦目,有码代码的欲望。

    今天推荐一个IDEA颜值类插件:Material Theme UI

    大致效果

    laptop-full.png (2388Ã1320)

    screenshot_17526.png (2880Ã1759)

    安装方式

    IDEA插件官网地址:https://plugins.jetbrains.com/plugin/8006-material-theme-ui

    GITHUB地址:https://github.com/ChrisRM/material-theme-jetbrains

     

    我认为最便捷的安装方式应该是从IDEA设置--->插件选项中在线搜索:

    最新版本的截图如下,前面的版本可能需要选择"browser repositories"按钮进行搜索。

    安装后 重启IDEA,重启后设置自己喜欢的首选主题。

     

    这里我选择第一项,Oceanic

    然后选择对比模式

     

    然后选择增强的颜色默认是红色,我设置的是800080(紫色)。

    然后就是一些杂项,可以默认即可,然后完成后就可以体验了。

     

    后面还可以进行调整

     

     

    可以在这里调整字体、大小、行间距等:

     

    超赞插件推荐:https://blog.csdn.net/w605283073/article/details/103266294

    超实用IDEA 插件推荐:https://blog.csdn.net/w605283073/article/details/89163627

    如果觉得本文对你有帮助,欢迎点赞评论,欢迎关注我,我将努力创作更多更好的文章。

     

    展开全文
  • 开源项目material-dialogs使用

    万次阅读 热门讨论 2016-12-12 09:06:01
    之前浏览github的时候发现一个比较好用的...Github地址:https://github.com/afollestad/material-dialogs导入compile 'com.afollestad.material-dialogs:core:0.9.1.0' compile 'com.afollestad.material-dialogs:com

    之前浏览github的时候发现一个比较好用的MD风格的Dialog。这里记录一下使用。
    Github地址:https://github.com/afollestad/material-dialogs

    这里写图片描述

    导入

    compile 'com.afollestad.material-dialogs:core:0.9.1.0'
    compile 'com.afollestad.material-dialogs:commons:0.9.1.0'

    具体的使用

    • Basic Dialog

    简单的dialog

                     new MaterialDialog.Builder(MainActivity.this)
                                    .title("basic dialog")
                                    .content("一个简单的dialog,高度会随着内容改变,同时还可以嵌套RecyleView")
                                    .iconRes(R.drawable.icon)
                                    .positiveText("同意")
                                    .negativeText("不同意")
                                    .neutralText("更多信息")
                                    .widgetColor(Color.BLUE)//不再提醒的checkbox 颜色
                                    //CheckBox
                                    .checkBoxPrompt("不再提醒", false, new CompoundButton.OnCheckedChangeListener(){
                                        @Override
                                        public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
                                            if (b) {
                                                Toast.makeText(MainActivity.this, "不再提醒", Toast.LENGTH_LONG).show();
                                            } else {
                                                Toast.makeText(MainActivity.this, "会再次提醒", Toast.LENGTH_LONG).show();
                                            }
                                        }
                                    })
                                    //嵌套recycleview,这个的点击事件可以先获取此Recycleview对象然后自己处理
                                    .adapter(new RecycleviewAdapter(getData(), MainActivity.this), new LinearLayoutManager(MainActivity.this))
    
    
                                    .itemsCallback(new MaterialDialog.ListCallback() {
                                        @Override
                                        public void onSelection(MaterialDialog dialog, View itemView, int position, CharSequence text) {
                                            dataChoose = "下标:" + position + " and 数据:" + mData.get(position);
                                        }
                                    })
    
                                    //点击事件添加 方式1
                                    .onAny(new MaterialDialog.SingleButtonCallback() {
                                        @Override
                                        public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
                                            if (which == DialogAction.NEUTRAL) {
                                                Toast.makeText(MainActivity.this, "更多信息", Toast.LENGTH_LONG).show();
                                            } else if (which == DialogAction.POSITIVE) {
                                                Toast.makeText(MainActivity.this, "同意" + dataChoose, Toast.LENGTH_LONG).show();
                                            } else if (which == DialogAction.NEGATIVE) {
                                                Toast.makeText(MainActivity.this, "不同意", Toast.LENGTH_LONG).show();
                                            }
    
                                        }
                                    })
                                    .show();

    相应的效果:
    简单的diaolog,同意和不同意的字体颜色是默认是R.color.colorAccent

    这里写图片描述

    文本变多的时候会自动拉长高度

    这里写图片描述

    嵌套一个recycleview,这个的点击事件可以先获取此Recycleview对象然后自己处理

      .adapter(new RecycleviewAdapter(getData(), MainActivity.this), new LinearLayoutManager(MainActivity.this))
    
    //
    RecycleView rc=  dialog.getRecyclerView();

    这里写图片描述

    这里添加一个更多信息的按钮

     .neutralText("更多信息")

    这里写图片描述

    点击事件

    • 方式一
     .onAny(new MaterialDialog.SingleButtonCallback() {
             @Override
             public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
                   if (which == DialogAction.NEUTRAL) {
                        Toast.makeText(MainActivity.this, "更多信息", Toast.LENGTH_LONG).show();
                      } else if (which == DialogAction.POSITIVE) {
                        Toast.makeText(MainActivity.this, "同意" + dataChoose, Toast.LENGTH_LONG).show();
                      } else if (which == DialogAction.NEGATIVE) {
                        Toast.makeText(MainActivity.this, "不同意", Toast.LENGTH_LONG).show();
                       }
    
               }
     })
      public Builder onAny(@NonNull SingleButtonCallback callback) {
                this.onAnyCallback = callback;
                return this;
            }
    
      public interface SingleButtonCallback {
    
            void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which);
        }
    
    public enum DialogAction {
        POSITIVE,
        NEUTRAL,
        NEGATIVE
    }
    

    就是传一个SingleButtonCallback 接口,用DialogAction 来区分现在是那个Action 请求,然后对应的处理

    • 方式二
    
                                 .onPositive(new MaterialDialog.SingleButtonCallback() {
                                        @Override
                                        public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
                                            Toast.makeText(MainActivity.this,"同意",Toast.LENGTH_LONG).show();
                                        }
                                    })
    //.onNegative()
    //.onNeutral()
    

    单个按钮添加监听和onAny 其实一样

    • 方式三

    这个方法已经过时了

    .callback(new MaterialDialog.ButtonCallback() {//添加按钮点击监听
          @Override
          public void onPositive(MaterialDialog dialog) {
             super.onPositive(dialog);
             Toast.makeText(MainActivity.this,"同意",Toast.LENGTH_LONG).show();
             }
    
          @Override
          public void onNegative(MaterialDialog dialog) {
              super.onNegative(dialog);
              Toast.makeText(MainActivity.this,"不同意",Toast.LENGTH_LONG).show();
             }
    
          @Override
          public void onNeutral(MaterialDialog dialog) {
            super.onNeutral(dialog);
          Toast.makeText(MainActivity.this,"更多信息",Toast.LENGTH_LONG).show();
             }
       })

    添加checkbox

     .checkBoxPrompt("不再提醒", false, new CompoundButton.OnCheckedChangeListener() {//check事件
          @Override
         public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
           if (b) {
                  Toast.makeText(MainActivity.this, "不再提醒", Toast.LENGTH_LONG).show();
                   } else {
                     Toast.makeText(MainActivity.this, "会再次提醒", Toast.LENGTH_LONG).show();
                   }
            }
        })

    这里写图片描述

    • 颜色修改
      .widgetColor(Color.BLUE)

    这里写图片描述

    其他属性介绍

     .btnSelector(R.color.colorPrimary)//按钮的背景颜色
       //分开设置2个按钮的背景颜色
    //  .btnSelector(R.color.colorPrimary, DialogAction.NEGATIVE)
    //  .btnSelector(R.color.colorPrimaryDark, DialogAction.POSITIVE)
    //  .btnSelector(R.color.colorPrimary,DialogAction.NEUTRAL)
    //  .backgroundColor(Color.parseColor("#FF9988"))//dialog的背景颜色
    //  .contentColor(Color.WHITE)//内容字体的颜色
    • List Dialogs

    列表弹框,.item ()来添加类别内容,也可以是

     .items(new String[]{"AAAA","BBBBB","CCCCC","DDDDDDDD","EEEEE","FFFFFF","GGGGGG","HHHHHHH"})
         new MaterialDialog.Builder(MainActivity.this)
                            .title("List Dialog")
                            .iconRes(R.drawable.ic_logo)
                            .content("List Dialog,显示数组信息,高度会随着内容扩大")                           
                            .items(R.array.item)
                          //.listSelector(R.color.green)//列表的背景颜色
                            .autoDismiss(false)//不自动消失
                            .show();

    这里写图片描述

    • 列表点击事件
       .itemsCallback(new MaterialDialog.ListCallback() {//选中监听,同时dialog消失
               @Override
               public void onSelection(MaterialDialog dialog, View itemView, int position, CharSequence text) {
                 dataChoose += "下标:" + position + " and 数据:" + text;
                 Toast.makeText(MainActivity.this, dataChoose, Toast.LENGTH_LONG).show();
           }
      })
    • 添加单选
      //单选
           .itemsCallbackSingleChoice(-1, new MaterialDialog.ListCallbackSingleChoice() {//0 表示第一个选中 -1 不选
                @Override
         public boolean onSelection(MaterialDialog dialog, View itemView, int which, CharSequence text) {
                    dataChoose="此时选中的下标"+which;
                    Toast.makeText(MainActivity.this,dataChoose,Toast.LENGTH_LONG).show();
                           return true;
           }
       })
    • Multi Choice List Dialogs

    多选dialog

                         new MaterialDialog.Builder(MainActivity.this)
                                    .title("Multi Choice List Dialogs")
                                    .iconRes(R.drawable.ic_logo)
                                    .content("Multi Choice List Dialogs,显示数组信息,高度会随着内容扩大.可以多选")
                                    .items(R.array.item)
                                    .positiveText("确定")
                                    .widgetColor(Color.RED)//改变checkbox的颜色
                                    //多选框添加
                                    .itemsCallbackMultiChoice(null, new MaterialDialog.ListCallbackMultiChoice() {
                                        @Override
                                        public boolean onSelection(MaterialDialog dialog, Integer[] which, CharSequence[] text) {
    
                                            return true;//false 的时候没有选中样式
                                        }
                                    })
                                    //点击确定后获取选中的下标数组
                                    .onPositive(new MaterialDialog.SingleButtonCallback() {
                                        @Override
                                        public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
                                            dialog.dismiss();
                                            Toast.makeText(MainActivity.this, "选中" + dialog.getSelectedIndices().length + "个", Toast.LENGTH_LONG).show();
                                        }
                                    })
                                    .show();

    这里写图片描述

    这里有一个itemsCallbackMultiChoice()他的返回结果决定了checkbox 是否有选中和取消的效果。

    • Custom Views

    可以引入外部view的dialog

        new MaterialDialog.Builder(MainActivity.this)
        .customView(R.layout.custome_view,false)
        .show();             

    效果:
    这里写图片描述

    customView( int layoutRes, boolean wrapInScrollView)
    当我们将wrapInScrollView设置为true的时候就表示需要一个padding

    这里写图片描述

    假设布局中有个按钮我们要点击这个按钮关闭dialog可以这样操作

    这里写图片描述

    
                            final MaterialDialog dialog = new MaterialDialog.Builder(MainActivity.this)
                                    .customView(R.layout.custome_view, false)
                                    .show();
                            View customeView = dialog.getCustomView();
    
                            Button button = (Button) customeView.findViewById(R.id.btn_closeCustome);
                            button.setOnClickListener(new View.OnClickListener() {
                                @Override
                                public void onClick(View view) {
                                    dialog.dismiss();
                                }
                            });
    • Input Dialogs

    含有输入框的弹框

                 new MaterialDialog.Builder(MainActivity.this)
                                    .title("输入窗")
                                    .iconRes(R.drawable.ic_logo)
                                    .content("包含输入框的diaolog")
    //                                .widgetColor(Color.BLUE)//输入框光标的颜色
                                    .inputType(InputType.TYPE_CLASS_PHONE)//可以输入的类型-电话号码
                                    //前2个一个是hint一个是预输入的文字
                                    .input(R.string.input_hint, R.string.input_prefill, new MaterialDialog.InputCallback() {
    
                                        @Override
                                        public void onInput(@NonNull MaterialDialog dialog, CharSequence input) {
    
                                            Log.i("yqy", "输入的是:" + input);
                                        }
                                    })
    
                                    .onPositive(new MaterialDialog.SingleButtonCallback() {
                                        @Override
                                        public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
                                            if (dialog.getInputEditText().length() <=10) {
    
                                                dialog.getActionButton(DialogAction.POSITIVE).setEnabled(false);
                                            }else {
                                                dialog.getActionButton(DialogAction.POSITIVE).setEnabled(true);
                                            }
                                        }
                                    })
                                    .show();
    

    这里写图片描述

    这里写图片描述

    限制条件

    输入类型是 .inputType(InputType.TYPE_CLASS_PHONE)//可以输入的类型-电话号码,限制输入长度是inputRange(11, 41, R.color.colorAccent)//限制输入的长度,只有在(11,41)长度内ok按钮才是可用的。限制长度还可以是在onInput()方法里处理。

    
            if (dialog.getInputEditText().length() < 10) {
                      dialog.getActionButton(DialogAction.POSITIVE).setEnabled(false);
                   }else{
                  dialog.getActionButton(DialogAction.POSITIVE).setEnabled(true);
             }
    
                while (dialogPro.getCurrentProgress()!=dialogPro.getMaxProgress()){
                                if (dialogPro.isCancelled()) break;
    
                                try {
                                    Thread.sleep(50);//模拟加载时间
                                } catch (InterruptedException e) {
                                    break;
                                }
    
                                dialogPro.incrementProgress(1);
                            }
                            dialogPro.setContent("加载完成");
    
    • Progress Dialog

    进度条弹框应该是用的比较多的了,但是这个的我感觉用起来不好,一般的点击加载进度

    这里写图片描述

    设置成水平的进度条

     .progress(false, 100, true)
     .progressNumberFormat("%1d/%2d")

    //progress(boolean indeterminate, int max, boolean showMinMax)
    // false 的话是水平进度条,true是等待圆环 最大值 是否显示数值,false的时候是不可以用progress这类的属性的灰报错:Cannot use setProgress() on this dialog.

    没有一个加载进度的过程

    • ColorDialog

    有关颜色选择的相关弹框,选择的时候实现选择的回掉接口:ColorChooserDialog.ColorCallback

      @Override
        public void onColorSelection(@NonNull ColorChooserDialog dialog, @ColorInt int selectedColor) {
            //此时选择的颜色
    
        }
    
    new ColorChooserDialog.Builder(MainActivity.this,R.string.app_name)
         .titleSub(R.string.input_hint)  // title of dialog when viewing shades of a color
         .accentMode(false)  // when true, will display accent palette instead of primary palette
         .doneButton(R.string.md_done_label)  // changes label of the done button
         .cancelButton(R.string.md_cancel_label)  // changes label of the cancel button
         .backButton(R.string.md_back_label)  // changes label of the back button
         .preselect(Color.RED)  // 开始的时候的默认颜色
         .dynamicButtonColor(true)  // defaults to true, false will disable changing action buttons' color to currently selected color
          .show();

    这里写图片描述

    可以自己定义筛选的颜色

    int[] primary = new int[] {
                             Color.parseColor("#F44336")
                            };
       int[][] secondary = new int[][] {
         new int[] { Color.parseColor("#EF5350"), Color.parseColor("#F44336"), Color.parseColor("#E53935") }
         };
     new ColorChooserDialog.Builder(MainActivity.this, R.string.app_name)
    //                .titleSub(R.string.app_name)
                      .customColors(primary, secondary)
                      .doneButton(R.string.done)
                      .cancelButton(R.string.cancel)
                      .titleSub(R.string.done)//设置二级选择的标题
    //                .presetsButton(R.string.input_hint)//从RRGB切换到CUstome的文字提示
                        .show();

    这里写图片描述

         new ColorChooserDialog.Builder(MainActivity.this, R.string.app_name)
                 .allowUserColorInput(false)
                  .customButton(R.string.md_custom_label)
                  .presetsButton(R.string.md_presets_label)
                  .show();

    这里写图片描述

    • File Selector Dialogs

    文件弹框

      new FileChooserDialog.Builder(MainActivity.this)
           .initialPath("/sdcard/Download")  // changes initial path, defaults to external storage directory
            .mimeType("image/*") // Optional MIME type filter
            .extensionsFilter(".png", ".jpg") // Optional extension filter, will override mimeType()
            .tag("optional-identifier")
            .goUpLabel("Up") // custom go up label, default label is "..."
            .show();

    这里写图片描述

    实现接口
    @Override
    public void onFileSelection(@NonNull FileChooserDialog dialog, @NonNull File file) {
    //选择文件
    }

    demo下载
    以上。感谢

    展开全文
  • Material Design之Toolbar与Palette实践 源码

    千次下载 热门讨论 2020-06-03 23:33:01
    Material Design之Toolbar与Palette实践,资源对应博客:http://blog.csdn.net/bbld_/article/details/41439715
  • Material_Studio教程

    2020-07-21 09:58:43
    主要以碳纳米管为例,介绍如何使用MS
  • MaterialDesign中文版

    2020-07-30 23:30:10
    GOOGLE Material Design规范,android界面设计必备手册
  • MaterialApp 详解

    千次阅读 2019-09-17 12:52:25
    一、参数含义 MaterialApp({ Key key, // 设备用于为用户识别应用程序的单行描述 this.title = '', // 应用程序默认路由的小部件,用来定义当前应用打开的时候,所显示的界面 this.home, // 在操作系统界面中...
  • Android Material组件使用详解

    千次阅读 2020-09-01 10:38:12
    前言 我们在平时写布局时,当遇到按钮需要圆角、或者描边等,通常的方法是新建一个xml文件,在shape标签下写,然后通过setBackground(drawable)设置。这本来没什么问题,但是射击师会喜欢看起来和别人不一样的效果,...
  • 利用Prism 搭建的一个WPF MVVM框架,导入了Material Design UI库,在实现TreeView时费了点周折,记录于此。 Xaml的写法如下: 需要应用命名空间: xmlns:domain="clr-namespace:management.wpfUI.Models" xmlns...
  • 前段时间 Android L 发布了,相信看过发布会了解过的朋友都为其中的 “Material Design” 感到由衷的惊艳吧!至少我是的。 在惊艳之余感到由衷的遗憾,因为其必须在 ”Android L“ 上才能使用,MD,郁闷啊。 之后便...
  • 听说谷歌Baba更新了 Material UI ...

    千次阅读 2018-05-30 00:57:10
    听说谷歌Baba更新了Material-UI?记忆不乏飘散到前几年。。。 我是一枚不折不扣的Android开发者,14年9月到现在,可谓现在才有了一点点资格入Android大门。还记得我曾羡慕IOS端的UI样式,那简易流畅的使用方式,让...
  • 学习笔记Android弹框material-dialogs

    万次阅读 2019-03-29 17:07:13
    今天来归纳一下安卓第三方弹框material-dialogs的简单用法
  • 05 Material材质

    千次阅读 2018-10-08 17:18:00
    上一节我们说了模型的形状以后,这一节我们讲解一下模型的表现,也就是我们看到的模型的外观——材质。 简单的说就是物体看起来是什么质地。材质可以看成是材料和质感的结合。在渲染程式中,它是表面各可视属性的...
  • IDEA更改主题插件——Material Theme UI详解

    万次阅读 多人点赞 2020-05-16 19:13:39
    IDEA更改主题插件——Material Theme UI 今天介绍IDEA中一款强大的颜值插件:Material Theme UI 话不多说,先上图:(颜色不喜欢可以更改) 一、安装 在File>Settings>Plugins中直接搜索插件,找到之后下载...
  • 之前浏览github的时候发现一个比较好用的MD...Github地址:https://github.com/afollestad/material-dialogs 导入 compile 'com.afollestad.material-dialogs:core:0.9.1.0' compile 'com.afollestad.material
  • 你应该听说过Android的Material Design,它是在Android 5.0(Lollipop)版本引入的。在Material Design中还引入了很多新东西,比如Material Theme,新的小部件,自定义的阴影,矢量图片及自定义动画等。如果你之前...
  • Material-UI入门文档

    千次阅读 2016-09-23 18:39:30
    Material-UI看着官网文档用自己的语言翻译一下,因为一直找不到Material-UI的中文文档。。。心累
  • MaterialDesign的Theme

    千次阅读 2015-07-28 15:19:43
    MaterialDesign的Theme
  • Material Design(Android6.0)

    千次阅读 2016-06-18 08:13:19
    由于本文引用了大量官方文档、图片资源,以及开源社区的Lib和相关图片资源,因此在转载的时候,务必注明来源,如果使用资源请注明资源的出处,...关于Material Design的开源库,本人已经在GitHub上创建了一
1 2 3 4 5 ... 20
收藏数 122,143
精华内容 48,857
关键字:

material