[开源学习_MeiZhi]一个itemView中多个点击事件的实现
源码片段来源: drakeet的MeiZhi 项目. https://github.com/drakeet/Meizhi
这里的item的点击分为 妹子图片的点击(红色区域)和itemView(蓝色区域)的点击.
实现代码
mMeizhiListAdapter.setOnMeizhiTouchListener(getOnMeizhiTouchListener()); //添加点击事件
//区分点击妹子图片和点击itemView
private 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