canvas教程

RecyclerView使用要点(2)

字号+ 作者:H5之家 来源:H5之家 2015-11-02 11:02 我要评论( )

ItemDecoration, 注意parent和child的使用方式. .[] ATTRS = new int []{android.R.attr.listDivider}; private Drawable mDivider; public MyItemDecoration (Context context) { final TypedArray array = contex

ItemDecoration, 注意parent和child的使用方式.

.[] ATTRS = new int[]{android.R.attr.listDivider}; private Drawable mDivider; public MyItemDecoration(Context context) { final TypedArray array = context.obtainStyledAttributes(ATTRS); mDivider = array.getDrawable(0); array.recycle(); } (Canvas c, RecyclerView parent, State state) { drawHorizontal(c, parent); drawVertical(c, parent); } (Canvas c, RecyclerView parent) { final int childCount = parent.getChildCount(); // 在每一个子控件的底部画线 for (int i = 0; i < childCount; i++) { final View child = parent.getChildAt(i); final int left = child.getLeft() + child.getPaddingLeft(); final int right = child.getWidth() + child.getLeft() - child.getPaddingRight(); final int top = child.getBottom() - mDivider.getIntrinsicHeight() - child.getPaddingBottom(); final int bottom = top + mDivider.getIntrinsicHeight(); mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); } } (Canvas c, RecyclerView parent) { final int childCount = parent.getChildCount(); // 在每一个子控件的右侧画线 for (int i = 0; i < childCount; i++) { final View child = parent.getChildAt(i); int right = child.getRight() - child.getPaddingRight(); int left = right - mDivider.getIntrinsicWidth(); final int top = child.getTop() + child.getPaddingTop(); final int bottom = child.getTop() + child.getHeight() - child.getPaddingBottom(); mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); } } (Rect outRect, View view, RecyclerView parent, State state) { outRect.set(0, 0, mDivider.getIntrinsicWidth(), mDivider.getIntrinsicHeight()); } }

本例重写了listDivider

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> ... <item name="android:listDivider">@drawable/divider_bg</item> </style> ===="4dp"/> </shape> 7. ItemAnimator

动画效果比较复杂, 使用默认动画. 如要定制的话, 继承DefaultItemAnimator; 如设置null, 则不显示任何动画.

(RecyclerView recyclerView) { recyclerView.setItemAnimator(new DefaultItemAnimator()); // 默认动画 } 8. 最终Activity { private MyAdapter mAdapter; (Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); fab.setOnClickListener(new View.OnClickListener() { (View view) { Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) .setAction("Action", null).show(); } }); // 初始化RecyclerView initRecyclerView((RecyclerView) findViewById(R.id.test_recycler_view)); } /** * 初始化RecyclerView * * @param recyclerView 主控件 */ (RecyclerView recyclerView) { recyclerView.setHasFixedSize(true); // 设置固定大小 initRecyclerLayoutManager(recyclerView); // 初始化LayoutManager initRecyclerAdapter(recyclerView); // 初始化Adapter initItemDecoration(recyclerView); // 初始化边界装饰 initItemAnimator(recyclerView); // 初始化动画效果 } /** * 初始化RecyclerView的LayoutManager * * @param recyclerView 主控件 */ (RecyclerView recyclerView) { // 错列网格布局 recyclerView.setLayoutManager(new StaggeredGridLayoutManager(4, StaggeredGridLayoutManager.VERTICAL)); } /** * 初始化RecyclerView的Adapter * * @param recyclerView 主控件 */ (RecyclerView recyclerView) { mAdapter = new MyAdapter(getData()); recyclerView.setAdapter(mAdapter); } /** * 初始化RecyclerView的(ItemDecoration)项目装饰 * * @param recyclerView 主控件 */ (RecyclerView recyclerView) { recyclerView.addItemDecoration(new MyItemDecoration(this)); } /** * 初始化RecyclerView的(ItemAnimator)项目动画 * * @param recyclerView 主控件 */ (RecyclerView recyclerView) { recyclerView.setItemAnimator(new DefaultItemAnimator()); // 默认动画 } /** * 模拟的数据 * * @return 数据 */ private ArrayList<DataModel> getData() { int count = 57; ArrayList<DataModel> data = new ArrayList<>(); for (int i = 0; i < count; i++) { DataModel model = new DataModel(); model.setDateTime(getBeforeDay(new Date(), i)); model.setLabel("No. " + i); data.add(model); } return data; } /** * 获取日期的前一天 * * @param date 日期 * @param i 偏离 * @return 新的日期 */ private static Date getBeforeDay(Date date, int i) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.add(Calendar.DAY_OF_YEAR, i * (-1)); return calendar.getTime(); } (Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } (MenuItem item) { id = item.getItemId(); switch (item.getItemId()) { case R.id.id_action_add: mAdapter.addData(1); break; case R.id.id_action_delete: mAdapter.removeData(1); break; } //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } }

为了测试动画, Menu额外添加两个按钮.

OK, 基本要点就是这些了.

版权声明:本文为博主原创文章,未经博主允许不得转载。

推荐文章

本页内容版权归属为原作者,如有侵犯您的权益,请通知我们删除。

Swift 2.0学习笔记(Day 29)——访问级别 - 2015-11-01 14:11:45

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • msdn 我告诉你【msdn.hk】

    msdn 我告诉你【msdn.hk】

    2017-04-24 14:00

  • 使用canvas实现擦除效果

    使用canvas实现擦除效果

    2017-04-23 18:00

  • 前端小项目:使用canvas绘画哆啦A梦

    前端小项目:使用canvas绘画哆啦A梦

    2017-04-23 14:02

  • 微信小程序的canvas画布功能怎么用?canvas画布功能使用教程

    微信小程序的canvas画布功能怎么用?canvas画布功能使用教程

    2017-04-15 16:01

网友点评