zoukankan      html  css  js  c++  java
  • 为Textview里面的ImageSpan添加点击响应事件

    对于图文混排的TextView,用户在浏览到里面的图片的时候,往往有点击图片preview大图或者preview之后保存图片的需求,这就需要为Textview里面的ImageSpan设置点击响应事件。

    由于ImageSpan本身无法实现点击响应,我们首先想到的是为Textview设置textview.setMovementMethod(LinkMovementMethod.getInstance());

    然后再写一个类继承自LinkMovementMethod并重写onTouchEvent方法,在这个方法里面处理图片的点击事件,但是在实际操作过程中发现,这样设置之后Textview的ImageSpan仍然

    无法获取到点击事件。

    经过一番摸索之后,发现对Textview直接设置OnTouchListener,在OnTouchListener里面添加ImageSpan的onClick处理即可实现图片的点击响应处理,代码如下:

    mTextView.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    CharSequence text = ((TextView)v).getText();
                    Spannable sText = Spannable.Factory.getInstance().newSpannable(text);
                    TextView widget = (TextView) v;
    
                    int action = event.getAction();
                    if (action == MotionEvent.ACTION_UP ||
                            action == MotionEvent.ACTION_DOWN) {
                        int x = (int) event.getX();
                        int y = (int) event.getY();
    
                        x -= widget.getTotalPaddingLeft();
                        y -= widget.getTotalPaddingTop();
    
                        x += widget.getScrollX();
                        y += widget.getScrollY();
    
                        Layout layout = widget.getLayout();
                        int line = layout.getLineForVertical(y);
                        int off = layout.getOffsetForHorizontal(line, x);
    
                        FileImageSpan[] imageSpans = sText.getSpans(off, off, FileImageSpan.class);
                        if (imageSpans.length != 0) {
                            if (action == MotionEvent.ACTION_UP) {
                                imageSpans[0].onClick(widget);
                            }
                            return true;
                        }
                    }
                    return false;
                }
            });
    

     最关键的部分是第24行和27行,24行里面的FileImageSpan就是你需要设置点击响应事件的ImageSpan,可以在这个类里面加入

    public void onClick(View view) {

    }
    里面的实现就是你点击这个图片之后希望做的处理,根据需求添加。

    然后在第27行拿到这个ImageSpan的实例回调到onClick即可。
  • 相关阅读:
    如何一键部署项目&&代码自动更新
    Node服务端极速搭建 - nvmhome
    Node服务端极速搭建 -- nvmhome
    自动生成了一本ES6的书
    在linux中给你的应用做压力测试
    .NET 跨平台服务端资料
    CabArc to create or extract a cab file
    (转)什么时候要抛出异常?
    Sprint评审会议不是Sprint演示会议
    Sprint回顾大揭秘——“宝典”来了
  • 原文地址:https://www.cnblogs.com/wuqinghua/p/6283842.html
Copyright © 2011-2022 走看看