iielse / imageviewer

A simple and customizable Android full-screen image viewer 一个简单且可自定义的Android全屏图像浏览器
MIT License
2.23k stars 310 forks source link

自定义 IndexProvider 中 点击事件不触发 #39

Closed Sforllln closed 4 years ago

Sforllln commented 6 years ago

` new ImageWatcher.IndexProvider() { private View view;

                @Override
                public View initialView(Context context) {
                    FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT,
                            MyUtils.dip2px(context, 40));//
                    lp.gravity = Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL;
                    view = LayoutInflater.from(context).inflate(R.layout.image_index, null);
                    view.setLayoutParams(lp);
                    return view;
                }

                @Override
                public void onPageChanged(final ImageWatcher imageWatcher, int position, List<Uri> list) {
                    TextView textIndex = view.findViewById(R.id.tv_index);
                    TextView tvShare = view.findViewById(R.id.tv_share);
                    textIndex.setText(String.format("%s/%s", position + 1, list.size()));
                    tvShare.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            ToastUtils.show("分享");
                        }
                    };`
Sforllln commented 6 years ago

能否指点一下 @iielse

iielse commented 6 years ago

兄弟,你这个问题很好啊。

为什么点击事件无效: 因为 indexProvider 在ImageWatcher 这个 ViewGroup 上。 我在 onInterceptTouchEvent 的时候返回了 true。 所以 事件传不过去,已经耗掉了。

我当时没考虑考虑给IndexProvider提供点击事件: 设计 IndexProvider 的 主要目的正如其名字, 只是为了 “索引”这个功能。

稍等啊。

Sforllln commented 6 years ago

了解 可以考虑为这个 "索引" View 保留一下点击事件

iielse commented 6 years ago

我正在改这里,

iielse commented 6 years ago

改好了, /doge

iielse commented 6 years ago

这里看你代码是想分享吧? 可以考虑实现图片长按回调。 然后在底部弹出框, 上面带一个分享按钮这样

iielse commented 6 years ago

你看下 demo1 里面那种图片长按后的方式可以吗

Sforllln commented 6 years ago

好的 谢谢你 就用长按实现吧 ,昨天太忙了 没有回复你

iielse commented 6 years ago

没有 主要还是我太菜了

Sforllln commented 6 years ago

我也尝试 down下来改过 没搞定 -,-

iielse commented 6 years ago

我搞了,上一次提交ok的。但是别的功能挂了。所以放弃了。反正显示隐藏,滑动位置的回调都给出去了,你可以在 ImageWatcher的上面放View这样就不会截掉你的事件了

Sforllln commented 6 years ago

主要还是我太菜 - -, 其实长按也挺好的,但是加个View 可以做更多的事

Sforllln commented 6 years ago

感觉还有一点可以优化 就是View 在拖动的时候 把 IndexProvider 这个View 隐藏掉

1nC0deWeTrust commented 5 years ago

我这边需要在 ViewPager 下加个横向列表预览,老哥你说这 IndexProvider 的事件该怎么加才好。。 @iielse

iielse commented 5 years ago

看下demo2 otherView

1nC0deWeTrust commented 5 years ago

是的,后面我也是参考你的 appendOtherView() 做的修改,根据 StateChange 监听来在 activityDecorView 上添加移除,一开始从 demo4 跟进去的,看到都没有调用 setOtherView(),就把下面的 appendOtherView() 给忽略了。

Sforllln commented 5 years ago

老哥 666

iielse commented 4 years ago

感觉还有一点可以优化 就是View 在拖动的时候 把 IndexProvider 这个View 隐藏掉 我这边需要在 ViewPager 下加个横向列表预览,老哥你说这 IndexProvider 的事件该怎么加才好

interface OverlayCustomizer {
    fun provideView(parent: ViewGroup): View? = null
}
open class ViewerCallbackAdapter : ImageViewerAdapterListener {
    override fun onInit(viewHolder: RecyclerView.ViewHolder) {}
    override fun onDrag(viewHolder: RecyclerView.ViewHolder, view: View, fraction: Float) {}
    override fun onRestore(viewHolder: RecyclerView.ViewHolder, view: View, fraction: Float) {}
    override fun onRelease(viewHolder: RecyclerView.ViewHolder, view: View) {}
    open fun onPageScrollStateChanged(state: Int) {}
    open fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {}
    open fun onPageSelected(position: Int) {}
}

新增了以上的接口 那个view的拖动的进度可以监听 ViewerCallbackAdapter onDrag回调的fraction的值. 0-1 onRelease 和 onRestore 分别表示下拽松手页面还原或者关闭的回调 viewPager 滑动的回调也暴露出来了。 横向列表阅览可以关联滑动. 可以通过调用 ImageViewerActionViewModel setCurrentItem 切换当前项