【问题标题】:How to listen for clicks on drawn images in Html.ImageGetter class如何在 Html.ImageGetter 类中侦听对绘制图像的点击
【发布时间】:2016-10-20 05:32:00
【问题描述】:

我有一个 Html.ImageGetter 类,我正在使用通用图像加载器来加载 标签中的图像,该标签包含在我在线获取的 html json 文件中。

图片加载正常,但在较小的设备上,图片会缩小以匹配设备的宽度,因此有些图片太小而看不到内容。

我的目的是在图像上设置一个点击监听器并显示一个缩放对话框,用户可以在其中看到图像的完整尺寸。目前,我发现很难听到点击。

这是我的 ImageGetter 类

public class UILImageGetter implements Html.ImageGetter{
    Context c;
    TextView container;
    UrlImageDownloader urlDrawable;


    public UILImageGetter(View textView, Context context) {
        this.c = context;
        this.container = (TextView) textView;
    }

    @Override
    public Drawable getDrawable(String source) {

        urlDrawable = new UrlImageDownloader(c.getResources(), source);

        if (Build.VERSION.SDK_INT >= 21) {
        urlDrawable.mDrawable = c.getResources().getDrawable(R.drawable.default_thumb,null);
        } else {
            urlDrawable.mDrawable = c.getResources().getDrawable(R.drawable.default_thumb);
        }
        ImageLoader.getInstance().loadImage(source, new SimpleListener(urlDrawable));
        return urlDrawable;
    }

    private class SimpleListener extends SimpleImageLoadingListener {
        UrlImageDownloader mUrlImageDownloader;


        public SimpleListener(UrlImageDownloader downloader) {
            super();
            mUrlImageDownloader= downloader;
        }

        @Override
        public void onLoadingStarted(String imageUri, View view) {
            Log.d("DEBUG", "onLoadingStarted called");
            //spinner.setVisibility(View.VISIBLE);

        }

        @Override
        public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
            //spinner.setVisibility(View.GONE);

            int width = loadedImage.getWidth();
            int height = loadedImage.getHeight();

            int newWidth = width;
            int newHeight = height;

            if (width > container.getWidth()) {
                newWidth = container.getWidth();
                newHeight = (newWidth * height) / width;
            }

            if (view != null) {
                container.getLayoutParams().width = newWidth;
                container.getLayoutParams().height = newHeight;
            }

            Drawable result = new BitmapDrawable(c.getResources(), loadedImage);
            result.setBounds(0, 0, newWidth, newHeight);

            mUrlImageDownloader.setBounds(1, 1, newWidth, newHeight);
            mUrlImageDownloader.mDrawable = result;
            container.invalidate();

            container.setText(container.getText());

            if (view != null) {
                //Don't know if this is the right place to listener for clicks but it ain't working
                view.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Log.d("TheImage", "Image Clicked");
                    }
                });
            }

        }

        @Override
        public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
            String message = null;
            switch (failReason.getType()) {
                case IO_ERROR:
                    message = "Input/Output error";
                    break;
                case DECODING_ERROR:
                    message = "Image can't be decoded";
                    break;
                case NETWORK_DENIED:
                    message = "Downloads are denied";
                    break;
                case OUT_OF_MEMORY:
                    message = "Out Of Memory error";
                    break;
                case UNKNOWN:
                    message = "Unknown error";
                    break;
            }


//            Toast.makeText(view.getContext(), message, Toast.LENGTH_SHORT).show();
            Log.w("UILImageGetter", message);

            //spinner.setVisibility(View.GONE);
        }



    }

    private class UrlImageDownloader extends BitmapDrawable {
        public  Drawable mDrawable;

        public UrlImageDownloader(Resources resources, String filepath) {
            super(resources, filepath);
            mDrawable = new BitmapDrawable(resources, filepath);
        }

        @Override
        public void draw(Canvas canvas) {
            if (mDrawable != null) {
                mDrawable.draw(canvas);
            }
        }
    }
}

拜托,你能帮帮我吗?

【问题讨论】:

    标签: android universal-image-loader


    【解决方案1】:

    图像本身不可点击,但您可以将它们包装在自定义 URLSpans 中并监听来自这些 URLSpans 的点击,然后运行您的操作。

    使用 Html.fromHtml(...) 解析 HTML 并执行以下操作:

    Spannable html = (Spannable) Html.fromHtml(...);
    for (ImageSpan span : html.getSpans(0, html.length(), ImageSpan.class)) {
        int flags = html.getSpanFlags(span);
        int start = html.getSpanStart(span);
        int end = html.getSpanEnd(span);
        
        html.setSpan(new URLSpan(span.getSource()) {
            @Override public void onClick(View v) {
                /* handle click here */
            }
        }, start, end, flags);
    }
    textView.setText(html);
    textView.setMovementMethod(LinkMovementMethod.getInstance());
    

    【讨论】:

    • 谢谢,这已经解决了。
    猜你喜欢
    • 1970-01-01
    • 2013-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多