ANDROID L——Material Design綜合應用(Demo),androidmaterial

來源:互聯網
上載者:User

ANDROID L——Material Design綜合應用(Demo),androidmaterial

轉載請註明本文出自大苞米的部落格(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詳解(動畫篇)


而下面這個例子就是之前上面所介所紹的一個綜合應用,廢話不多說直接看圖:


       



Demo簡介:


左邊的圖:


1.RecyclerView,CardView

首先使用了Material Desgin新增的兩個控制項RecyclerView,CardView。

知識點參考:ANDROID L——RecyclerView,CardView匯入和使用(Demo)


2. Floating Action Button & 視圖陰影輪廓

這裡和上篇文章不同的是我加了一個Floating Action Button(懸浮動作按鈕)去控制CardView在RecyclerView中的添加和刪除。

並且在藍色的懸浮按鈕上設定了陰影了輪廓(黑色背景不是很清楚)

知識點參考:ANDROID L——Material Design詳解(視圖和陰影)


3. Reveal Effect

在點擊藍色按鈕時會有一個縮小的動畫是使用了Reveal effect動畫

知識點參考:ANDROID L——Material Design詳解(動畫篇)


右面的圖:


1. Activity transitions

在點擊單個條目時會跳轉到一個新的Acitivty,跳轉時執行Activity transitions動畫,大家會看到第二個Activity中的視圖會有一個向中央擴充的效果(Explode)


2. Shared Elements Transition

在從第一個Activity跳轉到第二個Activity時,會有一個共用元素的動畫效果使圖片和懸浮按鈕在兩個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初學者,Android l的發布,對初學者意味著什?

不意味著什麼,初學就要學最新的。Android L重大的變化主要體現在UI與功能上,Google提出了Material Design的設計理念。我認為這個版本的代碼結構和之前的Android版本在大體上沒什麼不同,因此大多數的文檔還是可以用的。推薦去Google下載一份Android L的開發文檔,看看代碼上有沒有什麼變動。因為你初學,建議你在設計時優先學習卡片式布局、Fragment等等,盡量不要用Android 2.3以後被摒棄掉的方法和類。我也是一個Android開發人員,做過一些小應用,有問題歡迎來提問。希望這些能協助到你。
 
把iOS與安卓50即Android L做對比,這兩個系統的優勢與不足之處各自在什地方,各自特點在

這個看個人,如果你想要貼心優質的體驗,選iOS,如果你想追求個人化,自由度,又對安全方面沒啥要求,就選安卓
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.