各位大家好!
我正在尝试实现放大镜。
它应该使它下面的内容看起来更大。
几个小时后我只有一个解决方案。
在我的xml文件中,声明类似这样的内容(伪代码):
<ZoomView>
some other content views
<View
android:id="@+id/magnifier
/>
</ZoomView>
在此代码中,ZoomView是一个自定义视图,扩展了RelativeLayout。带放大镜ID的视图是一个缩放内容的实际放大镜。
这就是它的样子:
magnifier http://s019.radikal.ru/i611/1205/db/b1e170626539.png
那么代码会发生什么。
在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);
}
此代码工作正常,但速度太慢。任何人都可以给我一个其他的解决方案,或者我该如何优化这个?
对不起,如果出现问题,这是我的第一个问题。
答案 0 :(得分:1)
你走在正确的轨道上,但我认为通过对onDraw方法进行一些处理可以提高性能。如果原始大小的图像/内容是静态的,您可以在onCreate期间轻松创建内容的放大版本(或者更好的是,在AsyncTask中),然后当移动放大镜时,您所要做的就是计算内容的哪个区域应该显示放大的版本,而不是每次都尝试生成它。
如果内容是动态的,您仍然可以通过内容的2个常量副本执行类似的处理,一个是正常大小的,一个是放大的,并且两者都不断更新。
您的解决方案正处于正确的轨道上。我希望这会有所帮助。
答案 1 :(得分: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