ANDROID L——Material Design综合应用(Demo)

摘要:
MaterialDesign:MaterialDesign是谷歌推出的一种全新设计语言。它的特点是扁平化。我将MaterialDesign分为以下四个部分:主题和布局-ANDROIDL-MaterialDesign专门解释视图和阴影-ANDROID-MaterialDesign特别解释UI控件-ANDROID-MaterialDesign具体解释动画-ANDROid-MaterialDesign尤其解释动画(动画),下面的示例是上面描述的一个综合应用程序,不要胡说八道,只看下图:Demo简要介绍了左侧的图:1。RecyclerView和CardView首先使用MaterialDesign添加的两个新控件RecyclerView和CardView。

转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持!


Material Design:


Material Design是Google推出的一个全新的设计语言,它的特点就是拟物扁平化。

我将Material Design分为例如以下四部分:

主题和布局——ANDROID L——Material Design具体解释(主题和布局)

视图和阴影——ANDROID L——Material Design具体解释(视图和阴影)

UI控件——ANDROID L——Material Design具体解释(UI控件)

动画——ANDROID L——Material Design具体解释(动画篇)


而以下这个样例就是之前上面所介所绍的一个综合应用,废话不多说直接看图:


ANDROID L——Material Design综合应用(Demo)第1张       ANDROID L——Material Design综合应用(Demo)第2张



Demo简单介绍:


左边的图:


1.RecyclerView,CardView

首先使用了Material Desgin新增的两个控件RecyclerView,CardView。

知识点參考ANDROID L——RecyclerView,CardView导入和使用(Demo)


2. Floating Action Button & 视图阴影轮廓

这里和上篇文章不同的是我加了一个Floating Action Button(悬浮动作button)去控制CardView在RecyclerView中的加入和删除。

而且在蓝色的悬浮button上设置了阴影了轮廓(黑色背景不是非常清楚)

知识点參考ANDROID L——Material Design具体解释(视图和阴影)


3. Reveal Effect

在点击蓝色button时会有一个缩小的动画是使用了Reveal effect动画

知识点參考ANDROID L——Material Design具体解释(动画篇)


右面的图:


1. Activity transitions

在点击单个条目时会跳转到一个新的Acitivty,跳转时运行Activity transitions动画,大家会看到第二个Activity中的视图会有一个向中央扩展的效果(Explode)


2. Shared Elements Transition

在从第一个Activity跳转到第二个Activity时,会有一个共享元素的动画效果使图片和悬浮button在两个Activity跳转时移动(控件间距离有些近效果不是特别明显)


3. Reveal effect和动画监听

通过Reveal effect和动画监听实现类似“眨眼睛”的切换视图效果


1、2、3知识点參考:ANDROID L——Material Design具体解释(动画篇)



代码介绍:


主Activity——MyActivity:

public class MyActivity extends Activity {

    private RecyclerView mRecyclerView;

    private MyAdapter myAdapter;

    ImageButton button;

    Context context;

    public static List<Actor> actors = new ArrayList<Actor>();

    private static String[] names = {"朱茵", "张柏芝", "张敏", "莫文蔚", "黄圣依", "赵薇", "如花"};

    private static String[] pics = {"p1", "p2", "p3", "p4", "p5", "p6", "p7"};

    private static String[] works = {"大话西游", "喜剧之王", "p3", "p4", "p5", "p6", "p7"};

    private static String[] role = {"紫霞仙子", "柳飘飘", "p3", "p4", "p5", "p6", "p7"};

    private static String[][] picGroups = {{"p1","p1_1", "p1_2", "p1_3"},{"p2","p2_1", "p2_2", "p2_3"},{"p3"},{"p4"},{"p5"},{"p6"},{"p7"}};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // set Explode enter transition animation for current activity
        getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
        getWindow().setEnterTransition(new Explode().setDuration(1000));
        setContentView(R.layout.main_layout);

        // init data
        this.context = this;
        actors.add(new Actor(names[0], pics[0], works[0], role[0], picGroups[0]));
        getActionBar().setTitle("那些年我们追的星女郎");

        // init RecyclerView
        mRecyclerView = (RecyclerView) findViewById(R.id.list);
        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
        mRecyclerView.setItemAnimator(new DefaultItemAnimator());
        // set adapter
        myAdapter = new MyAdapter(this, actors);
        mRecyclerView.setAdapter(myAdapter);

