[开源学习_MeiZhi]一个itemView中多个点击事件的实现
来源:互联网 发布:清理数据库在哪里 编辑:程序博客网 时间:2024/06/05 06:21
[开源学习_MeiZhi]一个itemView中多个点击事件的实现
源码片段来源: drakeet的MeiZhi 项目. https://github.com/drakeet/Meizhi
这里的item的点击分为 妹子图片的点击(红色区域)和itemView(蓝色区域)的点击.
实现代码
mMeizhiListAdapter.setOnMeizhiTouchListener(getOnMeizhiTouchListener()); //添加点击事件
//区分点击妹子图片和点击itemViewprivate OnMeizhiTouchListener getOnMeizhiTouchListener() { return (v, meizhiView, card, meizhi) -> { if (meizhi == null) return; if (v == meizhiView && !mMeizhiBeTouched) { //使用标志位mMeizhiBeTouched过滤重复点击 mMeizhiBeTouched = true; //利用Picasso预加载图片 Picasso.with(this).load(meizhi.url).fetch(new Callback() { @Override public void onSuccess() { //如果预加载成功就跳转展示图片 mMeizhiBeTouched = false; startPictureActivity(meizhi, meizhiView); } @Override public void onError() {mMeizhiBeTouched = false;} }); } else if (v == card) { //如果是item被点击 startGankActivity(meizhi.publishedAt); } };}
查看MeizhiListAdapter的相关代码
找到调用mOnMeizhiTouchListener的地方.
class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { @Bind(R.id.iv_meizhi) RatioImageView meizhiView; //显示妹子图片的View @Bind(R.id.tv_title) TextView titleView; View card; //即Item Meizhi meizhi; //封装的妹子图片对象 public ViewHolder(View itemView) { super(itemView); card = itemView; ButterKnife.bind(this, itemView); meizhiView.setOnClickListener(this); //妹子图片设置点击事件 card.setOnClickListener(this); //itemView设置点击事件 meizhiView.setOriginalSize(50, 50); } @Override public void onClick(View v) { mOnMeizhiTouchListener.onTouch(v, meizhiView, card, meizhi); }}
这里让ViewHolder实现点击事件. 让itemView和妹子图片的点击共用一个监听器.
这样做的好处就是方便,简单.
但是ViewHolder以组合方式持有了MeiZhi这个对象的引用,不晓得恰不恰当.
另外,代码中使用了Picasso的预加载功能, 如果能成功加载就打开图片浏览页面,不能则放弃打开. 这样的体验也不错.
转场动画
开启图片浏览的Activity这里有个转场动画.使用的是ActivityOptionsCompat.makeSceneTransitionAnimation(),
平滑的将一个控件平移的过渡到第二个activity.
private void startPictureActivity(Meizhi meizhi, View transitView) { Intent intent = PictureActivity.newIntent(MainActivity.this, meizhi.url, meizhi.desc); //这种在PictureActivity中写newIntent的方式并推荐 ActivityOptionsCompat optionsCompat = ActivityOptionsCompat.makeSceneTransitionAnimation( MainActivity.this, transitView, PictureActivity.TRANSIT_PIC); //转场动画,PictureActivity.TRANSIT_PIC这个name很重要 try { ActivityCompat.startActivity(MainActivity.this, intent, optionsCompat.toBundle()); } catch (IllegalArgumentException e) { e.printStackTrace(); startActivity(intent); }}
在PictureAcitity的onCreate()中调用了
ViewCompat.setTransitionName(mImageView, TRANSIT_PIC);
要使用这个方法就必须给两个不同Activity的中的布局元素设定同样的一个android:transitionName,然后还需要一个标志来告诉Window执行动画,因为这个只是在5.x上有效.
标志:
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
也可以参考文章:
http://blog.csdn.net/a396901990/article/details/40187203
http://blog.jobbole.com/77015/
http://blog.csdn.net/u013268154/article/details/50855026
0 0
- [开源学习_MeiZhi]一个itemView中多个点击事件的实现
- [开源学习_MeiZhi]使用config.gradle统一管理项目的依赖库
- RecyclerView的itemView的点击效果
- [开源学习_MeiZhi]首次进入App执行某操作,第二次进入则不再执行
- [开源学习_MeiZhi]RecyclerView滚动到底部自动加载下一页
- 一个adapter实现多个itemView
- 点击itemView选中checkbox
- RecyClerView 的一个点击事件
- 纯js实现点击一个事件后,触发另外一个事件的方法
- 纯js实现点击一个事件后,触发另外一个事件的方法
- 学习GestureDetector中的点击事件的实现方式
- Android点击事件的实现
- Android点击事件的实现
- Canvas---Canvas事件处理、Canvas元素的鼠标点击事件处理、实现一个元素管理器
- ListView 显示多种itemView布局的简单实现
- 封装一个UIImageView的点击事件
- 设置一个组件的点击事件
- android 中实现列表中多个控件的点击事件
- 基于ViewGroup实现自动换行标签控件
- 交叉编译openssl不修改Makefile的方法
- Electron-引导
- viewpager实现图片轮番(本地图片)
- Testing with Xcode》第四章——Running Tests and Viewing Results
- [开源学习_MeiZhi]一个itemView中多个点击事件的实现
- Android —— TextView中的MaxLines和ellipsize属性的冲突
- leetcode_c++:Longest Valid Parentheses(032)
- Windows下文件复制到Linux系统
- c语言学习笔记
- 最流行的Android组件、工具、框架大全
- HDU 1079 Calendar Game (奇偶规律,SG函数)*
- HDU1017——A Mathematical Curiosity
- 6.shell编程(6) --- 特殊文件