ANDROID L——Material Design综合应用(Demo)
轉載請注明本文出自大苞米的博客(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(懸浮動作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"}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// set Explode enter transition animation for current activitygetWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);getWindow().setEnterTransition(new Explode().setDuration(1000));setContentView(R.layout.main_layout);// init datathis.context = this;actors.add(new Actor(names[0], pics[0], works[0], role[0], picGroups[0]));getActionBar().setTitle("那些年我們追的星女郎");// init RecyclerViewmRecyclerView = (RecyclerView) findViewById(R.id.list);mRecyclerView.setLayoutManager(new LinearLayoutManager(this));mRecyclerView.setItemAnimator(new DefaultItemAnimator());// set adaptermyAdapter = new MyAdapter(this, actors);mRecyclerView.setAdapter(myAdapter);// set outline and listener for floating action buttonbutton = (ImageButton) this.findViewById(R.id.add_button);button.setOutlineProvider(new ViewOutlineProvider() {@Overridepublic 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;@Overridepublic void onClick(View v) {// start animationAnimator animator = createAnimation(v);animator.start();// add itemif (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 itemelse {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 activityTransition 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 transitionIntent intent = new Intent(context, DetailActivity.class);intent.putExtra("pos", position);startActivity(intent, bundle);}/*** create CircularReveal animation*/public Animator createAnimation(View v) {// create a CircularReveal animationAnimator 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;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// set Explode enter transition animation for current activitygetWindow().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 infopic.setTransitionName(position + "pic");pic.setImageDrawable(getDrawable(actor.getImageResourceId(this)));name.setText("姓名:" + actor.name);works.setText("代表作:" + actor.works);role.setText("飾演:" + actor.role);// set action bar titlegetActionBar().setTitle(MyActivity.actors.get(position).name);// floating action buttonbtn.setImageDrawable(getDrawable(android.R.drawable.ic_menu_gallery));btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// set first animationAnimator animator = createAnimation(pic, true);animator.start();animator.addListener(new Animator.AnimatorListener() {@Overridepublic void onAnimationStart(Animator animation) {}@Overridepublic void onAnimationEnd(Animator animation) {picIndex++;if (actor.getPics() != null) {if (picIndex >= actor.getPics().length) {picIndex = 0;}// set second animationdoSecondAnim();}}@Overridepublic void onAnimationCancel(Animator animation) {}@Overridepublic 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;}@Overridepublic void onBackPressed() {super.onBackPressed();pic.setImageDrawable(getDrawable(actor.getImageResourceId(this, actor.picName)));finishAfterTransition();}}RecyclerView的Adapter: public class MyAdapterextends RecyclerView.Adapter<MyAdapter.ViewHolder> {private List<Actor> actors;private Context mContext;public MyAdapter( Context context , List<Actor> actors){this.mContext = context;this.actors = actors;}@Overridepublic ViewHolder onCreateViewHolder( ViewGroup viewGroup, int i ){View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.card_view, viewGroup, false);return new ViewHolder(v);}@Overridepublic 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)));}@Overridepublic int getItemCount(){return actors == null ? 0 : actors.size();}public static class ViewHolderextends 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() {@Overridepublic 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)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用CMake生成sln项目和VS工程遇
- 下一篇: 判断节点包含