Android 5.X的新特性实例

作者: 一个有故事的程序员 | 来源:发表于2017-10-24 13:39 被阅读122次

    导语

    Android 5.X新特性实例,理论知识戳这里

    主要内容

    • Android5.X切换动画
    • Toolbar的使用
    • 基本的Notification
    • 折叠式Notification
    • 悬挂式Notification

    具体内容

    效果图:

    Android5.X切换动画 Toolbar的使用 基本的Notification 折叠式Notification 悬挂式Notification

    Android5.X切换动画

    分别看下ActivityA和ActivityB的布局文件,注意transitionName在哪个View:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:orientation="vertical"
        android:layout_height="match_parent">
    
    
        <Button
            android:layout_width="match_parent"
            android:layout_height="100dp"
            android:onClick="explode"
            android:text="explode" />
    
        <Button
            android:layout_width="match_parent"
            android:layout_height="100dp"
            android:onClick="slide"
            android:text="slide" />
    
        <Button
            android:layout_width="match_parent"
            android:layout_height="100dp"
            android:onClick="fade"
            android:text="fade" />
    
        <Button
            android:layout_width="match_parent"
            android:layout_height="100dp"
            android:transitionName="share"
            android:onClick="share"
            android:text="share" />
    
        <Button
            android:id="@+id/fab_button"
            android:layout_width="56dp"
            android:transitionName="fab"
            android:layout_height="56dp"
            android:background="@drawable/ripple_round"
            android:elevation="5dp"/>
    </LinearLayout>
    
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin">
    
        <View
            android:id="@+id/holder_view"
            android:layout_width="match_parent"
            android:layout_height="300dp"
            android:transitionName="share"
            android:background="?android:colorPrimary" />
    
        <Button xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/fab_button"
            android:transitionName="fab"
            android:layout_width="56dp"
            android:layout_height="56dp"
            android:layout_marginRight="@dimen/activity_horizontal_margin"
            android:background="@drawable/ripple_round"
            android:elevation="5dp"
            android:layout_below="@+id/holder_view"
            android:layout_marginTop="-26dp"
            android:layout_alignParentEnd="true" />
    
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:paddingTop="10dp"
            android:layout_below="@id/holder_view">
    
            <Button
                android:layout_width="match_parent"
                android:layout_height="60dp"
                android:id="@+id/button"
                android:layout_below="@+id/button4"
                android:layout_marginTop="10dp" />
    
            <Button
                android:layout_width="match_parent"
                android:layout_height="60dp"
                android:layout_marginTop="10dp"
                android:id="@+id/button4"
                android:layout_alignParentStart="true" />
    
    
        </RelativeLayout>
    
    </RelativeLayout>
    

    分别看下ActivityA和ActivityB的Activity文件:

    public class TransitionsA extends Activity {
    
        private Intent intent;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_transition);
        }
    
        // 设置不同动画效果
        public void explode(View view) {
            intent = new Intent(this, TransitionsB.class);
            intent.putExtra("flag", 0);
            startActivity(intent,
                    ActivityOptions.makeSceneTransitionAnimation(this)
                            .toBundle());
        }
        // 设置不同动画效果
        public void slide(View view) {
            intent = new Intent(this, TransitionsB.class);
            intent.putExtra("flag", 1);
            startActivity(intent,
                    ActivityOptions.makeSceneTransitionAnimation(this)
                            .toBundle());
        }
        // 设置不同动画效果
        public void fade(View view) {
            intent = new Intent(this, TransitionsB.class);
            intent.putExtra("flag", 2);
            startActivity(intent,
                    ActivityOptions.makeSceneTransitionAnimation(this)
                            .toBundle());
        }
        // 设置不同动画效果
        public void share(View view) {
            View fab = findViewById(R.id.fab_button);
            intent = new Intent(this, TransitionsB.class);
            intent.putExtra("flag", 3);
            // 创建单个共享元素
    //        startActivity(intent,
    //                ActivityOptions.makeSceneTransitionAnimation(
    //                        this, view, "share").toBundle());
            startActivity(intent,
                    ActivityOptions.makeSceneTransitionAnimation(
                            this,
                            // 创建多个共享元素
                            Pair.create(view, "share"),
                            Pair.create(fab, "fab")).toBundle());
        }
    }
    
    public class TransitionsB extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
            int flag = getIntent().getExtras().getInt("flag");
            // 设置不同的动画效果
            switch (flag) {
                case 0:
                    getWindow().setEnterTransition(new Explode());
                    break;
                case 1:
                    getWindow().setEnterTransition(new Slide());
                    break;
                case 2:
                    getWindow().setEnterTransition(new Fade());
                    getWindow().setExitTransition(new Fade());
                    break;
                case 3:
                    break;
            }
            setContentView(R.layout.activity_transition_to);
        }
    }
    

    效果图:

    Android5.X切换动画

    Toolbar的使用

    记得先将主题设置为NoActionBar主题,在布局中声明ToolBar:

    <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize" />
    

    在Menu文件夹中创建一个Menu的XML文件:

    <menu xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        tools:context=".MainActivity" >
    
        <item
            android:id="@+id/ab_search"
            android:orderInCategory="80"
            android:title="action_search"
            app:actionViewClass="android.support.v7.widget.SearchView"
            app:showAsAction="ifRoom"/>
        <item
            android:id="@+id/action_share"
            android:orderInCategory="90"
            android:title="action_share"
            app:actionProviderClass="android.support.v7.widget.ShareActionProvider"
            app:showAsAction="ifRoom"/>
        <item
            android:id="@+id/action_settings"
            android:orderInCategory="100"
            android:title="action_settings"
            app:showAsAction="never"/>
    
    </menu>
    

    在代码中使用:

    public class ToolbarActivity extends AppCompatActivity {
    
        private ShareActionProvider mShareActionProvider;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_toolbar);
    
            Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
            toolbar.setLogo(R.mipmap.ic_launcher);
            toolbar.setTitle("主标题");
            toolbar.setSubtitle("副标题");
            setSupportActionBar(toolbar);
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.menu_main, menu);
            return super.onCreateOptionsMenu(menu);
        }
    }
    

    效果图:

    效果图

    修改一下布局,实现Toolbar侧滑菜单:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context="com.handsome.qunyingzhuang.chapter_12.Anli02.ToolbarActivity">
    
        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize" />
    
        <android.support.v4.widget.DrawerLayout
            android:id="@+id/drawer"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
    
            <!-- 内容界面 -->
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:background="@android:color/holo_blue_light"
                android:orientation="vertical">
    
                <Button
                    android:layout_width="100dp"
                    android:layout_height="match_parent"
                    android:text="内容界面" />
            </LinearLayout>
    
            <!-- 侧滑菜单内容 必须指定其水平重力 -->
            <LinearLayout
                android:id="@+id/drawer_view"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_gravity="start"
                android:orientation="vertical">
    
                <Button
                    android:layout_width="200dp"
                    android:layout_height="match_parent"
                    android:text="菜单界面" />
            </LinearLayout>
        </android.support.v4.widget.DrawerLayout>
    </LinearLayout>
    

    在主代码中实现:

    public class ToolbarActivity extends AppCompatActivity {
    
        private ShareActionProvider mShareActionProvider;
        private DrawerLayout mDrawerLayout;
        private ActionBarDrawerToggle mDrawerToggle;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_toolbar);
    
            Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
            toolbar.setLogo(R.mipmap.ic_launcher);
            toolbar.setTitle("主标题");
            toolbar.setSubtitle("副标题");
            setSupportActionBar(toolbar);
    
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
            mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer);
            mDrawerToggle = new ActionBarDrawerToggle(
                    this, mDrawerLayout, toolbar,
                    R.string.abc_action_bar_home_description,
                    R.string.abc_action_bar_home_description_format);
            mDrawerToggle.syncState();
            mDrawerLayout.setDrawerListener(mDrawerToggle);
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.menu_main, menu);
            /* ShareActionProvider配置 */
            mShareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(menu
                    .findItem(R.id.action_share));
            Intent intent = new Intent(Intent.ACTION_SEND);
            intent.setType("text/*");
            mShareActionProvider.setShareIntent(intent);
            return super.onCreateOptionsMenu(menu);
        }
    }
    

    效果图:

    Toolbar的使用

    基本的Notification

    代码:

    public class Notification01 extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_notification01);
            //第一步:初始化
            Notification.Builder builder = new Notification.Builder(this);
            //第二步:构建点击之后的意图
            Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.baidu.com"));
            //构造pendingdintent
            PendingIntent pendingIntent = PendingIntent.getActivities(this, 0, new Intent[]{intent}, 0);
            //第三步:设置通知栏的各种消息
            builder.setSmallIcon(R.mipmap.ic_launcher);
            builder.setContentIntent(pendingIntent);
            builder.setAutoCancel(true);
            builder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher));
            builder.setContentText("Title");
            builder.setContentText("内容");
            builder.setSubText("text");
            //第四步:通过NotificationManager来发出
            NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
            notificationManager.notify(0, builder.build());
        }
    }
    

    效果图:

    基本的Notification

    折叠的Notification

    代码:

    public class Notification02 extends AppCompatActivity {
    
        private static final int NOTIFICATION_ID_COLLAPSE = 0x01;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_notification02);
            Intent intent = new Intent(Intent.ACTION_VIEW,
                    Uri.parse("http://www.sina.com"));
            PendingIntent pendingIntent = PendingIntent.getActivity(
                    this, 0, intent, 0);
            Notification.Builder builder = new Notification.Builder(this);
            builder.setSmallIcon(R.mipmap.ic_launcher);
            builder.setContentIntent(pendingIntent);
            builder.setAutoCancel(true);
            builder.setLargeIcon(BitmapFactory.decodeResource(
                    getResources(), R.mipmap.ic_launcher));
            // 通过RemoteViews来创建自定义的Notification视图
            RemoteViews contentView =
                    new RemoteViews(getPackageName(),
                            R.layout.notification);
            contentView.setTextViewText(R.id.textView,
                    "show me when collapsed");
    
            Notification notification = builder.build();
            notification.contentView = contentView;
            // 通过RemoteViews来创建自定义的Notification视图
            RemoteViews expandedView =
                    new RemoteViews(getPackageName(),
                            R.layout.notification_expanded);
            notification.bigContentView = expandedView;
    
            NotificationManager nm = (NotificationManager)
                    getSystemService(NOTIFICATION_SERVICE);
            nm.notify(NOTIFICATION_ID_COLLAPSE, notification);
        }
    }
    

    效果图:

    折叠式Notification

    悬挂式Notification

    代码:

    public class Notification03 extends AppCompatActivity {
    
        private static final int NOTIFICATION_ID_HEADSUP = 0x01;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_notification03);
            Notification.Builder builder = new Notification.Builder(this)
                    .setSmallIcon(R.mipmap.ic_launcher)
                    .setPriority(Notification.PRIORITY_DEFAULT)
                    .setCategory(Notification.CATEGORY_MESSAGE)
                    .setContentTitle("Headsup Notification")
                    .setContentText("I am a Headsup notification.");
    
            Intent push = new Intent();
            push.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            push.setClass(this, MainActivity.class);
            PendingIntent pendingIntent = PendingIntent.getActivity(
                    this, 0, push, PendingIntent.FLAG_CANCEL_CURRENT);
            builder.setContentText("Heads-Up Notification on Android 5.0")
                    .setFullScreenIntent(pendingIntent, true);
    
            NotificationManager nm = (NotificationManager)
                    getSystemService(NOTIFICATION_SERVICE);
            nm.notify(NOTIFICATION_ID_HEADSUP, builder.build());
        }
    }
    

    效果图:

    悬挂式Notification

    总结

    理解实例。

    更多内容戳这里(整理好的各种文集)

    相关文章

      网友评论

        本文标题:Android 5.X的新特性实例

        本文链接:https://www.haomeiwen.com/subject/kcitpxtx.html