[开源学习_MeiZhi]一个itemView中多个点击事件的实现

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

http://blog.jobbole.com/77015/

http://blog.csdn.net/u013268154/article/details/50855026

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值