android - 触摸模糊。安卓应用

标签 android blur

我正在尝试制作一个应用程序,其中用户在 Android 应用程序上触摸的图像部分变得模糊。

要求就像,我应该能够拍一张照片,然后用手指滑过我需要模糊的点。有什么简单的方法吗?我能以某种方式使用不透明的透明涂料来完成它吗?

谢谢

最佳答案

似乎应该使用 RenderScript 解决问题.但是,好像只支持位图模糊,所以我们可能需要在模糊之前切割位图。引用this answer关于快速图像模糊,我能够在 Nexus 10 平板电脑上取得令人惊讶的出色性能。

代码如下(注意是草稿版本,我只玩了30分钟):

public class BlurTouchImageView extends View {
    private static final int BLUR_RADIUS = 20;
    // TODO: resources should be used
    private static final int BLUR_SIDE = 300;

    private RenderScript mBlurScript = null;
    private ScriptIntrinsicBlur mIntrinsicScript = null;
    private Bitmap mBitmap = null;
    private Bitmap mBlurredBitmap = null;
    private float mX = -1;
    private float mY = -1;

    public BlurTouchImageView(final Context context) {
        super(context);
        init();
    }

    public BlurTouchImageView(final Context context, final AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public BlurTouchImageView(final Context context, final AttributeSet attrs, final int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

    /**
     * Inits our view internal members
     */
    private void init() {
        mBlurScript = RenderScript.create(getContext());
        mIntrinsicScript = ScriptIntrinsicBlur.create(mBlurScript, Element.U8_4(mBlurScript));
        mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.gimg);
        mBlurredBitmap = Bitmap.createBitmap(BLUR_SIDE, BLUR_SIDE, mBitmap.getConfig());
    }

    @Override
    public boolean onTouchEvent(final MotionEvent event) {
        boolean retval = false;

        mX = event.getX();
        mY = event.getY();

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
            case MotionEvent.ACTION_MOVE:
                retval = true;
                invalidate();
                break;

            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_CANCEL:
                mX = -1;
                mY = - 1;
                retval = true;
                invalidate();
                break;

            default:
                // nothing to do here
                break;
        }

        return retval;
    }

    @Override
    protected void onDraw(final Canvas canvas) {
        // Blur bitmap if it's touched

        canvas.drawBitmap(mBitmap, 0, 0, null);

        if (mX > 0 && mY > 0) {
            // Yeah, it will slooow down drawing, but how else we can prepare needed part of bitmap?
            final Bitmap blurSource = Bitmap.createBitmap(mBitmap, (int) mX - BLUR_SIDE / 2, (int) mY - BLUR_SIDE / 2, BLUR_SIDE, BLUR_SIDE);

            final Allocation inAlloc = Allocation.createFromBitmap(mBlurScript, blurSource, Allocation.MipmapControl.MIPMAP_NONE, Allocation.USAGE_GRAPHICS_TEXTURE);
            final Allocation outAlloc = Allocation.createFromBitmap(mBlurScript, mBlurredBitmap);

            mIntrinsicScript.setRadius(BLUR_RADIUS);
            mIntrinsicScript.setInput(inAlloc);
            mIntrinsicScript.forEach(outAlloc);
            outAlloc.copyTo(mBlurredBitmap);

            canvas.drawBitmap(mBlurredBitmap, (int)mX - BLUR_SIDE / 2, (int)mY - BLUR_SIDE / 2, null);
        }
    }
}

结果是:

blur example

虽然我担心在 onDraw 中创建 Bitmap 会导致很大的延迟,但在只有这个 View 模糊区域的 Activity 中移动非常顺利。

关于android - 触摸模糊。安卓应用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18188079/

相关文章:

html - 悬停时模糊叠加展开

android - 如何使 Listview Scroll 变慢?

android - 如何在自己的服务器上配置WebRTC?

android - 如何获取屏幕尺寸并响应它?

css - 使用背景过滤器 : blur 时无法去除滚动时的模糊边缘

android - 如何在 Instagram 应用程序上实现 View (不在图像上)的模糊/霜/纤维背景效果

IE 11 中的 CSS 模糊

android - 如何在Android中使用ImageJ?

Android 在应用程序的任何 Activity 中显示来自后台线程的对话框

java - RenderScript 模糊覆盖原始位图