如何在安卓设备上创建放大镜

3


大家好!
我正在尝试实现一个放大镜。 它应该使其下方的内容看起来更大。

经过几个小时的努力,我只有一个解决方案。

在我的xml文件中,声明类似于以下内容(伪代码):

<ZoomView>
    some other content views

    <View 
        android:id="@+id/magnifier
    />
</ZoomView>

在这段代码中,ZoomView是一个自定义视图,继承自RelativeLayout。具有放大镜id的视图是实际的放大镜,将放大内容。
它的外观如下:


magnifier

那么在代码中会发生什么。

在ZoomView的onDraw方法中,我做了这些事情。

@Override
protected void onDraw(android.graphics.Canvas canvas)
{
    Bitmap  bitmap = Bitmap.createBitmap(canvas.getWidth(), canvas.getHeight(), Bitmap.Config.ARGB_8888);
    Canvas bitmapCanvas = new Canvas(bitmap);
    super.onDraw(bitmapCanvas);

    // some code that detects magnifier view position and size, 
    // than gets 1 area image, scale it to make in 2x bigger.
    // And then replace 2 area with this scaled image.

    // draw result on canvas
    canvas.drawBitmap(bitmap, new Matrix(), null);
}

这段代码可以正常工作,但速度太慢了。有没有人能给我提供其他解决方案或者如何优化这个代码?抱歉如果有什么问题,这是我的第一个问题。

太神奇了!没有回答或评论,只有5个负分。或许有人能告诉我错在哪里? - mig35
2
FYI,有三个问题需要解决... 1. 你的问题非常宽泛,有很多要求(应该适用于所有内容,包括文本,并且可移动等...)。 2. 你没有提供任何想法或可能性(所以我们不知道你是否首先尝试了这个问题)。 3. StackOverflow不是一个让人们为你编写代码的地方,也不是一个提出一般性问题的地方。 - wattostudios
谢谢。我会修改我的帖子。 - mig35
2个回答

1
你的方向是正确的,但我认为可以通过将一些处理过程从onDraw方法中移出来来提高性能。如果原始大小的图像/内容是静态的,你可以在onCreate(或更好的是,在AsyncTask中)轻松创建放大版本的内容,然后当移动放大镜时,你只需要计算应该显示放大版本的哪个区域的内容,而不是每次都尝试生成它。
如果内容是动态的,你仍然可以通过拥有2个常量副本的内容来执行类似的处理,一个是正常大小,一个是放大的,并且两者都保持最新状态。
除此之外,你的解决方案是正确的。希望这可以帮到你。

谢谢你的回答。我会尝试做这个。稍后我会发布结果。 - mig35

0

我不知道你是否需要这个,但其他人可能需要。

View view = findViewById(R.id.view);
Magnifier magnifier = new Magnifier(view);
magnifier.show(view.getWidth() / 2, view.getHeight() / 2);

如果你想要用户交互,那么可以尝试这个方法:
imageView.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        switch (event.getActionMasked()) {
            case MotionEvent.ACTION_DOWN:
                // Fall through.
            case MotionEvent.ACTION_MOVE: {
                final int[] viewPosition = new int[2];
                v.getLocationOnScreen(viewPosition);
                magnifier.show(event.getRawX() - viewPosition[0],
                               event.getRawY() - viewPosition[1]);
                break;
            }
            case MotionEvent.ACTION_CANCEL:
                // Fall through.
            case MotionEvent.ACTION_UP: {
                magnifier.dismiss();
            }
        }
        return true;
    }
})

使用这个放大镜,你可以放大你想要的视图。
FYI - https://developer.android.com/guide/topics/text/magnifier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接