3


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

几个小时后,我只有一个解决方案。

在我的 xml 文件中,声明如下内容(伪代码):

<ZoomView>
    some other content views

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

在这段代码中,ZoomView 是一个自定义视图扩展了 RelativeLayout。View with magnifier id 是一个实际的放大镜,可以放大内容。

这是它的样子:


放大镜

那么代码中会发生什么。

在 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);
}

这段代码运行良好,但速度太慢。谁能给我其他解决方案,或者我该如何优化这个解决方案?

抱歉,如果有问题,这是我的第一个问题。

4

2 回答 2

1

您走在正确的轨道上,但我认为可以通过从 onDraw 方法中提取一些处理来提高性能。如果原始大小的图像/内容是静态的,您可以在 onCreate 期间轻松创建内容的放大版本(或者更好的是,在 AsyncTask 中),然后当放大镜移动时,您所要做的就是计算内容的哪个区域应该显示放大版本,而不是每次都尝试生成它。

如果内容是动态的,您仍然可以通过拥有 2 个内容的恒定副本来执行类似的处理,一个是正常大小,一个是放大的,并且两者都不断保持最新。

否则,您的解决方案就在正确的轨道上。我希望这有帮助。

于 2012-05-06T23:50:16.617 回答
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;
    }
})

使用此放大镜,您可以放大您想要的视图。

仅供参考 - https://developer.android.com/guide/topics/text/magnifier

于 2021-07-07T05:54:06.250 回答