        // set outline and listener for floating action button
        button = (ImageButton) this.findViewById(R.id.add_button);
        button.setOutlineProvider(new ViewOutlineProvider() {
            @Override
            public void getOutline(View view, Outline outline) {
                int shapeSize = (int) getResources().getDimension(R.dimen.shape_size);
                outline.setRoundRect(0, 0, shapeSize, shapeSize, shapeSize / 2);
            }
        });
        button.setClipToOutline(true);
        button.setOnClickListener(new MyOnClickListener());

    }

    public class MyOnClickListener implements View.OnClickListener {
        boolean isAdd = true;

        @Override
        public void onClick(View v) {
            // start animation
            Animator animator = createAnimation(v);
            animator.start();

            // add item
            if (myAdapter.getItemCount() != names.length && isAdd) {

                actors.add(new Actor(names[myAdapter.getItemCount()], pics[myAdapter.getItemCount()], works[myAdapter.getItemCount()], role[myAdapter.getItemCount()], picGroups[myAdapter.getItemCount()]));
                mRecyclerView.scrollToPosition(myAdapter.getItemCount() - 1);
                myAdapter.notifyDataSetChanged();
            }
            // delete item
            else {
                actors.remove(myAdapter.getItemCount() - 1);
                mRecyclerView.scrollToPosition(myAdapter.getItemCount() - 1);
                myAdapter.notifyDataSetChanged();
            }

            if (myAdapter.getItemCount() == 0) {
                button.setImageDrawable(getDrawable(android.R.drawable.ic_input_add));
                isAdd = true;
            }
            if (myAdapter.getItemCount() == names.length) {
                button.setImageDrawable(getDrawable(android.R.drawable.ic_delete));
                isAdd = false;
            }
        }
    }

    /**
     * start detail activity
     */
    public void startActivity(final View v, final int position) {

        View pic = v.findViewById(R.id.pic);
        View add_btn = this.findViewById(R.id.add_button);

        // set share element transition animation for current activity
        Transition ts = new ChangeTransform();
        ts.setDuration(3000);
        getWindow().setExitTransition(ts);
        Bundle bundle = ActivityOptions.makeSceneTransitionAnimation((Activity) context,
                Pair.create(pic, position + "pic"),
                Pair.create(add_btn, "ShareBtn")).toBundle();

        // start activity with share element transition
        Intent intent = new Intent(context, DetailActivity.class);
        intent.putExtra("pos", position);
        startActivity(intent, bundle);

    }

    /**
     * create CircularReveal animation
     */
    public Animator createAnimation(View v) {
        // create a CircularReveal animation
        Animator animator = ViewAnimationUtils.createCircularReveal(
                v,
                v.getWidth() / 2,
                v.getHeight() / 2,
                0,
                v.getWidth());
        animator.setInterpolator(new AccelerateDecelerateInterpolator());
        animator.setDuration(500);
        return animator;
    }

}


第二个Activity——DetailActivity:

public class DetailActivity extends Activity {

    ImageView pic;

    int position;

    int picIndex = 0;

    Actor actor;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // set Explode enter transition animation for current activity
        getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
        getWindow().setEnterTransition(new Explode().setDuration(1000));
        getWindow().setExitTransition(null);

        setContentView(R.layout.detail_layout);

        position = getIntent().getIntExtra("pos", 0);
        actor = MyActivity.actors.get(position);
        pic = (ImageView) findViewById(R.id.detail_pic);

        TextView name = (TextView) findViewById(R.id.detail_name);
        TextView works = (TextView) findViewById(R.id.detail_works);
        TextView role = (TextView) findViewById(R.id.detail_role);
        ImageButton btn = (ImageButton) findViewById(R.id.detail_btn);

        // set detail info
        pic.setTransitionName(position + "pic");
        pic.setImageDrawable(getDrawable(actor.getImageResourceId(this)));
        name.setText("姓名:" + actor.name);
        works.setText("代表作:" + actor.works);
        role.setText("饰演:" + actor.role);
        // set action bar title
        getActionBar().setTitle(MyActivity.actors.get(position).name);

        // floating action button
        btn.setImageDrawable(getDrawable(android.R.drawable.ic_menu_gallery));
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // set first animation
                Animator animator = createAnimation(pic, true);
                animator.start();
                animator.addListener(new Animator.AnimatorListener() {
                    @Override
                    public void onAnimationStart(Animator animation) {

                    }

                    @Override
                    public void onAnimationEnd(Animator animation) {
                        picIndex++;
                        if (actor.getPics() != null) {
                            if (picIndex >= actor.getPics().length) {
                                picIndex = 0;
                            }
                            // set second animation
                            doSecondAnim();
                        }
                    }

                    @Override
                    public void onAnimationCancel(Animator animation) {

                    }

                    @Override
                    public void onAnimationRepeat(Animator animation) {

                    }
                });
            }
        });
    }

    /**
     * exec second animation for pic view
     */
    private void doSecondAnim() {
        pic.setImageDrawable(getDrawable(actor.getImageResourceId(this, actor.getPics()[picIndex])));
        Animator animator = createAnimation(pic, false);
        animator.start();
    }

    /**
     * create CircularReveal animation with first and second sequence
     */
    public Animator createAnimation(View v, Boolean isFirst) {

        Animator animator;

        if (isFirst) {
            animator = ViewAnimationUtils.createCircularReveal(
                    v,
                    v.getWidth() / 2,
                    v.getHeight() / 2,
                    v.getWidth(),
                    0);
        } else {
            animator = ViewAnimationUtils.createCircularReveal(
                    v,
                    v.getWidth() / 2,
                    v.getHeight() / 2,
                    0,
                    v.getWidth());
        }

        animator.setInterpolator(new DecelerateInterpolator());
        animator.setDuration(500);
        return animator;
    }

    @Override
    public void onBackPressed() {
        super.onBackPressed();
        pic.setImageDrawable(getDrawable(actor.getImageResourceId(this, actor.picName)));
        finishAfterTransition();
    }

}



