[开源学习_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