RecyclerView的Adapter:

public class MyAdapter
    extends RecyclerView.Adapter<MyAdapter.ViewHolder>
{


    private List<Actor> actors;


    private Context mContext;


    public MyAdapter( Context context , List<Actor> actors)
    {
        this.mContext = context;
        this.actors = actors;
    }


    @Override
    public ViewHolder onCreateViewHolder( ViewGroup viewGroup, int i )
    {
        View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.card_view, viewGroup, false);
        return new ViewHolder(v);
    }


    @Override
    public void onBindViewHolder( ViewHolder viewHolder, int i )
    {
        Actor p = actors.get(i);
        viewHolder.mContext = mContext;
        viewHolder.mTextView.setText(p.name);
        viewHolder.mImageView.setImageDrawable(mContext.getDrawable(p.getImageResourceId(mContext)));
    }


    @Override
    public int getItemCount()
    {
        return actors == null ? 0 : actors.size();
    }


    public static class ViewHolder
        extends RecyclerView.ViewHolder
    {
        public TextView mTextView;


        public ImageView mImageView;


        public Context mContext;


        public ViewHolder( View v )
        {
            super(v);
            mTextView = (TextView) v.findViewById(R.id.name);
            mImageView = (ImageView) v.findViewById(R.id.pic);


            v.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                ((MyActivity)mContext).startActivity(v, getPosition());
                }
            });
        }
    }
}
剩余的Layout文件和一些烂七八糟的东西大家能够通过下方的Github连接找到。

Github下载地址:https://github.com/a396901990/AndroidDemo  (AndroidL_MaterialDesgin_Demo)



写在最后:


代码写的比較搓,仅仅为了高速完毕功能,非常多不规范的大家忽略好了。

而且代码中仅仅有一些简单的注解,并没有具体解说,由于我认为也没什么可讲的,当中内容都是我之前文章中样例的应用。


大家能够对比上面的Demo简单介绍中的知识点去对应的文章中寻找相关的具体信息。


免责声明:文章转载自《ANDROID L——Material Design综合应用(Demo)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇接口自动化---简单的数据驱动框架ATP(基于excel)Docker学习—DockerFile下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

linux oracle监听配置

1、在oracle用户下输入命令:netca,进入安装界面,选择“Listener configuration”,点击“Next”按钮 2、选择“Add”,点击“Next”按钮 3、默认监听名称,点击“Next”按钮 4、默认选择“TCP”,点击“Next”按钮  5、选择“Use the standard port number of 1521”...

微信小程序自定义事件

案例结构 首先,我还是会以案例的形式向大家讲解(这样也能方便大家更好的理解)简单介绍一下案例项目的内容(以上一章自定义组件的案例为基础)项目名称:component自定义子组件cpt父组件:logs 在子组件cpt中有一个按钮,按钮上显示的是当前这按钮组件存储的数值counter. 父组件logs引用三个cpt子组件,在父组件有它自己的第一个变量tota...

HP LaserJet P2055dn 通过网络连接打印机用户指南

HP LaserJet P2055dn 通过网络连接打印机用户指南------------------------------------------------------------------------一、打印机设置-----------------------(强烈建议先通过Service菜单的Restore defaults,将所有自定义设置重...

倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-点击运行按钮进入到运行状态报错Error starting TwinCAT System怎么办 AdsWarning1823怎么办

一般提示如下   点击Device,然后选中当前真正连接到的网卡   一般是由于重装系统之后,没有把本来是realtime capable的设备Install,所以找不到支持EtherCAT的设备导致的,只需要重新安装一下支持的网卡即可,如果还是不行,则删除原来扫出来的设备,重新扫描一次       更多教学视频和资料下载,欢迎关注以...

NGUI系列教程二

接下来我们创建一个Label,NGUI->Open the Widget Wizard,打开widgetTool对话框,在Template中选择Label,确定AddTo右侧选项为panel,点击,Add To完成Label创建。 1.Label属性窗口如图 1.下面的节奏可能有点快,大家可以先熟悉一下上面讲的流程,再进行下面的学习。接下来我们...

WPF 制作圆角按钮

在程序对应坐置插入以下代码,或是先拖一个按钮控件到窗体中,再替换对应的代码。 修改CornerRadius="18,3,18,3" 就可以改变圆角大小 按钮效果: <Button Content="Button" HorizontalAlignment="Left" Margin="19,10,0,0" VerticalAlignment="Top...